245 lines
9.2 KiB
Markdown
Executable File
245 lines
9.2 KiB
Markdown
Executable File
# 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
|
||
|
||
## Контроллеры
|
||
|
||
### 8BitDo Ultimate (2 шт.) — донглы
|
||
|
||
**Важно:** оба донгла 8BitDo Ultimate (`2dc8:3106`) должны быть воткнуты в **разные физические порты USB**, не подключённые через общий USB-хаб (Huasheng USB2.0 HUB на порту 006). Если оба висят на одном хабе — второй не enum'ится корректно (`#Ifs=0 Cfg#=0`, не создаёт /dev/input/js).
|
||
|
||
**Правильное расположение (рабочая конфигурация):**
|
||
- **Port 005** (прямой порт xHCI, не через хаб) → 8BitDo #1 (`E417D8D87F0C`)
|
||
- **Port 006 → Port 001** (через Huasheng HUB) → 8BitDo #2 (`E417D8C197E4`)
|
||
- **Port 006 → Port 004** → Xbox 360 Wireless Receiver
|
||
|
||
**Симптомы неправильного расположения:**
|
||
- lsusb показывает оба донгла, но второй с `#Ifs=0 Cfg#=0`
|
||
- `/dev/input/js` только один (или один из донглов не создаёт input)
|
||
- Steam видит только один контроллер
|
||
- Перестановка донгла на другой порт решает проблему
|
||
|
||
## ОС
|
||
- **Bazzite 44** (Fedora-based, immutable OSTree)
|
||
- Вариант: `bazzite-deck` (Steam Gaming Mode / gamescope)
|
||
- Пользователь: `bazzite`
|
||
- Hostname: `htpc`
|
||
- DNS: резолвится как `htpc` через роутер (192.168.1.1), см. [[router-bishkek-asus]]
|
||
|
||
## Режимы запуска
|
||
- **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
|
||
|
||
## Аудио
|
||
|
||
### Проблема
|
||
LG webOS TV по HDMI принимает **только LPCM 2ch**.
|
||
Поддерживаемые частоты: 32000 / 44100 / 48000 / 96000 / 192000 Hz, 16/20/24 bit.
|
||
|
||
**AMD HDA audio clock bug** (RX 570 + 4K@60Hz):
|
||
При pixel clock ~594 MHz (4K@60Hz) AMD HDMI audio контроллер выдаёт неправильный clock — тон 440 Hz воспроизводится как 880 Hz (в 2 раза выше). Решение — переключиться на **1080p@60Hz** (pixel clock ~148 MHz, bug не воспроизводится).
|
||
|
||
### Решение: зафиксировать 1080p
|
||
`~/.config/environment.d/gamescope.conf`:
|
||
```
|
||
GAMESCOPE_WIDTH=1920
|
||
GAMESCOPE_HEIGHT=1080
|
||
GAMESCOPE_REFRESH=60
|
||
```
|
||
|
||
### Решение: PipeWire/WirePlumber конфиги
|
||
|
||
`~/.config/wireplumber/wireplumber.conf.d/fix-hdmi.conf`:
|
||
```lua
|
||
monitor.alsa.rules = [
|
||
{
|
||
matches = [{ node.name = "~alsa_output.pci*hdmi*" }]
|
||
actions = {
|
||
update-props = {
|
||
audio.format = "S16LE"
|
||
audio.rate = 48000
|
||
session.suspend-timeout-seconds = 0
|
||
}
|
||
}
|
||
}
|
||
]
|
||
```
|
||
|
||
`~/.config/pipewire/pipewire.conf.d/99-hdmi-fix.conf`:
|
||
```conf
|
||
context.properties = {
|
||
default.clock.allowed-rates = [ 44100 48000 ]
|
||
}
|
||
```
|
||
|
||
### Проверка
|
||
```bash
|
||
# Посмотреть активный sink и его параметры:
|
||
pactl list sinks | grep -A20 "HDMI"
|
||
|
||
# Тест тона 440 Hz — должен звучать как ля первой октавы:
|
||
speaker-test -t sine -f 440 -c 2
|
||
```
|
||
|
||
## Автосон / Sleep management
|
||
|
||
### Текущее состояние (2026-05-23)
|
||
|
||
Sleep управляется `htpc-sleep-guard` — Python-скрипт + systemd-сервис.
|
||
**PowerDevil не используется для сна** — HTPC запущен в gamescope/Steam session, где PowerDevil не детектирует idle. Guard сам вызывает `systemctl suspend`.
|
||
|
||
### Сервисы
|
||
|
||
| Сервис | Статус | Роль |
|
||
|---|---|---|
|
||
| `htpc-sleep-guard` | **active/enabled** | актуальный guard |
|
||
| `transmission-sleep-guard` | disabled | старый, отключён (дублировал и держал ингибитор постоянно) |
|
||
|
||
### Логика guard
|
||
|
||
**Дневное окно (11:00–23:00):**
|
||
- Торренты активны → держит systemd inhibitor (HTPC не спит)
|
||
- Торренты не активны → inhibitor не держится, machine idle
|
||
|
||
**Ночное окно (23:00–11:00):**
|
||
- Guard отпускает ингибитор и вызывает `systemctl suspend`
|
||
- Если торренты были активны → ставит RTC wake-alarm на 11:00 (`rtcwake`)
|
||
- Если торренты не активны → будильник не ставится
|
||
|
||
### Скрипт и конфиг
|
||
|
||
Сервис: `/etc/systemd/system/htpc-sleep-guard.service`
|
||
Скрипт: путь в `ExecStart` сервиса (на HTPC, `~bazzite/`)
|
||
|
||
Патчи применённые 2026-05-23:
|
||
- **409 retry**: при HTTP 409 от Transmission обновляет `X-Transmission-Session-Id` и повторяет запрос
|
||
- **suspend trigger**: при переходе из "hold → release" вызывает `systemctl suspend` (без sudo, через polkit/logind)
|
||
|
||
### Разбудить/усыпить вручную
|
||
|
||
```bash
|
||
# Усыпить немедленно
|
||
systemctl suspend
|
||
|
||
# Пробудить через N секунд (RTC wake)
|
||
sudo rtcwake -m no -s 3600
|
||
|
||
# Проверить ингибиторы
|
||
systemd-inhibit --list
|
||
|
||
# Статус guard
|
||
systemctl status htpc-sleep-guard
|
||
journalctl -u htpc-sleep-guard -n 50 --no-pager
|
||
```
|
||
|
||
## SMB / Сетевые ресурсы
|
||
|
||
Hostname `htpc` резолвится через mDNS/avahi → отсюда `smb://htpc`.
|
||
|
||
**SMB работает через Podman-контейнер `htpc-samba`** (порты 139/445).
|
||
Логин: `bazzite` / пароль: `bazzite`
|
||
|
||
Шары:
|
||
- `[Data]` → `/run/media/bazzite/Data` (read-write)
|
||
- `[Windows]` → `/run/media/bazzite/Windows` (read-only)
|
||
|
||
Управление контейнером:
|
||
```bash
|
||
podman ps # статус
|
||
podman restart htpc-samba # перезапуск
|
||
```
|
||
|
||
System `smb.service` — **disabled** (конфликтует с контейнером, не нужен).
|
||
Конфиг контейнера: `/etc/samba/smb.conf` внутри контейнера (`/etc` примонтирован из volume).
|
||
|
||
## Transmission (торренты)
|
||
|
||
**Работает как Podman-контейнер** через quadlet:
|
||
Конфиг: `/home/bazzite/.config/containers/systemd/transmission.container`
|
||
|
||
Web UI: `http://htpc:9091`
|
||
Порты: 9091 (web), 51413 (peer)
|
||
|
||
**Маунты:**
|
||
- `/run/media/bazzite/Data/downloads` → `/downloads` (папка для загрузок по умолчанию)
|
||
- `/run/media/bazzite/Data/games` → `/games` (папка с играми)
|
||
- `/home/bazzite/.config/transmission-daemon` → `/config`
|
||
|
||
Управление:
|
||
```bash
|
||
systemctl --user restart transmission
|
||
systemctl --user status transmission
|
||
podman exec systemd-transmission ls /games # проверить маунт
|
||
```
|
||
|
||
## Windows Transmission Migration (2026-05-23)
|
||
|
||
Imported 185 torrents from Windows Transmission-daemon into HTPC Transmission.
|
||
|
||
**Source**: `/run/media/bazzite/Windows/windows/serviceprofiles/localservice/appdata/local/transmission-daemon/`
|
||
- `torrents/` — 214 .torrent files
|
||
- `resume/` — 214 resume files
|
||
|
||
**Windows drive mapping**: `D:\` = Data volume = `/run/media/bazzite/Data`
|
||
|
||
**Container mount added**: `/run/media/bazzite/Data:/data:z` (in addition to existing `/downloads` and `/games` mounts)
|
||
|
||
**Result**: 184 added, 1 duplicate, 0 errors. Total: 191 torrents.
|
||
|
||
**Path mapping inside container**:
|
||
- `D:\movies` → `/data/movies`
|
||
- `D:\мультфильмы` → `/data/мультфильмы`
|
||
- `D:\сериалы` → `/data/сериалы`
|
||
- `D:\bbc` → `/data/bbc`
|
||
- `D:\downloads` → `/data/downloads`
|
||
- `D:\downloads\Unsorted` → `/data/downloads/Unsorted`
|
||
- `D:\games` → `/data/games`
|
||
|
||
10 torrents had no data (X:\Movies\ — lost disk, permanently gone).
|
||
|
||
## 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).
|