...

bpftool — введение в современный анализ ядра с помощью eBPF

Я покажу вам, как работать с bpftool целенаправленно анализировать работающие системы Linux, управлять программами eBPF и при этом получать значимую телеметрию без пересборки ядра. В этой статье шаг за шагом рассмотрены установка, основные концепции, типичные сценарии применения и полезные процедуры, чтобы вы могли Анализ ядра безопасно использует в эксплуатации и разработке.

Центральные пункты

Для начала я кратко изложу основные аспекты, чтобы ты мог правильно сориентироваться в следующих главах и Приоритеты можешь установить.

  • близость к ядру: Прямой доступ к программам eBPF, картам и статистике
  • Прозрачность: журналы верификатора, байт-код и дампы JIT для поиска ошибок
  • готовность к серийному производству: вывод данных в формате JSON, возможность написания скриптов, воспроизводимые рабочие процессы
  • Ширина: Сеть, системные вызовы, планировщик задач, cgroups, perf_events
  • Экосистема: Дополняет инструменты высокого уровня, такие как BCC и bpftrace

Я использую перечисленные пункты, чтобы продемонстрировать практические шаги и Решения облегчить работу. Так ты сможешь быстро понять, в каких случаях bpftool приносит непосредственную пользу, а в каких лучше подойдут другие инструменты. Этот список служит ориентиром для примеров, приведенных в последующих главах, и позволяет сосредоточиться на Измеримость. При чтении не теряйте из виду свою целевую систему, поскольку настройки и версия ядра определяют доступные опции. Чем четче вы сформулируете свою задачу, тем быстрее eBPF и bpftool предоставят Сигнал вместо шума.

eBPF как безопасная среда выполнения в ядре

eBPF обеспечивает безопасную среду выполнения в Ядро готовый к работе, который привязывает небольшие программы к определённым событиям и тщательно проверяет их перед выполнением. Верификатор предотвращает недопустимые обращения к памяти и циклы, благодаря чему системы остаются управляемыми и готовый к эксплуатации. Я привязываю программы к Kprobes, Tracepoints, XDP или cgroups и получаю точные данные о контексте. Такая тесная интеграция позволяет получать измеренные значения без дорогостоящих переходов через системные вызовы и без необходимости компиляции модулей. Таким образом создается гибкий уровень телеметрии, который я использую с помощью bpftool сделать видимым, проверяемым и управляемым.

Установка и требования

Сначала я проверяю версию ядра и его возможности, ведь многие функции становятся доступными начиная с 5.x полностью. В дистрибутивах я устанавливаю bpftool в виде пакета или компилирую его из исходных кодов ядра в папке tools/bpf/bpftool, в зависимости от состояния системы. Для компиляции мне нужны Clang/LLVM, libelf, make, а также соответствующие заголовочные файлы, чтобы инструментарий работал с ядром Подходит для. После установки я проверяю доступность с помощью команды “bpftool version” и сравниваю результаты с моими требованиями. Если возможности ядра соответствуют требованиям, я запускаю тесты на отдельной системе, прежде чем переходить к рабочим хостам следовать.

bpffs и фиксация: обзор жизненного цикла объекта

Для обеспечения воспроизводимости процессов я сначала монтирую файловую систему BPF в каталог “/sys/fs/bpf”. Если она отсутствует, я создаю её с помощью команды “mount -t bpf bpf /sys/fs/bpf” и проверяю пространства имён, если в системе запущены контейнеры. Затем я привязываю загруженные объекты к стабильным путям, например: “bpftool prog pin id X /sys/fs/bpf/myapp/xdp_ingress” или “bpftool map pin id M /sys/fs/bpf/myapp/counters”. Таким образом, программы, ссылки и карты сохраняются после перезапуска процессов, остаются доступными для поиска и имеют однозначные имена. адресуемый.

