Files
obsidian-vault/family/how-to/htpc-system.md
T

345 lines
14 KiB
Markdown
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)
## Железо
- Motherboard: ASUS STRIX B250G GAMING
- 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 (SSH + торренты + rsync-файл) |
| `transmission-sleep-guard` | disabled | старый, отключён (дублировал и держал ингибитор постоянно) |
### Логика guard
**Всегда (вне зависимости от времени):**
- Активная SSH сессия → держит inhibitor (HTPC не спит)
- Файл `/tmp/rsync-active` существует → держит inhibitor (rsync, бэкап и т.п.)
**Дневное окно (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)
Патч 2026-05-30 (rsync-active триггер):
- Добавлена функция `rsync_active()` — проверяет существование файла `/tmp/rsync-active`
- Guard держит inhibit пока файл существует (вне зависимости от времени)
- Исправлена обработка ошибок: `torrents_active()` и `ssh_active()` обёрнуты в отдельные `try/except`
- Использование: `touch /tmp/rsync-active` (включить), `rm /tmp/rsync-active` (выключить)
### rsync-active триггер
Любой процесс может держать HTPC в бодрствующем состоянии, создав файл `/tmp/rsync-active`:
```bash
# Запретить сон (например, перед долгим rsync/bkp)
touch /tmp/rsync-active
# Разрешить сон (после завершения)
rm /tmp/rsync-active
```
Guard проверяет файл каждые 60 секунд. Сервис: `systemctl --user status htpc-sleep-guard`.
### Разбудить/усыпить вручную
```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).
## Sudo / Пароль
Пароль пользователя `bazzite`: **`bazzite`**
Для удалённых команд через SSH:
```bash
ssh bazzite@192.168.1.86 'echo bazzite | sudo -S mount ...'
```
Также настроен sudo без пароля для systemctl (см. [[htpc-magic4pc#Деплой и sudoers]]):
```
bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl
```
## Steam — остановка и запуск
**Остановка Steam (без sudo):**
```bash
systemctl --user stop gamescope-session-plus@steam
```
**Запуск Steam (после остановки):**
```bash
systemctl --user start gamescope-session-plus@steam
```
Или просто войти в Gaming Mode на TV — Steam запустится автоматически через steamos-manager.
## 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).
---
## Data диск (BTRFS)
**Диск:** `/dev/sda1` — WD Red 6TB (`WDC_WD60EFRX`, модель WD60EFRX)
**ФС:** BTRFS, label `Data`
**UUID:** `0c1bd04b-783e-4942-ad67-0639333cd210`
**Размер:** 5.5 TiB
### История монтирования
#### NTFS (legacy, до 2026-06-01)
- **Точка:** `/run/media/bazzite/Data`
- **Драйвер:** `ntfs-3g` через FUSE (`fuseblk`)
- **Метод:** fstab, затем удалён (старый UUID `01D99C23361E63D0`)
#### Текущее: BTRFS через Gnome Disks
- **Точка:** `/run/media/system/Data`
- **Метод:** Gnome Disks (User Session Defaults = OFF, Mount at system startup = ON)
- **UUID:** `0c1bd04b-783e-4942-ad67-0639333cd210`
- **Опции:** `rw,nosuid,nodev,relatime,seclabel,space_cache=v2,subvolid=256,subvol=/@,x-gvfs-show,user`
- **Статус:** Steam видит диск (Storage Manager), non-Steam shortcuts работают
**Non-Steam shortcuts paths:**
- Пути в shortcuts.vdf обновлены: `/run/media/bazzite/Data/``/run/media/system/Data/` (95 полей, 2026-06-01)
**Содержимое:**
- `games/` — non-Steam игры и установки
- `GameCenter/` — VK Play игры
- `downloads/` — загрузки (ISO, торренты)
- `nes/` — NES ROMs
- `backups/` — бэкапы saves/shortcuts
- `scripts/` — служебные скрипты
- `Steam/` — Steam библиотека Windows-наследия (18 игр, сохранена с NTFS)
**Сервисы, использующие диск:**
- SMB (htpc-samba): `/run/media/system/Data` → шара `[Data]`
- Transmission: `/run/media/system/Data/downloads``/downloads`
- Steam non-School shortcuts: пути обновлены
### План исправления (done, 2026-06-01)
1. ✅ Диск отформатирован в BTRFS (был NTFS)
2. ✅ Данные перенесены обратно
3. ✅ Монтирование через Gnome Disks (User Session Defaults = OFF, Mount at system startup = ON)
4. ✅ Старая NTFS-строка удалена из fstab
5. ✅ Пути в shortcuts.vdf обновлены на `/run/media/system/Data/`
6. ✅ Steam видит диск в Storage Manager