{"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-introduktion-moderne-kerneanalyse-linux-ebpf-observabilitet-sporing-kerne","status":"publish","type":"post","link":"https:\/\/webhosting.de\/da\/bpftool-einstieg-moderne-kernelanalyse-linux-ebpf-observability-tracing-core\/","title":{"rendered":"bpftool \u2013 En introduktion til moderne kerneanalyse med eBPF"},"content":{"rendered":"<p>Jeg viser dig, hvordan du arbejder med <strong>bpftool<\/strong> kan unders\u00f8ge k\u00f8rende Linux-systemer m\u00e5lrettet, styre eBPF-programmer og samtidig indhente meningsfuld telemetri uden at skulle genkompilere kernen. Artiklen guider dig trin for trin gennem installation, centrale begreber, typiske anvendelser og nyttige rutiner, s\u00e5 du <strong>Kerneanalyse<\/strong> anvender sikkert i drift og udvikling.<\/p>\n\n<h2>Centrale punkter<\/h2>\n\n<p>Til at begynde med vil jeg sammenfatte de vigtigste aspekter, s\u00e5 du kan s\u00e6tte de f\u00f8lgende kapitler i den rette sammenh\u00e6ng og <strong>Prioriteringer<\/strong> kan inds\u00e6tte.<\/p>\n<ul>\n  <li><strong>N\u00e6rhed til kernen<\/strong>: Direkte adgang til eBPF-programmer, maps og statistikker<\/li>\n  <li><strong>Gennemsigtighed<\/strong>: Verifier-logfiler, bytecode og JIT-dumps til fejlfinding<\/li>\n  <li><strong>klar til produktion<\/strong>: JSON-udskrifter, scriptbarhed, reproducerbare processer<\/li>\n  <li><strong>Bredde<\/strong>: Netv\u00e6rk, systemkald, scheduler, cgroups, perf_events<\/li>\n  <li><strong>\u00d8kosystem<\/strong>: Udvider avancerede v\u00e6rkt\u00f8jer som BCC og bpftrace<\/li>\n<\/ul>\n<p>Jeg bruger de n\u00e6vnte punkter til at vise praktiske trin og <strong>Beslutninger<\/strong> at g\u00f8re det lettere. P\u00e5 den m\u00e5de kan du hurtigt se, hvor bpftool giver en direkte fordel, og hvor andre v\u00e6rkt\u00f8jer passer bedre. Listen fungerer som en vejledning til eksemplerne i de f\u00f8lgende kapitler og holder fokus p\u00e5 <strong>M\u00e5lbarhed<\/strong>. Hold \u00f8je med dit m\u00e5lsystem, mens du l\u00e6ser, for konfigurationen og kerneversionen bestemmer mulighederne. Jo tydeligere du formulerer dit form\u00e5l, desto hurtigere leverer eBPF og bpftool <strong>Signal<\/strong> i stedet for st\u00f8j.<\/p>\n\n<h2>eBPF som et sikkert k\u00f8rselsmilj\u00f8 i kernen<\/h2>\n\n<p>eBPF sikrer en sikker k\u00f8rsel i <strong>Kernen<\/strong> der knytter de sm\u00e5 programmer til definerede begivenheder og foretager en grundig kontrol, inden de udf\u00f8res. Verifikatoren forhindrer u\u00f8nskede hukommelsesadgange og l\u00f8kker, hvilket sikrer, at systemerne forbliver kontrollerbare og <strong>driftsklar<\/strong>. Jeg knytter programmer til Kprobes, Tracepoints, XDP eller cgroups og f\u00e5r pr\u00e6cise kontekstdata. Denne t\u00e6thed leverer m\u00e5lev\u00e6rdier uden dyre syscall-overgange og uden at skulle kompilere moduler. P\u00e5 den m\u00e5de opst\u00e5r der et fleksibelt telemetrilag, som jeg kan bruge sammen med <strong>bpftool<\/strong> g\u00f8re synlig, testbar og styrbar.<\/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>Installation og krav<\/h2>\n\n<p>Jeg tjekker f\u00f8rst kerneversionen og funktionerne, for mange funktioner kommer f\u00f8rst til udtryk fra <strong>5.x<\/strong> fuldst\u00e6ndigt. P\u00e5 distributioner installerer jeg bpftool som en pakke eller kompilerer det fra kernelskildekoden under tools\/bpf\/bpftool, afh\u00e6ngigt af systemets vedligeholdelsesstatus. Til kompileringen har jeg brug for Clang\/LLVM, libelf, make samt de relevante header-filer, s\u00e5 v\u00e6rkt\u00f8jsk\u00e6den passer til kernen <strong>passer<\/strong>. Efter installationen tjekker jeg med \u201cbpftool version\u201d, om funktionen er tilg\u00e6ngelig, og sammenligner den med mine krav. Hvis kernelfunktionerne stemmer overens, k\u00f8rer jeg test p\u00e5 et separat system, inden jeg g\u00e5r videre til produktive v\u00e6rter <strong>f\u00f8lge<\/strong>.<\/p>\n\n<h2>bpffs og Pinning: Et overblik over objektets livscyklus<\/h2>\n\n<p>For at sikre reproducerbare processer monterer jeg f\u00f8rst BPF-filsystemet under \u201c\/sys\/fs\/bpf\u201d. Hvis det mangler, opretter jeg det med \u201cmount -t bpf bpf \/sys\/fs\/bpf\u201d og tjekker navnerum, hvis der er containere involveret. Derefter fastg\u00f8r jeg indl\u00e6ste objekter til stabile stier, for eksempel \u201cbpftool prog pin id X \/sys\/fs\/bpf\/myapp\/xdp_ingress\u201d eller \u201cbpftool map pin id M \/sys\/fs\/bpf\/myapp\/counters\u201d. P\u00e5 den m\u00e5de overlever programmer, links og maps procesgenstarter, forbliver tilg\u00e6ngelige og er entydige <strong>adresserbar<\/strong>.<\/p>\n<p>Jeg strukturerer pinning-hierarkiet efter service, hook og version, f.eks. \u201c\/sys\/fs\/bpf\/\u00ab<em>tjeneste<\/em>\/<em>hook<\/em>\/<em>version<\/em>\u201d. Det g\u00f8r det nemmere at foretage rollbacks og side-by-side-tests. N\u00e5r det g\u00e6lder vedh\u00e6ftede filer, foretr\u00e6kker jeg link-metoden: \u201cbpftool link list\u201d viser mig stabile h\u00e5ndtag, \u201cbpftool link pin id L \/sys\/fs\/bpf\/myapp\/link_xdp\u201d fastl\u00e6gger linket. N\u00e5r jeg rydder op, fjerner jeg f\u00f8rst pins (rm), hvorefter objekterne frigives. P\u00e5 den m\u00e5de undg\u00e5r jeg <strong>For\u00e6ldrel\u00f8se<\/strong>-Programmer, der k\u00f8rer videre uden at man l\u00e6gger m\u00e6rke til det.<\/p>\n\n<h2>Centrale underkommandoer og koncepter<\/h2>\n\n<p>bpftool inddeler kommandoer efter objekttyper som f.eks. <strong>prog<\/strong>, map, cgroup eller feature, hvilket g\u00f8r det muligt at strukturere arbejdsgange logisk. Jeg bruger \u201cprog list\u201d og \u201cprog show\u201d til at f\u00e5 et overblik, \u201cdump xlated\/jited\u201d til dybdeg\u00e5ende indsigt og \u201cmap dump\/lookup\u201d til dataflow-analyser. Underkommandoen \u201cfeature\u201d viser de aktiverede hj\u00e6lper- og korttyper, hvilket forhindrer senere fejl. JSON-udskrifter letter automatiseringen i CI\/CD og konfigurationsstyring. F\u00f8lgende tabel opsummerer typiske opgaver og eksempler <strong>kompakt<\/strong> sammen.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Objekt<\/th>\n      <th>Opgave<\/th>\n      <th>Eksempel<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>prog<\/td>\n      <td>Oversigt over og beskrivelse af programmer<\/td>\n      <td>bpftool prog list | bpftool prog show id X<\/td>\n    <\/tr>\n    <tr>\n      <td>prog<\/td>\n      <td>Se 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>Indl\u00e6sning og vedh\u00e6ftning<\/td>\n      <td>bpftool prog load file.o \/sys\/fs\/bpf\/p &amp;&amp; \u2026 attach<\/td>\n    <\/tr>\n    <tr>\n      <td>kort<\/td>\n      <td>Kontroller indhold og n\u00f8gler<\/td>\n      <td>bpftool map dump id M | map lookup id M key HEX<\/td>\n    <\/tr>\n    <tr>\n      <td>funktion<\/td>\n      <td>Vis kernefunktioner<\/td>\n      <td>bpftool-funktion: probe<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>BTF, CO-RE og Skeletons i hverdagen<\/h2>\n\n<p>Jeg s\u00f8rger for, at BTF er tilg\u00e6ngeligt i kernen, da det muligg\u00f8r CO-RE (Compile Once \u2013 Run Everywhere) og brugervenlige fejlfindingsudskrifter. Med \u201cbpftool feature probe\u201d kan jeg se, om BTF er aktivt, og om n\u00f8dvendigt gennemg\u00e5 typeoplysningerne med \u201cbpftool btf dump file \/sys\/kernel\/btf\/vmlinux\u201d. Til udviklingsform\u00e5l genererer jeg en passende header-fil ud fra kerneltypene ved hj\u00e6lp af \u201cbpftool gen vmlinux\u201d, hvilket giver mig mulighed for sikkert at henvise til strukturer. Dette reducerer antallet af brudsteder ved kerneopdateringer betydeligt.<\/p>\n<p>N\u00e5r det g\u00e6lder pakning, foretr\u00e6kker jeg at bruge skeletter: \u201cbpftool gen skeleton obj.o\u201d genererer en C-wrapper, der indkapsler indl\u00e6sning, tilf\u00f8jelse, map-adgang og oprydning. P\u00e5 den m\u00e5de bliver min glue-kode kortere, og jeg holder interaktionen mellem brugerrummet og eBPF-programmet <strong>robust<\/strong>. CO-RE hj\u00e6lper mig med at bruge de samme artefakter p\u00e5 forskellige kerner, s\u00e5 l\u00e6nge hj\u00e6lperne og hooks er tilg\u00e6ngelige \u2013 det tjekker jeg tidligt med \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>Pr\u00e6stationsanalyse med bpftool<\/h2>\n\n<p>N\u00e5r det g\u00e6lder ydeevne, bruger jeg bpftool til at t\u00e6lle <strong>Opfordringer<\/strong> af de enkelte programmer, m\u00e5ler k\u00f8rselstiderne og sammenligner dem med spidsbelastninger. P\u00e5 den m\u00e5de kan jeg se, hvilke spor der k\u00f8rer p\u00e5 fuld dr\u00f8n, eller om et XDP-filter binder for meget CPU-kapacitet p\u00e5 travle stier. Derefter vurderer jeg, om sampling eller sn\u00e6vrere filtre er mere logiske. Ved afvigelser ser jeg p\u00e5 JIT-dumps for at forst\u00e5 kodestier og undg\u00e5 un\u00f8dvendige instruktioner. Til sidst indg\u00e5r tallene i dashboards, s\u00e5 operat\u00f8rerne kan opn\u00e5 vedvarende <strong>Gennemsigtighed<\/strong> beholde.<\/p>\n\n<h2>T\u00e6llingsv\u00e6rdier, kort pr. CPU og statistikker<\/h2>\n\n<p>Jeg analyserer \u201cbpftool prog show id X\u201d for at kontrollere \u201crun_time_ns\u201d og \u201crun_cnt\u201d. Forholdet mellem disse v\u00e6rdier viser mig de gennemsnitlige k\u00f8retider, mens jeg fortolker afvigelser ved hj\u00e6lp af arbejdsbyrdemetrikker. N\u00e5r det g\u00e6lder map-t\u00e6llere, er jeg opm\u00e6rksom p\u00e5 varianter pr. CPU: Nogle dumps viser v\u00e6rdier pr. CPU, mens andre aggregerer. Til pr\u00e6cise analyser bruger jeg maskinl\u00e6sbare udskrifter og beregner bevidst aggregeringer, s\u00e5 spidsbelastninger p\u00e5 enkelte CPU\u2019er ikke <strong>g\u00e5 under<\/strong>.<\/p>\n<p>For hurtigt at f\u00e5 et overblik over trace-udskrifter k\u00f8rer jeg \u201cbpftool prog tracelog\u201d. P\u00e5 den m\u00e5de kan jeg l\u00e6se udskrifter fra trace-bufferen uden at skulle bruge separate v\u00e6rkt\u00f8jer. I produktionsmilj\u00f8er begr\u00e6nser jeg s\u00e5danne udskrifter kraftigt og erstatter dem med t\u00e6llere i maps eller ringbuffer-begivenheder for at undg\u00e5 overhead og st\u00f8j.<\/p>\n\n<h2>Netv\u00e6rksoverv\u00e5gning: Pakker, datastr\u00f8mme, fejl<\/h2>\n\n<p>I netv\u00e6rksmilj\u00f8et tester jeg XDP- og TC-programmer, udl\u00e6ser kort med m\u00e5lerafl\u00e6sninger og identificerer <strong>Hotspots<\/strong> langs dataveje. Jeg bruger bpftool til at synligg\u00f8re regler, der falder igennem, og til at karakterisere datastr\u00f8mme. Hvis der opst\u00e5r fejlbeslutninger i filtrene, viser map-dumps de reelle n\u00f8gler og v\u00e6rdier. P\u00e5 den m\u00e5de finder jeg hurtigt forskelle mellem den forventede og den faktiske behandling. Dette overblik hj\u00e6lper mig med at tr\u00e6ffe et mere velovervejet valg af v\u00e6rkt\u00f8jer til <a href=\"https:\/\/webhosting.de\/da\/ebpf-linux-analysevaerktojer-serverovervagning-indsigt\/\">eBPF-analysev\u00e6rkt\u00f8jer<\/a>, der anvendes i hosting-milj\u00f8et <strong>konkret<\/strong> indordner.<\/p>\n\n<h2>XDP\/TC-varianter og synlighed med bpftool net<\/h2>\n\n<p>N\u00e5r det g\u00e6lder netv\u00e6rksstien, tjekker jeg med \u201cbpftool net\u201d, hvilke programmer der er knyttet til gr\u00e6nsefladerne. P\u00e5 den m\u00e5de kan jeg se, om XDP k\u00f8rer i Generic-, Native- eller Offload-tilstand, og hvilke TC-hooks (ingress\/egress) der er i brug. Hvis tilstandene ikke stemmer overens, korrigerer jeg tilkoblingsindstillingerne eller driverparametrene. Jeg dokumenterer udskrifterne regelm\u00e6ssigt som et artefakt, s\u00e5 \u00e6ndringer i netv\u00e6rksstierne <strong>forst\u00e5elig<\/strong> forbliver.<\/p>\n<p>N\u00e5r det g\u00e6lder hotpaths, g\u00e5r jeg efter korte stier: XDP-programmer skal tr\u00e6ffe beslutninger tidligt (pass\/drop\/redirect), mens TC-programmer skal konsolidere regler og undg\u00e5 overfl\u00f8dige opslag. Ved hj\u00e6lp af kortstatistikker vurderer jeg hitkvaliteten, og JIT-dumps giver indsigt i, om springm\u00f8nstre er ugunstige. Hvis der opst\u00e5r k\u00f8- eller checksum-omkostninger, justerer jeg filtrene og genovervejer placeringen mellem XDP og TC.<\/p>\n\n<h2>Sikkerhedsoverv\u00e5gning og overholdelse af regler<\/h2>\n\n<p>Jeg bruger eBPF-programmer til <strong>Proces<\/strong>-Opstart, filadgang og netv\u00e6rksh\u00e6ndelser for at identificere sikkerhedsrelevante m\u00f8nstre. Med bpftool tjekker jeg, hvilke programmer der er aktive, hvor de kobler sig til, og om reglerne overholdes. Hvis tilkoblingspunkterne stemmer, gennemg\u00e5r jeg map-indholdet for at dokumentere, at retningslinjerne overholdes. I mist\u00e6nkelige tilf\u00e6lde bruger jeg Verifier-logfiler og bytecode til at kontrollere logikken. Denne indsigt fremskynder revisioner og g\u00f8r agenternes adf\u00e6rd mere overskuelig for teams <strong>forst\u00e5eligt<\/strong>.<\/p>\n\n<h2>Rettigheder, isolering og sikkerhedsmodeller<\/h2>\n\n<p>I driften l\u00e6gger jeg v\u00e6gt p\u00e5 klare rettigheder. P\u00e5 mange systemer er eBPF-funktioner uden privilegier deaktiveret; jeg planl\u00e6gger derfor med dedikerede servicekonti og specifikke kapaciteter. Afh\u00e6ngigt af kerneversionen anvendes CAP_BPF, CAP_PERFMON og CAP_NET_ADMIN, mens CAP_SYS_ADMIN kun bruges, hvor det er uundg\u00e5eligt. Jeg isolerer bpff'er efter navnerum, n\u00e5r containere har brug for egne spor, og afgr\u00e6nser cgroups p\u00e5 en s\u00e5dan m\u00e5de, at tilknytninger <strong>m\u00e5lrettet<\/strong> har en effekt.<\/p>\n<p>Af hensyn til compliance fryser jeg f\u00f8lsomme maps efter udfyldning med \u201cbpftool map freeze\u201d. Dermed bliver retningslinjerne skrivebeskyttede, mens programmerne fortsat kan l\u00e6se dem. Ved revisioner dokumenterer jeg program-tagget og attach-punkterne, s\u00e5 beslutningerne forbliver reproducerbare, selvom artefakterne genopbygges.<\/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>Egne eBPF-programmer: Indl\u00e6sning, tilf\u00f8jelse, fejlfinding<\/h2>\n\n<p>Under udviklingen kompilerer jeg C-kildekoder med Clang til eBPF-objekter, indl\u00e6ser dem med bpftool og forbinder dem med <strong>Kroge<\/strong>. Hvis verifikatoren sl\u00e5r til, gemmer jeg loggen og reducerer de risikable forl\u00f8b trin for trin. Jeg kontrollerer oversat bytecode og JIT-output for at evaluere instruktionssekvenser. Hvis resultaterne stemmer overens, skriver og l\u00e6ser jeg testdata via maps og tester gr\u00e6nsetilf\u00e6lde. Det forkorter feedback-sl\u00f8jferne og holder min v\u00e6rkt\u00f8jsk\u00e6de klar til b\u00e5de eksperimenter og produktion <strong>standardiseret<\/strong>.<\/p>\n\n<h2>CO-RE-strategi og stabile artefakter<\/h2>\n\n<p>For at sikre, at build-versionerne holder l\u00e6ngere, satser jeg p\u00e5 CO-RE. Jeg integrerer BTF-oplysninger, bruger \u201cgen vmlinux\u201d og kontrollerer relokeringerne under indl\u00e6sningen. Hvis der opst\u00e5r afvigelser i kernelstrukturerne, afsl\u00f8rer verifier-loggen de p\u00e5g\u00e6ldende steder. Jeg holder programmerne s\u00e5 generiske som muligt og lagrer politikker i maps. Fordelen er, at ved skema\u00e6ndringer opdaterer jeg kun dataene, ikke selve <strong>Kode<\/strong>. Med Skeletons automatiserer jeg ops\u00e6tning, pinning og oprydning, hvilket is\u00e6r i CI\/CD-pipelines reducerer fejlprocenten markant.<\/p>\n\n<h2>Samarbejde med avancerede v\u00e6rkt\u00f8jer<\/h2>\n\n<p>For at opn\u00e5 hurtige resultater satser jeg f\u00f8rst p\u00e5 <strong>BCC<\/strong>-scripts og bruger dem som udgangspunkt for mere dybdeg\u00e5ende analyser. S\u00e5 snart et script leverer nyttige signaler, unders\u00f8ger jeg de underliggende programmer og maps med bpftool. Denne skift viser mig, hvad der reelt er indl\u00e6st i kernen, og hvilke datastrukturer der k\u00f8rer. P\u00e5 den m\u00e5de adskiller jeg klart brugergr\u00e6nsefladen fra de faktiske objekter. For at f\u00e5 et overblik er det v\u00e6rd at kigge p\u00e5 disse kompakte <a href=\"https:\/\/webhosting.de\/da\/bcc-vaerktojer-linux-ydeevne-ebpf-overvagning-fokus\/\">BCC-v\u00e6rkt\u00f8jer<\/a>, der besvarer hyppige sp\u00f8rgsm\u00e5l med f\u00e5 kommandoer <strong>d\u00e6kke<\/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>Bedste praksis for drift<\/h2>\n\n<p>Jeg adskiller test- og produktionsmilj\u00f8er strengt, indsamler Verifier-logfiler tidligt og s\u00f8rger for <strong>Rollbacks<\/strong> Klar. F\u00f8r hver udrulning tjekker jeg \u201cbpftool feature\u201d, s\u00e5 programtype, helper og map-varianter passer til m\u00e5let. Jeg integrerer programmets statistikker i den eksisterende overv\u00e5gning for at holde overhovedet synligt. Jeg dokumenterer l\u00f8bende alle tilknytningspunkter, for kun p\u00e5 den m\u00e5de kan holdene bevare overblikket. Hvis du vil dykke dybere ned i emnet, finder du hos <a href=\"https:\/\/webhosting.de\/da\/ebpf-linux-analysevaerktojer-serverovervagning-indsigt\/\">eBPF-analysev\u00e6rkt\u00f8jer<\/a> yderligere impulser til <strong>Arbejdsgange<\/strong>.<\/p>\n\n<h2>Ressourceh\u00e5ndtering, oprydning og tilbagef\u00f8rsel<\/h2>\n\n<p>Jeg bruger pins til at oprette definerede tilstande og rydder dem aktivt op. Til rollbacks opbevarer jeg den forrige version i det samme navneomr\u00e5de (f.eks. \u201c\/sys\/fs\/bpf\/myapp\/v1\u201d og \u201c\/sys\/fs\/bpf\/myapp\/v2\u201d). Skiftet foretages ved at tilknytte p\u00e5 ny eller skifte link med minimal nedetid. Derefter fjerner jeg gamle links og maps, s\u00e5 der ikke forbliver ressourcer <strong>Slikke<\/strong>. Inden jeg sletter, tjekker jeg, om der stadig findes referencer (\u201cprog show\u201d, \u201clink list\u201d, \u201cmap show\u201d).<\/p>\n<p>For at undg\u00e5 konfigurationsafvigelser fryser jeg maps, der indeholder policies, og foretager \u00e6ndringer udelukkende via definerede deployments. Jeg planl\u00e6gger batch-opdateringer uden for spidsbelastningsperioder, overv\u00e5ger k\u00f8rselstid og fejlt\u00e6llere og bekr\u00e6fter vellykkede opdateringer med en anden \u201cmap dump\u201d.<\/p>\n\n<h2>Automatisering og JSON-udskrifter<\/h2>\n\n<p>JSON-flag og maskinl\u00e6sbare formater g\u00f8r bpftool til et godt v\u00e6rkt\u00f8j <strong>skriptbar<\/strong> til CI\/CD, CMDB\u2019er og revisioner. Jeg forsegler builds p\u00e5 en reproducerbar m\u00e5de, dokumenterer hashv\u00e6rdier for objektfilerne og gemmer bpffs-stier. P\u00e5 den m\u00e5de knytter jeg implementeringer til konkrete programmer og maps. Enkle wrapper-scripts skriver statusrapporter til konsollen og i artefakter efter hver \u00e6ndring. Dermed forbliver eBPF-landskabet permanent <strong>testbar<\/strong>.<\/p>\n\n<h2>At skabe tillid: tags, hashes og artefakter<\/h2>\n\n<p>Efter indl\u00e6sningen l\u00e6ser jeg program-tagget ud (\u201cbpftool prog show id X\u201d), som er afledt af bytecode. Dette tag knytter jeg sammen med build-nummeret og commit-hash i min CMDB. Ved senere kontroller sammenligner jeg den forventede og den aktuelle tag \u2013 p\u00e5 den m\u00e5de kan jeg opdage afvigelser uden at skulle have adgang til de originale bin\u00e6re filer. For maps logger jeg type, n\u00f8gle-\/v\u00e6rdist\u00f8rrelser og flags, s\u00e5 struktur\u00e6ndringer ved opdateringer <strong>i god tid<\/strong> vise.<\/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>bpftrace i praksis<\/h2>\n\n<p>Til ad hoc-traces bruger jeg <strong>bpftrace<\/strong>, n\u00e5r f\u00e5 linjer kode hurtigt skal give svar. Derefter tjekker jeg den opn\u00e5ede effekt med bpftool for n\u00f8jagtigt at se programmer, tilknytningspunkter og maps. P\u00e5 den m\u00e5de kombinerer jeg udtrykskraft med indsigt i kernen og holder de to perspektiver synkroniserede. Som udgangspunkt er denne korte oversigt over <a href=\"https:\/\/webhosting.de\/da\/bpftrace-hurtigere-pavisning-af-problemer-pa-hosting-serveren-diagnose\/\">bpftrace<\/a>, der h\u00e5ndterer typiske foresp\u00f8rgsler godt <strong>indrammer<\/strong>. S\u00e5 snart et m\u00f8nster er p\u00e5 plads, overf\u00f8rer jeg det om n\u00f8dvendigt til kompakte C-programmer.<\/p>\n\n<h2>Fejlanalyse ved hj\u00e6lp af Verifier-logfiler<\/h2>\n\n<p>Hvis verifikatoren afviser ans\u00f8gningen, leder jeg f\u00f8rst efter potentielle <strong>Nul<\/strong>-dereferencer, manglende gr\u00e6nsekontroller eller for lange stier. Jeg forenkler logikken, isolerer tvivlsomme hj\u00e6lpefunktionskald og validerer offsets. Det er nyttigt at nedskalere store maps og opdele hotpaths i klart afgr\u00e6nsede blokke. JIT-dumps viser mig, om sl\u00f8jfer udvides utilsigtet, eller om spring er ineffektive. For hvert skridt bliver fejlmeddelelserne f\u00e6rre, indtil programmet k\u00f8rer p\u00e5lideligt <strong>Belastninger<\/strong>.<\/p>\n\n<h2>Hurtigt at identificere typiske fejlm\u00f8nstre<\/h2>\n\n<p>N\u00e5r jeg ser fejlmeddelelser som \u201cinvalid mem access\u201d eller \u201cR.. unbounded loop\u201d, tjekker jeg array-gr\u00e6nser, pointer-validering og loop-begr\u00e6nsninger. Ved CO-RE-problemer tyder fejlmeddelelserne p\u00e5 manglende eller uegnede BTF-data; jeg verificerer \u201c\/sys\/kernel\/btf\/vmlinux\u201d og tilpasser m\u00e5lstrukturerne. Hvis indl\u00e6sningen mislykkes p\u00e5 grund af manglende hj\u00e6lpeprogrammer, viser \u201cfeature probe\u201d de tilg\u00e6ngelige hj\u00e6lpeprogrammer og korttyper. Hvis der opst\u00e5r JIT-problemer under dumpningen, kontrollerer jeg, om JIT er aktiveret, og om hardening-indstillinger p\u00e5virker udskriften <strong>forhindre<\/strong>.<\/p>\n<p>Hvis vedh\u00e6ftede filer h\u00e6nger sig fast, skyldes det ofte, at der stadig er et fastgjort link. Jeg laver en liste over linkene, frig\u00f8r dem m\u00e5lrettet og fjerner derefter fastg\u00f8relserne. Ved \u201cEBUSY\u201d tjekker jeg, om en anden instans af tjenesten holder objekter \u00e5bne, og planl\u00e6gger en kort, koordineret omstilling.<\/p>\n\n<h2>Fremtidsudsigter: bpftool og moderne kerneanalyse<\/h2>\n\n<p>Med nye kerneludgivelser vokser antallet af programtyper, hj\u00e6lpeprogrammer og <strong>Statistik<\/strong>, og bpftool afspejler hurtigt disse fremskridt. Jeg afs\u00e6tter derfor tid til regelm\u00e6ssige opdateringer, s\u00e5 v\u00e6rkt\u00f8jerne og dokumentationen holdes ajour. Forbedringer af JSON og nye underkommandoer \u00e5bner op for yderligere muligheder for automatisering. Samtidig modnes samspillet med high-level-stacks, hvilket forenkler onboarding. Den, der aktivt f\u00f8lger denne udvikling, f\u00e5r fordele inden for diagnosticering, tuning og <strong>Sikkerhed<\/strong> Tempo.<\/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>Kort opsummeret<\/h2>\n\n<p>bpftool giver mig direkte <strong>Adgang<\/strong> p\u00e5 eBPF-programmer og deres datastrukturer og g\u00f8r processer i kernen synlige. Jeg identificerer flaskehalse, kontrollerer sikkerhedsregler og udvikler mine egne sporinger uden at skulle ombygge kernen. Med en ren installation, klare tests og scripting forbliver brugen reproducerbar. High-level-v\u00e6rkt\u00f8jer g\u00f8r det nemmere at komme i gang, mens bpftool dokumenterer de faktiske objekter p\u00e5lideligt. P\u00e5 den m\u00e5de bringer jeg observabilitet og diagnosticering op p\u00e5 et robust niveau, der i den daglige drift <strong>b\u00e6rer<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>L\u00e6r, hvordan du bruger bpftool til moderne kerneanalyse med eBPF: Grundl\u00e6ggende principper, de vigtigste kommandoer og praktiske eksempler p\u00e5 observabilitet i Linux-kernen med fokus p\u00e5 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":"118","_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\/da\/wp-json\/wp\/v2\/posts\/20690","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/comments?post=20690"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts\/20690\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media\/20683"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media?parent=20690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/categories?post=20690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/tags?post=20690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}