187 lines
8.2 KiB
Markdown
187 lines
8.2 KiB
Markdown
# 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` для корректной инициализации виртуального экрана.
|
||
|
||
## Установка зависимостей
|
||
|
||
Включаем песочницу:
|
||
```bash
|
||
sed -i 's/#DisableSandbox/DisableSandbox/' /etc/pacman.conf
|
||
```
|
||
|
||
Инициализируем ключи для `pacman`:
|
||
```bash
|
||
pacman-key --init
|
||
pacman-key --populate archlinux
|
||
```
|
||
|
||
Устанавливаем программы:
|
||
```bash
|
||
# обновляем
|
||
pacman -Syu
|
||
# база
|
||
pacman -S obs-studio luajit cage wayvnc
|
||
# зависимости для yay
|
||
pacman -S base-devel linux-headers git nano
|
||
# видеодрайвера (в данном случае для амд)
|
||
pacman -S mesa vulkan-radeon
|
||
```
|
||
|
||
Далее пробрасываем устройства в контейнер с гипервизора, с **guid**'ами сверяемся в гостевой системе.
|
||
|
||
Пример:
|
||
```bash
|
||
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`:
|
||
```bash
|
||
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`:
|
||
```bash
|
||
# клонируем и ставим 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
|
||
```bash
|
||
[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
|
||
```bash
|
||
[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
|
||
```bash
|
||
[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
|
||
```
|
||
|
||
## Тестирование
|
||
|
||
### Схема аппаратного подключения
|
||
|
||
Для тестирования захвата видео и стабильности плагинов используется цепочка преобразования сигнала из аналогового в цифровой с последующим пробросом в виртуальную среду.
|
||
|
||
#### Цепочка передачи сигнала
|
||
|
||
1. **Источник:** **ps2**/**ps3** (+ **hdmi splitter** для расшифровки **hdcp**).
|
||
2. **Аналоговый вывод:** Проприетарный кабель **av multi out** → **component** (**YPbPr**).
|
||
3. **Конвертация:** Преобразователь **YPbPr** + → **HDMI**.
|
||
4. **Захват**: Карта видеозахвата **Fifine V3 RGB**.
|
||
5. **Хост**: Сервер под управлением **proxmox**.
|
||
|
||
## Скриншоты
|
||
|
||

|
||
*`novnc` — `obs-studio` запущен внутри **lxc** через `wayland` (`cage`)*
|
||
|
||

|
||
*лайв-стрим на твиче* |