Files
obsidian-vault/family/how-to/htpc-system.md
T
2026-05-29 09:01:25 +00:00

245 lines
9.2 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:0023:00):**
- Торренты активны → держит systemd inhibitor (HTPC не спит)
- Торренты не активны → inhibitor не держится, machine idle
**Ночное окно (23:0011: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).