Я структурирую иерархию привязок по сервисам, хукам и версиям, например, “/sys/fs/bpf/»служба/hook/версия”. Это упрощает откат изменений и параллельное тестирование. В случае с вложениями я предпочитаю подход с использованием ссылок: “bpftool link list” показывает мне стабильные дескрипторы, а “bpftool link pin id L /sys/fs/bpf/myapp/link_xdp” фиксирует ссылку. При очистке я сначала удаляю пины (rm), после чего объекты освобождаются. Таким образом я избегаю сироты-программы, которые продолжают работать незаметно.

Основные подкоманды и концепции

bpftool группирует команды по типам объектов, таким как prog, map, cgroup или feature, что позволяет логически структурировать рабочие процессы. Я использую “prog list” и “prog show” для общего обзора, “dump xlated/jited” — для углубленного анализа, а “map dump/lookup” — для анализа потоков данных. Подкоманда “feature” отображает активированные вспомогательные функции и типы карт, что позволяет избежать ошибок на более поздних этапах. Вывод данных в формате JSON упрощает автоматизацию в CI/CD и управление конфигурацией. В следующей таблице приведены типичные задачи и примеры компактный вместе.

Объект Задание Пример
prog Перечислить и описать программы bpftool prog list | bpftool prog show id X
prog Просмотр байт-кода/JIT bpftool prog dump xlated id X | dump jited id X
prog Загрузка и вложение bpftool prog load file.o /sys/fs/bpf/p && … attach
карта Проверить содержимое и ключи bpftool map dump id M | map lookup id M key HEX
особенность Показать возможности ядра bpftool — проверка функций

BTF, CO-RE и Skeletons в повседневной жизни

Я слежу за тем, чтобы BTF был доступен в ядре, поскольку он обеспечивает поддержку CO-RE (Compile Once – Run Everywhere) и удобную отладочную выводную информацию. С помощью команды “bpftool feature probe” я проверяю, активен ли BTF, а при необходимости просматриваю информацию о типах с помощью команды “bpftool btf dump file /sys/kernel/btf/vmlinux”. Для разработки я генерирую подходящий заголовочный файл на основе типов ядра с помощью команды “bpftool gen vmlinux”, что позволяет мне надежно ссылаться на структуры. Это значительно сокращает количество точек разрыва при обновлениях ядра.

При создании упаковки я использую скелетоны: команда “bpftool gen skeleton obj.o” генерирует C-обёртку, которая инкапсулирует загрузку, добавление, доступ к картам и очистку. Благодаря этому мой связующий код сокращается, и я сохраняю взаимодействие между пользовательским пространством и программой eBPF прочный. CO-RE помогает мне использовать одни и те же артефакты на разных ядрах, при условии, что доступны хелперы и хуки — я проверяю это на раннем этапе с помощью “feature probe”.

Анализ производительности с помощью bpftool

Что касается вопросов производительности, я использую bpftool для подсчета просмотры отдельных программ, измеряю время выполнения и сравниваю его с пиковыми нагрузками. Так я определяю, какие трассы работают с высокой интенсивностью, или не занимает ли XDP-фильтр слишком много ресурсов ЦП на «горячих» путях. Затем я оцениваю, что целесообразнее: выборка или более строгие фильтры. При обнаружении аномалий я изучаю JIT-дампы, чтобы понять пути выполнения кода и избежать ненужных инструкций. В итоге эти данные попадают в информационные панели, чтобы операторы могли на постоянной основе Прозрачность сохранить.

Показатели, карты по процессорам и статистические данные

Я анализирую вывод команды “bpftool prog show id X”, чтобы проверить значения “run_time_ns” и “run_cnt”. Их соотношение показывает мне среднее время выполнения, а аномальные значения я интерпретирую с помощью метрик рабочей нагрузки. В случае счетчиков Map я обращаю внимание на варианты, рассчитанные на каждый процессор: в некоторых дампах показаны значения для каждого процессора, в других — агрегированные. Для точного анализа я использую машиночитаемые выводы и сознательно рассчитываю агрегированные значения, чтобы пиковые значения на отдельных процессорах не погибнуть.

Чтобы быстро ознакомиться с выводом трассировки, я запускаю команду “bpftool prog tracelog”. С её помощью я считываю вывод из буфера трассировки, не прибегая к отдельным инструментам. В производственных средах я строго ограничиваю количество таких выводов и заменяю их счётчиками в картах или событиями кольцевого буфера, чтобы избежать накладных расходов и шума.

