Введение в технологию eBPF

Abstract

Абстракция

С помощью eBPF программисты могут выполнять пользовательские байт-коды в ядре без изменения ядра или загрузки модулей ядра. eBPF тесно связан с ядром. Давайте сначала представим некоторые связанные с этим основные понятия.

Система Linux разделена на пространство ядра и пространство пользователя.

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

  • В пользовательском пространстве выполняются неядерные процессы, такие как Ввод-вывод, файловые системы и т.д.. Эти процессы имеют ограниченный доступ к оборудованию через системные вызовы, предоставляемые ядром. Другими словами, программы пользовательского пространства должны быть отфильтрованы в пространстве ядра.

Интерфейс системного вызова может удовлетворить большинство потребностей, и разработчикам по-прежнему требуется больше гибкости при работе с новым оборудованием, файловыми системами, сетевыми протоколами и даже пользовательскими системными вызовами.

Что делать, если пользовательский код хочет получить прямой доступ к оборудованию без изменения исходного кода ядра? Можно использовать Модуль ядра Linux (LKM). Пользовательскому пространству обычно требуется доступ к пространству ядра через системные вызовы, в то время как LKM загружается непосредственно в ядро и является частью ядра. Одной из наиболее ценных особенностей LKM является то, что он может быть загружен во время выполнения без компиляции ядра или перезагрузки компьютера.

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

Что такое eBPF - Расширенный фильтр пакетов Berkeley

eBPF - это новый метод доступа к службам ядра Linux и аппаратному обеспечению. Эта новая технология была использована для создания сетей, ошибок, отслеживания и брандмауэров.

Эта технология позволяет запускать изолированные программы в привилегированном контексте, таком как ядро операционной системы. Он используется для безопасного и эффективного расширения возможностей ядра без необходимости изменения исходного кода ядра или загрузки модулей ядра.

Как работает eBPF

eBPF программы управляются событиями и привязаны к пути кода. Путь к коду содержит определенные триггеры, называемые крючками, которые выполняют любые подключенные программы eBPF при их передаче. Некоторые примеры перехватчиков включают сетевые события, системные вызовы, записи функций и точки трассировки ядра.

При срабатывании код сначала компилируется в байт-код BPF. В свою очередь, байт-код проверяется перед его запуском, чтобы убедиться, что он не создает цикл. Этот шаг предотвращает случайную или преднамеренную компрометацию ядра Linux программой.

После того, как программа запускается на крючке, она затем выполняет вспомогательные вызовы. Эти вспомогательные вызовы представляют собой функции, которые предоставляют eBPF множество функций для доступа к памяти. Вспомогательные вызовы должны быть предварительно определены ядром, но список существующих функций продолжает расти.

eBPF первоначально использовался как способ повышения наблюдаемости и безопасности при фильтрации сетевых пакетов. Однако со временем это стало способом сделать реализацию пользовательского кода более безопасной, удобной и производительной.

Преимущества eBPF

eBPF обычно используется для отслеживания процессов в пользовательском пространстве, и здесь проявляются его преимущества. Это безопасный и полезный метод обеспечения:

  • Скорость и производительность. eBPF может перемещать обработку пакетов из пространства ядра в пространство пользователя. Аналогично, eBPF - это JIT-компилятор just-in-time (точно в срок). После компиляции байт-кода вызывается eBPF, а не новая интерпретация байт-кода для каждого метода.

  • Низкая навязчивость. При использовании в качестве отладчика eBPF не нужно останавливать программу, чтобы наблюдать за ее состоянием.

  • Безопасность. Программы эффективно изолированы, что означает, что исходный код ядра остается защищенным и неизменным. Этап проверки гарантирует, что ресурсы не будут перегружены программами, выполняющими бесконечные циклы.

  • Удобство. Создание кода, который подключает функции ядра, требует меньше усилий, чем сборка и обслуживание модулей ядра.

  • Унифицированная трассировка. eBPF предоставляет вам единую, мощную и доступную платформу для отслеживания процессов. Это повышает видимость и безопасность.

  • Программируемость. Использование eBPF помогает увеличить многофункциональность среды без добавления дополнительных слоев. Аналогично, поскольку код выполняется непосредственно в ядре, можно хранить данные между событиями eBPF вместо того, чтобы сбрасывать их, как это делают другие трассировщики.

  • Выразительность. eBPF является выразительным, способным выполнять функции, обычно встречающиеся только в языках высокого уровня.

Лучшие практики eBPF

Поскольку eBPF - это такая новая технология, многие вещи остаются неизученными. Лучшие практики в области eBPF все еще развиваются по мере того, как технология приобретает все большее значение. Хотя определенного набора лучших практик не существует, есть несколько вещей, которые вы можете сделать, чтобы обеспечить эффективные и действенные программы.

Если вы используете eBPF для своей экосистемы, я рекомендую вам:

  • Используйте [LLVM Clang](https://clang.llvm.org /) для компиляции C в байт-код. 

    Когда eBPF впервые появился на сцене, было необходимо закодировать и собрать программу вручную. Затем разработчики использовали ассемблер ядра для генерации байт-кода. К счастью, в этом больше нет необходимости. Clang предоставляет инфраструктуру для интерфейса и инструментария на языках Си. 

  • Используйте инструментарий BCC при написании программ BPF. 

    Коллекция компиляторов BPF (BCC) - это набор инструментов, который может помочь вам создавать эффективные программы отслеживания ядра и манипулирования ими. Он особенно подходит для задач, связанных с анализом производительности и управлением сетевым трафиком.

    ⚠️ Thanks to Simon for the translation.

    © 2022 - Sofiane Hamlaooui - Making the world a better place 🌎