paiOS: Сборка ОС на Rust для приватного AI на Radxa RK3588 - Гайд | AiManual
AiManual Logo Ai / Manual.
15 Янв 2026 Гайд

paiOS: Как собрать локальную ОС на Rust для приватных AI-устройств (на примере Radxa RK3588)

Пошаговая сборка приватной ОС paiOS на Rust для AI-устройств. Архитектура доверия, изоляция сенсоров, работа с USB-NPU ускорителями на примере Radxa Rock 5C.

Зачем ваша AI-камера шпионит за вами?

Вы купили умную камеру. Она распознает лица, анализирует эмоции, следит за домашними животными. Удобно? Да. А знаете ли вы, что каждый кадр летит в неизвестные облака, где его обрабатывают модели, обученные на чужих данных? Ваша приватность — это побочный продукт, который компаниям не интересно защищать.

Локальные LLM на домашнем железе — это только половина решения. Что насчет микрофонов, камер, датчиков движения? Они остаются черными ящиками, которые проще всего взломать. paiOS — это ответ на этот парадокс.

Если вы просто хотите запустить Llama на Orange Pi, у меня есть отдельный гайд. Здесь же мы строим систему, где даже ядро ОС не доверяет вашим сенсорам.

Что такое paiOS и почему Rust?

paiOS (private AI OS) — это микроядро на Rust, построенное вокруг одной идеи: сенсоры — это периферийные устройства, которые должны быть изолированы от основной системы. Не «доверяй, но проверяй», а «не доверяй вообще».

💡
Rust выбран не потому, что это модно. Его система владения и заимствования (ownership/borrowing) позволяет на уровне компиляции гарантировать, что драйвер камеры не прочитает память модели LLM. Попробуйте сделать это на C — получите уязвимость нулевого дня через месяц.

Архитектура проста до гениальности:

  • Микроядро на Rust (менее 10 000 строк)
  • Драйверы сенсоров в изолированных песочницах (seccomp, namespaces)
  • AI-модели работают в отдельных контейнерах с доступом только к своим сенсорам
  • Нет сетевого стека в ядре — только IPC между компонентами
  • Все данные шифруются на лету, ключи хранятся в TPM/secure element

На Radxa RK3588 это особенно актуально — у платы есть NPU (6 TOPS), который можно использовать для локальной обработки, не отправляя ни байта в облако.

Подготовка: что нужно перед сборкой

Не пытайтесь собрать это на основной машине. Вам понадобится:

Компонент Минимальные требования Рекомендации
Хост-машина Ubuntu 22.04, 4 ядра, 8 ГБ RAM Docker или LXC для изоляции сборки
Целевое устройство Radxa Rock 5C (RK3588) Версия с 8 ГБ RAM для моделей 7B
Периферия USB-камера, микрофон USB-NPU ускоритель (например, Hailo-8)
Хранилище MicroSD 32 ГБ NVMe через адаптер для скорости

Совет из практики: если у вас уже есть ферма из б/у видеокарт для LLM, не используйте ее для сборки. Сборка требует стабильности, а не raw производительности. Лучше взять отдельный мини-ПК.

1 Установка toolchain и зависимостей

Первая ошибка новичков — пытаться собрать кросс-компилятор вручную. Не делайте так:

# НЕ ДЕЛАЙТЕ ЭТОГО
apt install gcc-arm-linux-gnueabihf
rustup target add armv7-unknown-linux-gnueabihf

Вместо этого используйте готовый toolchain от Radxa:

# Скачиваем официальный toolchain
wget https://github.com/radxa/rkbin/raw/master/tools/linux-x86_64/aarch64-linux-gnu-

# Устанавливаем Rust с поддержкой aarch64
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add aarch64-unknown-linux-gnu

# Устанавливаем зависимости для сборки ядра
sudo apt install build-essential flex bison libssl-dev libelf-dev \
     python3-pip device-tree-compiler

2 Клонирование и настройка репозитория paiOS

Официальный репозиторий находится в ранней стадии. Я рекомендую форк с исправлениями для RK3588:

git clone https://github.com/private-ai-os/paios.git
cd paios

# Переключаемся на ветку с поддержкой Rock 5C
git checkout rock5c-experimental

# Конфигурируем ядро под нашу плату
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rock5c_defconfig

Здесь важно: не используйте `menuconfig` для первого запуска. Готовый defconfig уже включает:

  • Драйверы MIPI-CSI для камер
  • Поддержку NPU через rknpu-driver
  • Изоляцию памяти с помощью IOMMU
  • Минимальный набор драйверов USB (для ускорителей)

Если вы добавите лишние драйверы (например, сетевые), вы сломаете концепцию изоляции. Сеть должна работать в userspace через VPN, а не в ядре.

3 Сборка ядра и initramfs

Сборка ядра — это просто. Сложность в initramfs, который должен содержать минимальный набор утилит для запуска контейнеров.

# Сборка ядра
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

# Создаем директорию для initramfs
mkdir -p initramfs/{bin,dev,proc,sys}

# Копируем busybox (статически скомпилированный)
cp /path/to/busybox-aarch64 initramfs/bin/

# Создаем минимальный init скрипт
cat > initramfs/init << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev

# Запускаем менеджер контейнеров (наш основной процесс)
exec /bin/container-manager
EOF
chmod +x initramfs/init

# Собираем initramfs
(cd initramfs && find . | cpio -o -H newc | gzip) > initramfs.cpio.gz

4 Создание загрузочного образа для Radxa RK3588

Radxa использует комбинированный образ с U-Boot. Порядок сборки критичен:

# Клонируем rkbin с firmware
git clone https://github.com/radxa/rkbin.git