Отслеживаемость сети: пакеты, потоки, ошибки

В сетевой среде я проверяю программы XDP и TC, считываю карты с показаниями счетчиков и выявляю Горячие точки по каналам передачи данных. Я использую bpftool, чтобы выявить пропущенные правила и охарактеризовать потоки. Если при фильтрации возникают ошибочные решения, дампы карт показывают реальные ключи и значения. Так я быстро нахожу различия между ожидаемой и фактической обработкой. Этот обзор помогает мне в углублённом выборе инструментов для Инструменты анализа eBPF, который используется в сфере хостинга бетон классифицирует.

Варианты XDP/TC и отображение с помощью bpftool net

Что касается сетевого пути, я использую команду “bpftool net” для проверки программ, привязанных к интерфейсам. Так я могу определить, работает ли XDP в режиме Generic, Native или Offload, а также какие TC-хуки (ingress/egress) заняты. Если режимы не совпадают, я корректирую параметры присоединения или параметры драйверов. Я регулярно документирую выводы в виде артефакта, чтобы изменения в сетевых путях понятный остаются.

В случае Hotpaths я стремлюсь к коротким путям: программы XDP должны принимать решения на ранних этапах (pass/drop/redirect), а программы TC — объединять правила и избегать избыточных запросов. С помощью статистики Map я оцениваю качество совпадений, а дампы JIT позволяют определить, не являются ли схемы переходов неэффективными. Если обнаруживаются затраты на очереди или контрольные суммы, я корректирую фильтры и пересматриваю их расположение между XDP и TC.

Контроль безопасности и соблюдение нормативных требований

Я использую программы eBPF для Процесс-запуски, обращения к файлам и сетевые события, чтобы выявить модели, имеющие отношение к безопасности. С помощью bpftool я проверяю, какие программы активны, где они привязаны и действуют ли правила. Если точки привязки верны, я проверяю содержимое карт, чтобы задокументировать применение политик. В подозрительных случаях я обращаюсь к журналам Verifier и байт-коду, чтобы проверить логику. Такой анализ ускоряет проведение аудитов и позволяет командам лучше понимать поведение агентов понятный.

Права доступа, изоляция и модели безопасности

При эксплуатации я уделяю особое внимание четкому распределению прав доступа. Во многих системах непривилегированные функции eBPF отключены; поэтому я планирую использовать выделенные служебные учетные записи и конкретные возможности. В зависимости от версии ядра используются CAP_BPF, CAP_PERFMON и CAP_NET_ADMIN, а CAP_SYS_ADMIN применяется только в тех случаях, когда это неизбежно. Я изолирую bpffs по пространствам имён, если контейнерам требуются собственные трассировки, и разграничиваю cgroups таким образом, чтобы присоединения целевой оказывают влияние.

В целях обеспечения соответствия требованиям я фиксирую конфигурационные файлы Maps после их заполнения с помощью команды “bpftool map freeze”. Благодаря этому конфигурации становятся защищенными от записи, в то время как программы по-прежнему могут их считывать. В ходе аудитов я документирую дату создания программы и точки присоединения, чтобы решения оставались воспроизводимыми даже в случае повторной сборки артефактов.

Собственные программы eBPF: загрузка, добавление, отладка

В процессе разработки я компилирую исходные коды на C с помощью Clang в объекты eBPF, загружаю их с помощью bpftool и подключаю их к Крючки. Если верификатор выдает ошибку, я сохраняю журнал и шаг за шагом сокращаю количество рискованных путей. Я проверяю скомпилированный байт-код и вывод JIT, чтобы оценить последовательности инструкций. Если результаты совпадают, я записываю и считываю тестовые данные через маппы и проверяю крайние случаи. Это сокращает циклы обратной связи и поддерживает работоспособность моего набора инструментов как для экспериментов, так и для производства стандартизированный.

Стратегия CO-RE и стабильные артефакты

