Как запускать чужой код и не поседеть

09 июн 2026
4,673
207
32
16 часов

Представьте, что вам нужно выполнить кусок кода, присланный пользователем или сторонним сервисом. Обычный Docker кажется слишком тяжелым, а просто запускать в отдельном процессе — страшно. Одно неловкое движение, и ваш сервер превращается в тыкву или, что хуже, в часть ботнета. Именно для таких случаев ребята из CNCF Sandbox развивают Hyperlight.

hyperlight logo

Что это за зверь

Hyperlight — это Rust-библиотека, которая создает микро-виртуальные машины буквально на лету. Она не пытается эмулировать целый компьютер с видеокартой и клавиатурой. Вместо этого проект поднимает максимально обрезанную среду исполнения, где нет даже ядра ОС. Весь «гость» — это просто бинарник, скомпилированный под no_std Rust или C.

Главная фишка здесь в скорости. Авторы заявляют, что микро-VM запускается за миллисекунды, а вызовы функций между хостом и гостем занимают микросекунды. Это звучит как идеальный фундамент для создания собственных Serverless-платформ или безопасных плагинов.

Как это работает на практике

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

Вот как выглядит инициализация на стороне хоста:

Реклама
// Подготавливаем песочницу, пока без запуска VM
let mut sandbox = UninitializedSandbox::new(GuestBinary::FilePath(guest_path), None)?;

// Можно прокинуть функцию из хоста в гостя, например, для доступа к БД
sandbox.register("GetWeekday", || Ok("Monday".to_string()))?;

// А теперь «зажигаем» VM
let mut sandbox: MultiUseSandbox = sandbox.evolve()?;

// Вызываем функцию внутри виртуалки
let greeting: String = sandbox.call("SayHello", "World".to_string())?;
println!("{greeting}"); 

А вот так выглядит код внутри самой виртуалки. Благодаря макросам всё выглядит очень прозрачно:

#[host_function("GetWeekday")]
fn get_weekday() -> Result<String>;

#[guest_function("SayHello")]
fn say_hello(name: String) -> Result<String> {
    let weekday = get_weekday()?;
    Ok(format!("Hello, {name}! Today is {weekday}."))
}

Почему это быстрее обычных виртуалок

Секрет в тотальном минимализме. В Hyperlight нет Linux внутри Linux. Там нет драйверов файловой системы, сетевого стека или планировщика задач. Когда вы вызываете функцию, гипервизор (KVM на Linux или MSHV/WHP на Windows) просто переключает контекст процессора.

Интересная деталь: проект поддерживает механизм snapshot и restore. Если вам нужно выполнять тысячи однотипных вызовов, вы можете один раз инициализировать песочницу, сделать слепок памяти и откатываться к нему перед каждым новым запуском. Это гарантирует, что каждый вызов начинается с чистого листа, но при этом не тратится время на повторную загрузку бинарника.

Кому и зачем это нужно

Я вижу несколько сценариев, где Hyperlight может реально выстрелить.

Во-первых, это облачные функции (FaaS). Если вы строите свой аналог AWS Lambda, вам нужна изоляция уровня гипервизора, но вы не хотите ждать секунду, пока поднимется контейнер.

Во-вторых, это расширения для сложных систем. Допустим, у вас есть база данных или игровой сервер, и вы хотите дать пользователям возможность писать свои скрипты. Lua или WASM — это круто, но Hyperlight дает еще более жесткую изоляцию и позволяет писать на привычном Rust или C.

Кстати, в репозитории есть ссылки на смежные проекты, например, hyperlight-wasm и hyperlight-js. Это значит, что внутри этих микро-VM уже можно запускать WebAssembly или JavaScript, что делает инструмент еще универсальнее.

Нюансы и ограничения

Проект находится в статусе pre-1.0. Это значит, что API может поменяться в любой момент, а документация местами заставляет чесать затылок.

Важный момент: Hyperlight не предназначен для запуска обычных Linux-приложений. Вы не сможете запустить там ls или curl, потому что системных вызовов просто не существует. Если вам нужно именно это, придется смотреть в сторону Unikraft или полноценных VMM вроде Firecracker. Здесь же мы говорим о чистом коде в вакууме.

Стоит ли пробовать

Если ваша задача — безопасно выполнить небольшой кусок кода с минимальными задержками, Hyperlight выглядит очень перспективно. Он дает ту самую золотую середину между «дырявыми» процессами и тяжеловесными виртуалками.

Начать проще всего через GitHub Codespaces, ссылка на которые есть прямо в README. Там уже настроено всё окружение, включая KVM, так что можно потыкать примеры без настройки локальной машины. Проект активно живет под крылом CNCF, проводятся регулярные созвоны сообщества, так что шансы на долгое плавание у него приличные.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.