# 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 (SSH + торренты + rsync-файл) | | `transmission-sleep-guard` | disabled | старый, отключён (дублировал и держал ингибитор постоянно) | ### Логика guard **Всегда (вне зависимости от времени):** - Активная SSH сессия → держит inhibitor (HTPC не спит) - Файл `/tmp/rsync-active` существует → держит inhibitor (rsync, бэкап и т.п.) **Дневное окно (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) Патч 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