# 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` - 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).