Представлено перший випуск бібліотеки Aya, що дозволяє створювати на мові Rust обробники eBPF, які запускаються всередині ядра Linux у спеціальній віртуальній машині з JIT. На відміну від інших інструментів розробки eBPF-програм, Aya не використовує libbpf і компілятор bcc, а пропонує власну реалізацію, написану на Rust, яка використовує crate-пакет libc для прямого звернення до системних викликів ядра. Для складання Aya не потрібна наявність інструментарію для мови C та заголовних файлів ядра. Код бібліотеки розповсюджується під ліцензіями MIT та Apache 2.0.
Основні можливості:
- Підтримка формату BTF (BPF Type Format), що надає інформацію про типи в псевдокод BPF для перевірки типів і зіставлення з типами, що надаються поточним ядром. Застосування BTF дозволяє створювати універсальні eBPF-обробники, які можна використовувати без перекомпіляції з різними версіями ядра Linux.
- Підтримка викликів «bpf-to-bpf», глобальних змінних та ініціалізаторів, що дозволяє оформляти програми для eBPF за аналогією зі звичайними програмами, які використовують aya як runtime, що перевизначає функції з урахуванням роботи в eBPF.
- Підтримка різних типів ядра, включаючи звичайні масиви, хеші (hash map), стеки, черги, трасування стека, а також структури для сокетів та відстеження продуктивності.
- Можливість створювати різні типи eBTF-програм, включаючи програми для фільтрації та керування трафіком, обробники cgroup та різних операцій із сокетами, XDP-програми.
- Підтримка платформ для асинхронної обробки запитів у неблокуючому режимі tokio та async-std.
- Швидка збірка, без і прив'язки до складання ядра та заголовних файлів ядра.
Проект поки що розглядається як експериментальний — API ще не стабілізовано і продовжує розвиватися. Також ще не реалізовано всі задумані можливості. До кінця року розробники розраховують довести функціональність Aya до паритету з libbpf, а у січні 2022 року сформувати перший стабільний реліз. Також планується об'єднати частини Aya, необхідні для написання коду на Rust для ядра Linux з компонентами, що працюють у просторі користувача та використовуються для завантаження, прикріплення та взаємодії з програмами eBPF.
Нагадаємо, що eBPF являє собою вбудований в ядро Linux інтерпретатор байткоду, що дозволяє створювати обробники мережевих операцій, відстежувати роботу систем, перехоплювати системні виклики, контролювати доступ, обробляти події зі збереженням хронометражу, підраховувати частоту та час виконання операцій, виконувати трасування з використанням /tracepoints. Завдяки застосуванню JIT-компіляції, байткод на льоту транслюється в машинні інструкції та виконується з продуктивністю нативного коду. XDP надає засоби для запуску BPF-програм на рівні мережного драйвера, з можливістю прямого доступу до DMA-буфера пакетів, що дозволяє створювати високопродуктивні обробники для роботи в умовах великого навантаження.
Джерело: opennet.ru