Чтобы сборки работали дольше, я использую CO-RE. Я интегрирую информацию BTF, использую “gen vmlinux” и проверяю релокации во время загрузки. Если в структурах ядра возникают отклонения, журнал верификатора выявляет эти места. Я стараюсь сделать программы максимально универсальными и выношу политики в карты. Преимущество: при изменениях схемы я обновляю только данные, а не сам Код. С помощью Skeletons я автоматизирую настройку, привязку и очистку, что значительно снижает количество ошибок, особенно в конвейерах CI/CD.

Взаимодействие с инструментами высокого уровня

Чтобы добиться быстрых результатов, я в первую очередь делаю ставку на BCC-скрипты и использую их в качестве отправной точки для более углублённого анализа. Как только скрипт выдает полезные сигналы, я с помощью bpftool проверяю лежащие в его основе программы и карты. Такой подход позволяет мне понять, что действительно загружено в ядро и какие структуры данных используются. Таким образом я чётко разделяю уровень удобства и реальные объекты. Для общего представления стоит взглянуть на эти краткие Инструменты BCC, в которой часто задаваемые вопросы описываются с помощью нескольких команд обложка.

Лучшие практики эксплуатации

Я строго разделяю тестовую и производственную среды, своевременно собираю журналы Verifier и слежу за Откаты Готов. Перед каждым развертыванием я проверяю “bpftool feature”, чтобы убедиться, что тип программы, хелпер и варианты карт соответствуют цели. Статистику по программам я интегрирую в существующую систему мониторинга, чтобы отслеживать накладные расходы. Все точки подключения я постоянно документирую, ведь только так команды могут сохранять обзор ситуации. Те, кто хочет углубиться в тему, найдут в Инструменты анализа eBPF дополнительные стимулы для Рабочие процессы.

Управление ресурсами, очистка и откат

Я использую пины для создания определённых состояний и активно их очищаю. Для отката я сохраняю предыдущую версию в том же пространстве имён (например, “/sys/fs/bpf/myapp/v1” и “/sys/fs/bpf/myapp/v2”). Переключение осуществляется путём повторного присоединения или смены ссылки с минимальным временем простоя. Затем я удаляю старые ссылки и отображения, чтобы не занимать ресурсы лизать. Перед удалением я проверяю, остались ли какие-либо ссылки (“prog show”, “link list”, “map show”).

Чтобы избежать отклонений в конфигурации, я “замораживаю” карты, содержащие политики, и вношу изменения исключительно посредством заранее определённых развёртываний. Пакетные обновления я планирую вне часов пиковой нагрузки, отслеживаю время выполнения и счетчик ошибок, а также подтверждаю успешность обновлений с помощью повторного «map dump».

Автоматизация и вывод данных в формате JSON

Благодаря поддержке JSON и машиночитаемых форматов bpftool работает отлично поддающийся программированию для CI/CD, CMDB и аудитов. Я фиксирую сборки с возможностью воспроизведения, документирую хеши объектных файлов и сохраняю пути к bpffs. Таким образом я связываю развертывания с конкретными программами и картами. Простые скрипты-обёртки записывают отчёты о состоянии в консоль и в артефакты после каждого изменения. Благодаря этому среда eBPF остаётся постоянно проверяемый.

Укрепление доверия: теги, хеши и артефакты

После загрузки я считываю тег программы (“bpftool prog show id X”), который выводится из байт-кода. Этот тег я связываю с номером сборки и хешем коммита в своей CMDB. При последующих проверках я сравниваю ожидаемый и текущий тег — так я выявляю отклонения без доступа к исходным бинарным файлам. Для карт я регистрирую тип, размеры ключей и значений, а также флаги, чтобы отслеживать изменения структуры при обновлениях своевременно показать.

bpftrace на практике

Для трассировок Ad-hoc я использую bpftrace, когда нужно быстро получить ответы с помощью нескольких строк синтаксиса. Затем я проверяю полученный результат с помощью bpftool, чтобы точно увидеть программы, точки привязки и карты. Таким образом, я сочетаю выразительность с близостью к ядру и синхронизирую обе точки зрения. В качестве отправной точки подойдет этот краткий обзор по bpftrace, который хорошо обрабатывает типичные запросы обрамляет. Как только шаблон готов, я при необходимости переношу его в компактные программы на языке C.

