11 KiB
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
[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:
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:
context.properties = {
default.clock.allowed-rates = [ 44100 48000 ]
}
Проверка
# Посмотреть активный 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)
Разбудить/усыпить вручную
# Усыпить немедленно
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)
Управление контейнером:
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
Управление:
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 filesresume/— 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/moviesD:\мультфильмы→/data/мультфильмыD:\сериалы→/data/сериалыD:\bbc→/data/bbcD:\downloads→/data/downloadsD:\downloads\Unsorted→/data/downloads/UnsortedD:\games→/data/games
10 torrents had no data (X:\Movies\ — lost disk, permanently gone).
Sudo / Пароль
Пароль пользователя bazzite: bazzite
Для удалённых команд через SSH:
ssh bazzite@192.168.1.86 'echo bazzite | sudo -S mount ...'
Также настроен sudo без пароля для systemctl (см. htpc-magic4pc#Деплой и sudoers):
bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl
OSTree / Обновления
/usr/local/binслетает приrpm-ostreeupgrade (новый/usroverlay)- Бинари держать в
/home/bazzite/или пересобирать после обновлений - Проверить после апдейта:
systemctl status magic4pc
KDE Xwayland настройки
~/.config/kwinrc:
[Xwayland]
EavesdropMode=2
XwaylandEisNoPrompt=true
XwaylandEisNoPrompt=true — отключает диалог разрешения XTest (нужен для magic4pc/xdotool).
Data диск (NTFS)
Диск: /dev/sda2 — WD Red 6TB (WDC_WD60EFRX, модель WD60EFRX)
ФС: NTFS, label Data
UUID: 01D99C23361E63D0
PARTUUID: 006fdb73-adc0-3620-239c-dd01e6b6df00
Размер: 5.5 TiB (2.9 TiB занято)
Монтирование:
- Точка:
/run/media/bazzite/Data - Драйвер:
ntfs-3gчерез FUSE (fuseblk), не встроенныйntfs3 - Метод: автоматическое монтирование через
udisks2(не fstab — записи в/etc/fstabнет) - Опции:
rw,nosuid,nodev,noatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2
Содержимое:
games/— non-Steam игры и установки (Discworld Noir, discnoir, GTA V и др.)downloads/— загрузки (ISO, торренты)Windows/— прошлая Windows-установка (read-only)- Steam Library на этом разделе отсутствует — в
libraryfolders.vdfзарегистрирована только дефолтная библиотека~/.local/share/Steam
Важно: NTFS-3G не поддерживает Windows ACLs и имеет ограниченную поддержку симлинков. Для Proton prefix'ов symlink'и в drive_c/ могут работать некорректно. При появлении проблем — рассмотреть переход на ntfs3 (встроенный драйвер ядра) или fstab-монтирование с uid=1000,gid=1000,fmask=113,dmask=002.
Steam Storage Manager предлагает отформатировать этот раздел — это нормально, потому что на нём нет структуры Steam Library (steamapps/). Игнорировать.