8.2 KiB
Headless OBS Studio on Proxmox LXC
Данный репозиторий содержит конфигурационные файлы для развертывания obs-studio в headless-режиме внутри контейнера proxmox (lxc) с пробросом gpu и usb-устройств захвата.
Сравнение дистрибутивов
В процессе разработки были протестированы два окружения. Ниже приведен критический анализ возникших проблем:
| Характеристика | Alpine Linux | Debian 13 |
|---|---|---|
| Графический стек | wayland + cage + wayvnc |
x11 + xvfb + x11vnc |
| Работа с железом | Успешно: Стабильный захват v4l2 |
Критическая ошибка: Segfault в linux-v4l2.so |
| Управление | Проблема: Отсутствие плагина obs-websocket в репозиториях |
Успешно: Полная поддержка obs-websocket |
| Итог | Идеально для картинки, невозможно управлять удаленно | Отличное управление, невозможно использовать родной v4l2 |
Почему alpine не подошел:
Основной блокирующий фактор — отсутствие нативной сборки obs-websocket в apk репозиториях. Поскольку проект требует удаленного управления через api, alpine без сложной ручной компиляции плагина оказался нежизнеспособен.
Почему debian не подошел:
На ядре proxmox (7.0.0-3-pve) стандартный плагин linux-v4l2.so в debian 13 вызывает ошибку обращения к памяти (segmentation fault) при инициализации устройств захвата.
Текущий стек (arch + wayland)
После тестирования alpine и debian, финальным и наиболее стабильным решением стал arch в контейнере lxc. Это позволило получить доступ к свежим версиям obs-studio и плагина obs-websocket без проблем с сегфолтами ядра proxmox.
Архитектурная схема
| Компонент | Технология | Описание |
|---|---|---|
| ОС | arch linux | Свежие репозитории и ядро, обеспечивающие совместимость с современными плагинами. |
| Графический стек | wayland + cage |
Использование киоска для запуска obs-studio без тяжелого DE. |
| Удаленный доступ | wayvnc + novnc |
Доступ к gui через браузер по вэбсокету. |
| Управление | obs-websocket |
Нативная поддержка управления через api из коробки. |
| Работа с видео | v4l2-input |
Стабильная работа вэбки и карты захвата без ошибок памяти. |
Почему Arch Linux оказался идеальным решением:
Наличие obs-websocket: В отличие от alpine, пакет obs-studio в arch включает в себя актуальные плагины управления.
Исправленный v4l2: Плагин linux-v4l2.so в сборке arch не вызывает segmentation fault при инициализации устройств захвата на ядре proxmox.
Минимализм: Использование композитора cage позволяет держать потребление ресурсов на уровне alpine.
Нюансы настройки (Troubleshooting)
-
Runtime Directory: Для работы
waylandнеобходимо вручную создавать и прокидыватьXDG_RUNTIME_DIR, иначе композиторcageне сможет создать сокет. -
WLR_BACKENDS: При запуске в lxc без монитора необходимо явно указывать
WLR_BACKENDS=headlessдля корректной инициализации виртуального экрана.
Установка зависимостей
Включаем песочницу:
sed -i 's/#DisableSandbox/DisableSandbox/' /etc/pacman.conf
Инициализируем ключи для pacman:
pacman-key --init
pacman-key --populate archlinux
Устанавливаем программы:
# обновляем
pacman -Syu
# база
pacman -S obs-studio luajit cage wayvnc
# зависимости для yay
pacman -S base-devel linux-headers git nano
# видеодрайвера (в данном случае для амд)
pacman -S mesa vulkan-radeon
Далее пробрасываем устройства в контейнер с гипервизора, с guid'ами сверяемся в гостевой системе.
Пример:
dev0: /dev/dri/card0,gid=983,mode=0660,uid=0
dev1: /dev/dri/renderD128,gid=987,mode=0660,uid=0
dev2: /dev/video%N%,gid=983,mode=0660,uid=0
dev3: /dev/snd/controlC%N%,gid=995,mode=0660,uid=0
dev4: /dev/snd/pcmC%N%D0c,gid=995,mode=0660,uid=0
Перезапускаем контейнер и создаём юзера obs:
useradd -m -d /var/lib/obs -s /bin/bash obs
chown -R obs:obs /var/lib/obs
# wheel для yay
usermod -aG wheel,video,render,audio obs
Заходив в юзера и ставим yay:
# клонируем и ставим yay
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
# устанавливаем novnc из aur
yay -S novnc
systemd-units
/etc/systemd/system/obs.service
[Unit]
Description=obs
After=network.target
[Service]
Type=simple
User=obs
Group=obs
RuntimeDirectory=obs-runtime
Environment=XDG_RUNTIME_DIR=/run/obs-runtime
Environment=WAYLAND_DISPLAY=wayland-0
Environment=WLR_BACKENDS=headless
Environment=WLR_LIBSEAT_BACKEND=noop
ExecStart=/usr/bin/cage -s -- /usr/bin/obs
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
/etc/systemd/system/wayvnc.service
[Unit]
Description=wayvnc
After=obs.service
Requires=obs.service
[Service]
Type=simple
User=obs
Environment=XDG_RUNTIME_DIR=/run/obs-runtime
Environment=WAYLAND_DISPLAY=wayland-0
ExecStart=/usr/bin/wayvnc 127.0.0.1 5900
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
/etc/systemd/system/novnc.service
[Unit]
Description=novnc
After=wayvnc.service
Requires=wayvnc.service
[Service]
Type=simple
User=obs
ExecStart=/usr/bin/novnc --listen 6080 --vnc localhost:5900
Restart=always
[Install]
WantedBy=multi-user.target
Тестирование
Схема аппаратного подключения
Для тестирования захвата видео и стабильности плагинов используется цепочка преобразования сигнала из аналогового в цифровой с последующим пробросом в виртуальную среду.
Цепочка передачи сигнала
- Источник: ps2/ps3 (+ hdmi splitter для расшифровки hdcp).
- Аналоговый вывод: Проприетарный кабель av multi out → component (YPbPr).
- Конвертация: Преобразователь YPbPr + → HDMI.
- Захват: Карта видеозахвата Fifine V3 RGB.
- Хост: Сервер под управлением proxmox.

