docs: added readme
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
# 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`)*
|
||||
|
||||

|
||||
*лайв-стрим на твиче*
|
||||
Reference in New Issue
Block a user