# Используем утилиты из rkbin для создания образа
cd rkbin
./tools/mkimage -n rk3588 -T rksd -d bin/rk35/rk3588_ddr_lp4_2112MHz_lp5_2736MHz_v1.11.bin \
    ../idbloader.img

# Конвертируем ядро в формат для U-Boot
../tools/mkimage -A arm64 -O linux -T kernel -C none -a 0x00280000 -e 0x00280000 \
    -n "paiOS" -d ../arch/arm64/boot/Image ../kernel.img

# Создаем образ с initramfs
cat ../arch/arm64/boot/dts/rockchip/rk3588-rock-5c.dtb ../initramfs.cpio.gz > ../resource.img

# Объединяем все в один образ
cat idbloader.img ../kernel.img ../resource.img > ../paios-rock5c.img

Проверьте размеры каждого компонента. Если initramfs больше 32 МБ, U-Boot не загрузит его. Используйте `strip` для бинарных файлов и удалите ненужные утилиты.

5 Запись на карту и первый запуск

Используйте не microSD, а USB-флешку для тестов. Так проще перезаписывать:

# Определяем устройство флешки (ОСТОРОЖНО!)
lsblk

# Записываем образ (замените /dev/sdX на ваше устройство)
sudo dd if=paios-rock5c.img of=/dev/sdX bs=4M status=progress
sync

Подключите флешку к Radxa Rock 5C, зажмите кнопку recovery и подайте питание. Через UART (USB-C to serial) вы должны увидеть:

U-Boot 2023.04
Starting paiOS microkernel...
Container manager started
Isolating camera device /dev/video0
NPU initialized at 0xfdab0000
Secure enclave: TPM2.0 detected

Подключаем AI-модели и сенсоры

Пустое ядро бесполезно. Добавим контейнер с моделью для распознавания объектов:

// Пример драйвера камеры в песочнице
use seccomp::*;
use nix::sched::*;

fn isolate_camera() -> Result<(), Box> {
    // Создаем новый namespace
    unshare(CloneFlags::CLONE_NEWNS | CloneFlags::CLONE_NEWPID)?;
    
    // Настраиваем seccomp фильтр
    let mut filter = SeccompFilter::new(
        vec![].allow(), // Блокируем все системные вызовы
    )?;
    
    // Разрешаем только open, read, ioctl для /dev/video0
    filter.add_rule(
        ScmpSyscall::new("open"),
        Compare::arg(0).with(0).using(Op::Eq).build()?,
        Action::Allow,
    )?;
    
    // Применяем фильтр
    filter.load()?;
    
    // Теперь драйвер может работать только с камерой
    Ok(())
}

Контейнер с моделью YOLO получает доступ только к изолированному буферу камеры:

Компонент Доступные ресурсы Изоляция
Драйвер камеры /dev/video0, 64 МБ RAM PID namespace, seccomp
YOLO контейнер NPU, буфер камеры (read-only) cgroups, capabilities
Результаты Shared memory с UI контейнером Только запись

USB-NPU ускорители: боль и радость

Встроенный NPU RK3588 дает 6 TOPS. Для моделей 7B этого мало. Подключаем внешний ускоритель, например, Hailo-8 через USB3.

Проблема: стандартные драйверы Linux дают полный доступ к устройству. Наше решение:

# Создаем виртуальную функцию USB через IOMMU
echo 0000:01:00.0 > /sys/bus/pci/drivers/xhci_hcd/unbind
echo vfio-pci > /sys/bus/pci/devices/0000:01:00.0/driver_override
echo 0000:01:00.0 > /sys/bus/pci/drivers/vfio-pci/bind

# Теперь USB-NPU доступен только через VFIO
# Контейнер получает прямой доступ к устройству без драйверов ядра

Не используйте USB hub. Каждый ускоритель должен быть на отдельном контроллере. Иначе изоляция превращается в фикцию — устройства увидят друг друга.

Частые ошибки и как их избежать

Я собрал этот список после трех сгоревших microSD карт и одного почти испорченного Rock 5C:

  • Ошибка: Ядро падает при загрузке
    Проверьте DTB файл. Для Rock 5C нужен именно `rk3588-rock-5c.dtb`, а не общий `rk3588.dtb`
  • Ошибка: NPU не инициализируется
    Драйвер rknpu требует определенную частоту памяти. В DTS добавьте `&npu { status = "okay"; memory-region = <&npu_reserved>; }`
  • Ошибка: Контейнеры не запускаются
    В initramfs нет статически скомпилированного runc. Соберите его с `CGO_ENABLED=0`
  • Ошибка: USB устройства не определяются
    VFIO требует включенный IOMMU. В U-Boot добавьте `iommu.passthrough=1` в командную строку ядра

Что дальше? Roadmap paiOS

Текущая версия — proof of concept. В планах на 2025:

  1. Поддержка Raspberry Pi 5 (уже в тестировании)
  2. Интеграция с Ollama для локальных LLM
  3. Автоматическая верификация прошивки через measured boot
  4. Графический интерфейс на основе Wayland в изолированном контейнере

Самое интересное: мы работаем над формальной верификацией ядра на Rust с помощью Spec-Driven Development. Хотим доказать, что ни один байт из камеры не может попасть в сеть.

💡
Если вы собираете домашний ИИ-сервер на Orange Pi, подумайте — может, стоит потратить еще неделю и сделать его по-настоящему приватным? Разница в безопасности — как между бумажным замком и сейфом.

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

А если соберете — напишите, какие модели AI запустили. Самый интересный кейс получит доступ к тестовой ветке с поддержкой нескольких USB-NPU ускорителей.