Прадстаўлены першы выпуск бібліятэкі 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