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

416 lines
17 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-07-03)
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`.
### Проблема: мгновенное пробуждение после сна (diagnosed 2026-07-03)
**Симптом:** HTPC уходит в сон, но просыпается через ~8 секунд.
**Корневая причина:** несколько устройств имеют `enabled` wakeup в `/proc/acpi/wakeup`. Сразу после перехода в S3 одно из них генерирует wakeup event.
**Wakeup-устройства (`/proc/acpi/wakeup`):**
| Устройство | ACPI ID | Статус | Что это |
|---|---|---|---|
| **XHC** | 00:14.0 | **enabled** | USB 3.0 xHCI Controller (весь USB) |
| **GLAN** | 00:1f.6 | **enabled** | Ethernet I219-V (Wake-on-LAN) |
| **RP09** | 00:1d.0 | **enabled** | PCIe Root Port #9 |
| **PEG0** | 00:01.0 | **enabled** | PCIe x16 слот (видеокарта AMD RX 570) |
| USB 1-4 | 1-4 | enabled | 2.4G Wireless Keyboard |
| alarmtimer | - | enabled | ACPI программный таймер |
| LNXPWRBN | - | enabled | Кнопка питания |
| PNP0C0C | - | enabled | ACPI кнопка сна |
**Самый вероятный виновник — XHC (USB-контроллер).** На ASUS B250G с подключёнными USB-девайсами (8BitDo донглы, клавиатура 2.4G, Xbox 360 Wireless Adapter) USB-контроллер может генерировать wakeup из-за электрического шума на шине.
**Диагностика:**
```bash
# Проверить текущие wakeup-устройства
cat /proc/acpi/wakeup
# Проверить журнал пробуждений
journalctl -b-0 | grep -iE "suspend|resume|PM:" | tail -20
# Временное отключение wakeup для USB-контроллера
echo XHC > /proc/acpi/wakeup
# Временное отключение wakeup для сетевой карты
echo GLAN > /proc/acpi/wakeup
# Проверить какие USB-девайсы имеют wakeup
for dev in /sys/bus/usb/devices/*/power/wakeup; do
enabled=$(cat $dev 2>/dev/null)
if [ "$enabled" = "enabled" ]; then
echo "$(dirname $dev) -> $(cat $(dirname $dev)/product 2>/dev/null || echo unknown)"
fi
done
```
**План исправления (не выполнено):**
1. ✅ Диагностика проведена — причины идентифицированы
2. [ ] Отключить XHC и/или GLAN wakeup через `/proc/acpi/wakeup` и проверить, исчезла ли проблема
3. [ ] Если временное отключение помогло — настроить постоянное отключение через `systemd-sleep` hook (скрипт в `/usr/lib/systemd/system-sleep/`)
**Постоянное отключение (когда будет tested):**
Создать `systemd-sleep hook`:
```bash
# Создать скрипт на HTPC
cat | ssh bazzite@192.168.1.86 'sudo tee /usr/lib/systemd/system-sleep/disable-wakeup.sh'
#!/bin/bash
case "$1" in
pre)
# Отключаем wakeup USB и GLAN перед сном
echo XHC > /proc/acpi/wakeup
echo GLAN > /proc/acpi/wakeup
;;
esac
# Сделать исполняемым
ssh bazzite@192.168.1.86 'sudo chmod +x /usr/lib/systemd/system-sleep/disable-wakeup.sh'
```
### Разбудить/усыпить вручную
```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
# Диагностика пробуждения
journalctl -b-0 | grep -iE "suspend|resume|PM:|wake" | tail -20
cat /proc/acpi/wakeup
```
## 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