Анализ ошибок с помощью журналов Verifier

В случае отказа со стороны верификатора я сначала ищу потенциальных Ноль-разыменование, отсутствующие проверки границ или слишком длинные пути. Я упрощаю логику, выделяю вызовы вспомогательных функций, вызывающих сомнения, и проверяю смещения. Помогает уменьшение размера больших карт и разделение «горячих» путей на чётко очерченные блоки. Дампы JIT показывают мне, не расширяются ли циклы непреднамеренно или не являются ли переходы неэффективными. С каждым шагом количество сообщений об ошибках сокращается, пока программа не начнёт работать надёжно грузы.

Быстрая классификация типичных картин повреждений

Если я вижу сообщения типа “invalid mem access” или “R.. unbounded loop”, я проверяю границы массивов, корректность указателей и ограничения циклов. При проблемах с CO-RE такие сообщения указывают на отсутствие или несоответствие данных BTF; я проверяю “/sys/kernel/btf/vmlinux” и корректирую целевые структуры. Если загрузка завершается сбоем из-за отсутствия вспомогательных модулей, команда “feature probe” показывает доступные вспомогательные модули и типы карт. Если при сбросе данных возникают проблемы с JIT, я проверяю, включен ли JIT и не блокируют ли параметры укрепления безопасности вывод пресекать.

Если вложения застревают, это часто связано с тем, что ссылка по-прежнему закреплена. Я составляю список ссылок, целенаправленно разблокирую их, а затем удаляю закрепления. В случае ошибки “EBUSY” я проверяю, не удерживает ли какой-либо другой экземпляр службы открытые объекты, и планирую кратковременное скоординированное переключение.

Перспективы: bpftool и современный анализ ядра

С выходом новых версий ядра расширяется набор типов программ, вспомогательных программ и Статистика, и bpftool оперативно отражает эти достижения. Поэтому я планирую выделять время на регулярные обновления, чтобы инструментарий и документация оставались актуальными. Улучшения JSON и новые подкоманды открывают дополнительные возможности для автоматизации. В то же время совершенствуется взаимодействие с высокоуровневыми стеками, что упрощает внедрение. Те, кто активно следит за этими разработками, получают преимущества при диагностике, настройке и Безопасность Темп.

Краткое резюме

bpftool выдает мне непосредственно Доступ на программы eBPF и их структуры данных, а также делает видимыми процессы в ядре. Я выявляю узкие места, проверяю правила безопасности и разрабатываю собственные трассировки без необходимости переделывать ядро. Благодаря аккуратной установке, четким тестам и скриптам использование остается воспроизводимым. Инструменты высокого уровня ускоряют начало работы, а bpftool надёжно документирует фактические объекты. Таким образом, я вывожу наблюдаемость и диагностику на надёжный уровень, который в повседневной эксплуатации несет.

Текущие статьи

Серверная стойка с системами Linux и визуализация анализа ядра eBPF
Технология

bpftool — введение в современный анализ ядра с помощью eBPF

Узнайте, как использовать bpftool для анализа современных ядер с помощью eBPF: основы, основные команды и практические примеры обеспечения наблюдаемости в ядре Linux с акцентом на bpftool.

Администратор сервера анализирует производительность Linux с помощью инструментов bcc eBPF на мониторах
Технология

bcc tools на практике: практическое руководство по оптимизации производительности Linux с помощью eBPF

Узнайте, как с помощью bcc tools и eBPF профессионально анализировать и оптимизировать производительность Linux. В этом руководстве представлены практические методы инжиниринга производительности с акцентом на ключевое слово «bcc tools».

Центр обработки данных с серверами под управлением Linux и абстрактными графиками производительности для анализа eBPF
Технология

Анализ производительности eBPF: эффективное трассирование в Linux для современного мониторинга серверов

Узнайте, как с помощью eBPF и Linux Tracing оптимизировать мониторинг серверов. В центре внимания: производительность eBPF и передовые практики для администраторов.