Зачем ваша AI-камера шпионит за вами?
Вы купили умную камеру. Она распознает лица, анализирует эмоции, следит за домашними животными. Удобно? Да. А знаете ли вы, что каждый кадр летит в неизвестные облака, где его обрабатывают модели, обученные на чужих данных? Ваша приватность — это побочный продукт, который компаниям не интересно защищать.
Локальные LLM на домашнем железе — это только половина решения. Что насчет микрофонов, камер, датчиков движения? Они остаются черными ящиками, которые проще всего взломать. paiOS — это ответ на этот парадокс.
Если вы просто хотите запустить Llama на Orange Pi, у меня есть отдельный гайд. Здесь же мы строим систему, где даже ядро ОС не доверяет вашим сенсорам.
Что такое paiOS и почему Rust?
paiOS (private AI OS) — это микроядро на Rust, построенное вокруг одной идеи: сенсоры — это периферийные устройства, которые должны быть изолированы от основной системы. Не «доверяй, но проверяй», а «не доверяй вообще».
Архитектура проста до гениальности:
- Микроядро на 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:
- Поддержка Raspberry Pi 5 (уже в тестировании)
- Интеграция с Ollama для локальных LLM
- Автоматическая верификация прошивки через measured boot
- Графический интерфейс на основе Wayland в изолированном контейнере
Самое интересное: мы работаем над формальной верификацией ядра на Rust с помощью Spec-Driven Development. Хотим доказать, что ни один байт из камеры не может попасть в сеть.
Попробуйте собрать paiOS. Даже если не получится с первого раза, вы поймете, как должна работать приватность в мире, где каждое устройство хочет отправить ваши данные в облако.
А если соберете — напишите, какие модели AI запустили. Самый интересный кейс получит доступ к тестовой ветке с поддержкой нескольких USB-NPU ускорителей.