From 92ebf370b44e5cfbc0c05450f015e8bcc2759616 Mon Sep 17 00:00:00 2001 From: Taiga Date: Fri, 3 Jul 2026 16:35:31 +0000 Subject: [PATCH] [2026-07-03] taiga-vault: family/how-to/htpc-system.md --- family/how-to/htpc-system.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/family/how-to/htpc-system.md b/family/how-to/htpc-system.md index 93014eef..edea5174 100644 --- a/family/how-to/htpc-system.md +++ b/family/how-to/htpc-system.md @@ -475,7 +475,7 @@ systemd-inhibit --what=sleep:idle --who=rsync-storage-backup --why="Data transfe | `apt-cache/` | 374M | | остальное (obsidian, watchlist-sync, var-log, tmp, docker-data) | ~100M | -**Прогресс на Toshiba (конец сессии):** ~1.2TB скопировано (67%). Не хватает ~200GB. **rsync остановлен пользователем (стоп).** +**Прогресс на Toshiba (конец сессии):** ~1.5TB скопировано (87%). **Перенос завершён.** Все папки совпадают по размеру с источником (storage без timemachine). Единственное расхождение: `obsidian/` 15M на Backup vs 12M на storage — допустимо. **Проблемы и решения (накопленные за сессию):** @@ -501,7 +501,23 @@ systemd-inhibit --what=sleep:idle --who=rsync-storage-backup --why="Data transfe 6. **--delete опасен при повторных запусках** — при перезапуске rsync с `--delete` на частично скопированную цель, rsync проверяет все файлы сначала и может удалить то, что ещё не успел скопировать при первой попытке. Лучше запускать без `--delete` на догонку, а финальный проход с `--delete` — отдельно. -7. **nohup vs screen/tmux** — `nohup` работает, но при убийстве родительского SSH процесса (например, при таймауте) дочерний процесс может получить SIGHUP. `systemd-inhibit` + `nohup` вместе решают проблему: inhibit держит процесс в отдельной cgroup. +7. **SSH сессия убивает rsync через systemd scope** — при запуске через `ssh htpc 'nohup rsync ... &'` процесс привязывается к `session-N.scope`. Когда SSH сессия закрывается, systemd убивает весь scope: `session-N.scope: Killing process PID (rsync) with signal SIGTERM`. `nohup` не спасает. + + **Решение:** запускать в отдельном scope через `systemd-run --user --scope`: + ```bash + ssh htpc 'systemd-run --user --scope -d --description="rsync ..." rsync -aHAX ...' + ``` + Флаг `-d` (detach) возвращает управление немедленно. Scope живёт независимо от SSH сессии. + +8. **SELinux xattr на ext4 мешают rsync** — если на целевом ext4 разделе SELinux контекст отличается (`unconfined_u:object_r:unlabeled_t:s0`), rsync с флагом `-X` (xattrs) пытается снять/установить `security.selinux` атрибуты и падает с `lremovexattr(...security.selinux...) failed: Permission denied (13)`. Это приводит к exit code 23, хотя все файлы скопированы. + + **Решение:** использовать `--no-xattrs` для финального прохода, или запускать с `sudo` (root может менять SELinux атрибуты). Выход 23 с ошибками только на xattr безопасно игнорировать. + +9. **NOPASSWD sudo для rsync** — создан `/etc/sudoers.d/bazzite-rsync`: + ```sudo + bazzite ALL=(ALL) NOPASSWD: /usr/bin/rsync + ``` + Установка через Python-скрипт (обход отсутствия TTY в SSH агента): `echo bazzite | sudo -S sh -c "echo '...' > /etc/sudoers.d/bazzite-rsync"` ### Агентские блокеры для администрирования HTPC @@ -520,4 +536,5 @@ systemd-inhibit --what=sleep:idle --who=rsync-storage-backup --why="Data transfe **Текущие NOPASSWD-правила на HTPC:** ```sudo bazzite ALL=(ALL) NOPASSWD: /usr/bin/systemctl +bazzite ALL=(ALL) NOPASSWD: /usr/bin/rsync ``` \ No newline at end of file