[2026-05-08] HTPC Bazzite docs: system, access, magic4pc, gaming plans

This commit is contained in:
Alexey Martemyanov
2026-05-08 00:47:38 +06:00
parent ec69b917e0
commit e083cd467c
4 changed files with 257 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
# HTPC — Доступ и управление
## SSH
```bash
ssh -i ~/.ssh/id_rsa bazzite@192.168.1.86
```
Пароль sudo: `bazzite`
## Go (на HTPC)
Go установлен в `/usr/local/go/bin/go` (не в PATH по умолчанию).
Сборка: `cd ~/magic4pc && /usr/local/go/bin/go build -o magic4pc_new .`
## Git workflow (magic4pc)
- Mac: `~/Developer/magic4pc_altclient`, бранч `bazzite-linux`
- Remote `linux``ssh://bazzite@192.168.1.86/var/home/bazzite/magic4pc.git` (bare repo)
- Worktree на HTPC: `/home/bazzite/magic4pc`
- Remote `origin``https://github.com/mallexxx/magic4pc_altclient.git`
Деплой:
```bash
# На Mac:
git push linux bazzite-linux
# На HTPC:
cd ~/magic4pc && git pull && /usr/local/go/bin/go build -o magic4pc_new .
sudo systemctl stop magic4pc
sudo rm /usr/local/bin/magic4pc
sudo cp magic4pc_new /usr/local/bin/magic4pc
sudo systemctl start magic4pc
```
> ⚠️ Нельзя `cp` поверх работающего бинаря — "Text file busy". Всегда сначала `stop` → `rm` → `cp` → `start`.
## systemd сервис
Файл: `/etc/systemd/system/magic4pc.service`
```ini
[Unit]
Description=Magic Remote client for LG TV
After=network.target
[Service]
User=bazzite
Group=bazzite
ExecStart=/usr/local/bin/magic4pc-run.sh
Restart=always
RestartSec=5
StartLimitIntervalSec=0
[Install]
WantedBy=multi-user.target
```
`StartLimitIntervalSec=0` — без лимита рестартов (иначе при crash-loop убивается).
## Run script
`/usr/local/bin/magic4pc-run.sh` — ждёт X display, делает `xhost +local:`, запускает бинарь.
## ydotoold
User-юнит: `~/.config/systemd/user/ydotoold.service`
Socket: `/run/user/1000/.ydotool_socket`
Управление: `systemctl --user status ydotoold`
## Логи
```bash
journalctl -u magic4pc -n 50 --no-pager
journalctl -u magic4pc -f # live
```
+65
View File
@@ -0,0 +1,65 @@
# HTPC — Планы: Игры и Эмуляторы
## Статус системы
- [x] Bazzite установлен, автологин в Gaming Mode
- [x] 1080p@60Hz, аудио LPCM работает
- [x] LG Magic Remote работает (magic4pc)
- [x] Без пароля при входе
- [ ] EmuDeck
- [ ] Proton-GE
- [ ] MangoHud
- [ ] Эмуляторы
## Следующие шаги
### 1. EmuDeck
Установка через официальный скрипт:
```bash
# В KDE Desktop Mode (не gamescope):
curl -L https://raw.githubusercontent.com/dragoonDorise/EmuDeck/main/install.sh | bash
```
Настроит RetroArch, PCSX2, Yuzu/Ryujinx и др. автоматически.
ROM-и класть в `~/Emulation/roms/<system>/`
### 2. Proton-GE
Через ProtonUp-Qt (устанавливается из Discover или Flatpak):
```bash
flatpak install flathub net.davidotek.pupgui2
```
Или через EmuDeck — он включает ProtonUp-Qt.
### 3. MangoHud (FPS overlay)
Уже есть в Bazzite. Включить для игры:
- В Steam: Properties → Launch Options: `mangohud %command%`
- Глобально: `MANGOHUD=1` в environment
### 4. Эмуляторы (план)
| Платформа | Эмулятор | Статус |
|-----------|----------|--------|
| NES | RetroArch (Nestopia) | Через EmuDeck |
| SNES | RetroArch (bsnes/Snes9x) | Через EmuDeck |
| Sega Mega Drive | RetroArch (Genesis Plus GX) | Через EmuDeck |
| PS2 | PCSX2 | Через EmuDeck |
| N64 | RetroArch (Mupen64Plus) | Через EmuDeck |
| Switch | Ryujinx (или Suyu) | Через EmuDeck |
### 5. ROM-и
Скопировать в `~/Emulation/roms/` по папкам после установки EmuDeck.
EmuDeck сам создаст структуру директорий.
### 6. Steam ROM Manager
Входит в EmuDeck — добавляет эмуляторные игры в Steam библиотеку с обложками.
После добавления они появятся в Gaming Mode как обычные Steam игры.
## Железо — ограничения
- RX 570: Switch эмуляция может быть медленной (Vulkan поддерживается)
- i7-6800K (Broadwell-E): PS2 и Switch — проверить производительность
- 32GB RAM: достаточно для всего
## Управление в эмуляторах
Magic Remote (magic4pc) работает как мышь + клавиатура.
Для эмуляторов нужен геймпад — варианты:
- Bluetooth геймпад (PS4/PS5/Xbox)
- USB геймпад
- Настроить маппинг Magic Remote кнопок на gamepad через Steam Input (если эмулятор в Steam)
+60
View File
@@ -0,0 +1,60 @@
# magic4pc — LG Magic Remote для HTPC
## Что это
Go-клиент для LG Magic Remote (webOS приложение на TV).
Форк: https://github.com/mallexxx/magic4pc_altclient (бранч `bazzite-linux`)
Оригинал: https://github.com/netham45/magic4pc_altclient
## Архитектура
- **TV сервер**: webOS приложение на LG TV (192.168.1.75:42831), шлёт UDP
- **HTPC клиент**: `/usr/local/bin/magic4pc`, UDP-клиент на фиксированном source port **9106**
- **xdotool**: единый persistent процесс через stdin pipe — мышь и клавиши
- **ydotool**: для gamescope-специфичных команд (Ctrl+1, Ctrl+2) через `/run/user/1000/.ydotool_socket`
## Ключевые фиксы (история)
| Проблема | Решение |
|----------|---------|
| TV "service error" / не реконнектится | Фиксированный source UDP port 9106 (`ListenUDP(":9106")`) |
| TV зависает в "waiting for client" | Server keepalive timeout 10s → auto-reconnect |
| KDE XTest диалог при каждом клике | Единый xdotool процесс (не новый на каждую кнопку) |
| KDE XTest диалог при рестарте xdotool | `XwaylandEisNoPrompt=true` в kwinrc |
| Кривые координаты мыши | Динамический scale через `xdotool getdisplaygeometry` |
| Крестик слал Ctrl/a/s/d | TV keycodes 37-40 → `Left/Up/Right/Down` keysym |
| Цифры слали мусор | ASCII keycodes → `string(rune(key))` |
## Маппинг кнопок
| Кнопка | Keycode | Gaming Mode (gamescope) | KDE Desktop |
|--------|---------|------------------------|-------------|
| Красная | 403 | Ctrl+1 (Steam меню) | Super (Win) |
| Зелёная | 404 | Escape | Escape |
| Жёлтая | 405 | Ctrl+2 (Steam QAM) | Средняя кнопка мыши |
| Синяя | 406 | Правый клик | Правый клик |
| Back | 461 | Mouse X1 (back) | Mouse X1 (back) |
| Enter/OK | 13 | Return | Return |
| Ch Up | 33 | PageUp | PageUp |
| Ch Down | 34 | PageDown | PageDown |
| D-pad Left | 37 | Left | Left |
| D-pad Up | 38 | Up | Up |
| D-pad Right | 39 | Right | Right |
| D-pad Down | 40 | Down | Down |
| Play | 415 | XF86AudioPlay | XF86AudioPlay |
| Stop | 413 | XF86AudioStop | XF86AudioStop |
| Pause | 19 | XF86AudioPause | XF86AudioPause |
| Цифры 0-9 | 48-57 | 0-9 | 0-9 |
| GUIDE | 458 | Правый клик | Правый клик |
| Мышь (тач) | — | mousemove (scaled) | mousemove (scaled) |
| Тап | mousedown/up | Left click | Left click |
| Скролл | wheel | scroll 4/5 | scroll 4/5 |
## Определение сессии
`isGamescopeSession()` — читает `/proc/*/cmdline`, ищет `kwin_wayland`. Если нет → gamescope.
## Koordinаты мыши
TV шлёт координаты в пространстве 0–1920 × 0–1080.
При старте xdotool запрашивается `xdotool getdisplaygeometry` → вычисляется scale.
Работает корректно при любом разрешении экрана.
## Проблемы которые могут вернуться
- **xdotool умирает** (write error) → KDE показывает XTest диалог. Разрешить и включить `XwaylandEisNoPrompt=true`.
- **TV "service error"** — если висит намертво, cold reboot TV (выдернуть из розетки).
- **Бинарь слетает** после `rpm-ostree upgrade` → пересобрать и скопировать.
+65
View File
@@ -0,0 +1,65 @@
# HTPC — Система (Bazzite Linux)
## Железо
- CPU: Intel Core i7-6800K
- RAM: 32 GB
- GPU: AMD Radeon RX 570
- Подключение к TV: HDMI
- TV: LG webOS (192.168.1.75)
- HTPC IP: 192.168.1.86
## ОС
- **Bazzite 44** (Fedora-based, immutable OSTree)
- Вариант: `bazzite-deck` (Steam Gaming Mode / gamescope)
- Пользователь: `bazzite`
- Hostname: `htpc`
## Режимы запуска
- **Gaming Mode (gamescope-session-steam)** — автологин по умолчанию, Steam Big Picture
- **KDE Desktop** — переключение из меню Steam → "Switch to Desktop"
## Автологин
Файл: `/etc/gdm/custom.conf`
```ini
[daemon]
AutomaticLoginEnable=True
AutomaticLogin=bazzite
Session=gamescope-session-steam
```
## Переменные окружения
`/etc/environment`:
```
GAMESCOPE_DISABLE_HDR=1
```
`~/.config/environment.d/gamescope.conf`:
```
GAMESCOPE_WIDTH=1920
GAMESCOPE_HEIGHT=1080
GAMESCOPE_REFRESH=60
```
## Разрешение
- **1080p @ 60Hz** — рабочий режим
- 4K вызывает AMD HDA audio clock bug: пиксельный клок ~594 MHz → HDMI audio 880 Hz вместо 440 Hz
## Аудио
TV поддерживает только LPCM 2ch, 32000/44100/48000/96000/192000 Hz, 16/20/24 bit.
`~/.config/wireplumber/wireplumber.conf.d/fix-hdmi.conf` — S16LE, 48000 Hz, no suspend
`~/.config/pipewire/pipewire.conf.d/99-hdmi-fix.conf` — allowed-rates [44100, 48000]
## OSTree / Обновления
- `/usr/local/bin` слетает при `rpm-ostree` upgrade (новый `/usr` overlay)
- Бинари держать в `/home/bazzite/` или пересобирать после обновлений
- Проверить после апдейта: `systemctl status magic4pc`
## KDE Xwayland настройки
`~/.config/kwinrc`:
```ini
[Xwayland]
EavesdropMode=2
XwaylandEisNoPrompt=true
```
`XwaylandEisNoPrompt=true` — отключает диалог разрешения XTest (нужен для magic4pc/xdotool).