From d09c5b51b7e369bf4962ad6d7e8018dde2073179 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Wed, 23 Sep 2026 14:01:55 +0600 Subject: [PATCH] [2026-09-23] eagle: family/how-to/truenas-infrastructure.md personal/tech/truenas-local-tree-comparison.md --- family/how-to/truenas-infrastructure.md | 5 +- .../tech/truenas-local-tree-comparison.md | 149 ++++++++++++++++++ 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 personal/tech/truenas-local-tree-comparison.md diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index 28fc488e..fe0f5b9a 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -301,7 +301,10 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library, 1. `/mnt/RED_2TB/Edu` = `root:root`, `drwxrwxr-x`, ACL `trivial: true`, `uid 0 / gid 0`. 2. `/mnt/RED_2TB/Edu/Маскелиаде` — `root:root`, `drwxrwx---`, ACL `trivial: true`. `owner@ ALLOW` полный, `group@ ALLOW` полный, но **`everyone@` = только `READ_ATTRIBUTES`/`READ_ACL`** (нет `READ_DATA`, нет `EXECUTE`). -3. **`Маскелиаде` — ПУСТАЯ папка** с 31.05.2026 (внутри только `.`/`..`). `find -iname "*askeli*"` по пулу → пусто. +3. **`Маскелиаде` — БЫЛА пустой папкой** с 31.05.2026 (внутри только `.`/`..`). `find -iname "*askeli*"` по пулу → пусто. + > 🔴 **УСТАРЕЛО (2026-09-23, вечер):** папка **уже не пустая** — **8.7 G, 6 подпапок** (`lesson1..4`, + > `synths`, `tametrial`), mtime 22 сен 23:56. И она **НЕ root:root** — сейчас **`root:nas_users`, + > `drwxrwxr-x`** (ACL-фикс ниже выполнен). Доступ есть. Разбор — [[personal/tech/truenas-local-tree-comparison]]. 4. Реальный объект, к которому нужен доступ — **файл в `Edu`, не в `Маскелиаде`**: `Антон Маскелиаде - Первый набросок Ableton.mp4`, 136 МБ, `root:root`, `-rwxrwx---`, 26.05.2026. 5. `Edu` держит файлы **разных владельцев** (`root`, `mallexxx`, `nas:nas_users`) — единого «владельца Edu» нет. То же и по ACL: `group@` = **gid 0**, а группы, в которой реально есть все нужные юзеры, там нет вовсе. diff --git a/personal/tech/truenas-local-tree-comparison.md b/personal/tech/truenas-local-tree-comparison.md new file mode 100644 index 00000000..fd960b34 --- /dev/null +++ b/personal/tech/truenas-local-tree-comparison.md @@ -0,0 +1,149 @@ +--- +title: Сверка локальной папки с TrueNAS (Edu/Maskeliade vs Downloads/Maskeliade) +created: '2026-09-23' +updated: '2026-09-23' +type: tech +namespace: personal +status: in-progress +tags: + - truenas + - checksum + - md5 + - comparison + - webdav + - cyrillic +related: + - '[[personal/tech/truenas-nfs4-acl-and-arrmultiuser]]' + - '[[family/how-to/truenas-infrastructure]]' + - '[[family/how-to/red2tb-dataset-map]]' +--- +# Сверка локальной папки с TrueNAS — Edu/Maskeliade vs Downloads/Maskeliade + +> Задача (2026-09-23, Alex): «проверь, папка truenas `/Edu/Маскелиаде` полностью совпадает с +> `/Users/admin/Downloads/Maskeliade`?» Сверка **не завершена** — упёрлась в кириллицу в пути. +> Ниже: факты, тупик, готовые скрипты, следующий шаг. + +## 🔴 ФАКТ №1 — доки были устаревшие, папка НЕ пустая + +Прежняя запись (`family/how-to/truenas-infrastructure.md`, раздел WebDAV 2026-09-23) гласила: +> «`Маскелиаде` — ПУСТАЯ папка с 31.05.2026 (внутри только `.`/`..`)». + +**Это устарело.** Живая проверка 2026-09-23: + +``` +drwxrwxr-x 8 root nas_users 14 Sep 22 23:56 Маскелиаде +drwxrwxr-x 3 root nas_users 50 Sep 23 00:36 lesson1 +drwxrwxr-x 3 root nas_users 74 Sep 23 00:25 lesson2 +drwxrwxr-x 3 root nas_users 67 Sep 23 00:13 lesson3 +drwxrwxr-x 3 root nas_users 36 Sep 23 00:02 lesson4 +drwxrwxr-x 3 root nas_users 14 Sep 22 23:56 synths +drwxrwxr-x 3 root nas_users 12 Sep 22 23:53 tametrial +``` + +| Метрика | Локально `/Users/admin/Downloads/Maskeliade` | TrueNAS `/mnt/RED_2TB/Edu/Маскелиаде` | +|---|---|---| +| Объём | **8.0 G** | **8.7 G** | +| Файлов | **917** (без `.DS_Store`/`._*`) | **1813** (с мусором macOS) | +| Подпапки | `lesson1..4`, `synths`, `tametrial` | те же 6 | +| Владелец | — | `root:nas_users`, `drwxrwxr-x` | + +> ✅ **ACL-фикс сработал.** Владелец-группа `nas_users` (gid 3000) и режим `drwxrwxr-x` — это +> ровно тот результат, что описан в [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] +> §«Sharing a whole tree by GROUP». Значит «нет доступа» больше не воспроизводится. + +> ⚠️ **Корень `Edu` (223 G) тоже уже `root:nas_users` `drwxrwxr-x`** — рекурсивная правка прошла +> по дереву целиком, а не только по корню. + +## Расхождение 0.7 G — причина не установлена + +Локально 8.0 G / 917 файлов, на NAS 8.7 G. Варианты (не проверено): +1. `lesson2`/`lesson3`/`lesson4` на Mac **есть** (видел в `find -size +1M`: `lesson4/407077297.mp4` 279M и др.), + значит разница не в отсутствующих уроках. +2. Вероятнее: на NAS лежат **дополнительные файлы/страницы** (сохранённые HTML с `_files/` + каталогами — они дают `._*` и `_files` мусор), либо локальная копия **обновлялась после** заливки. +3. `.DS_Store` / `._*` дают часть разницы, но не 0.7 G. + +**Без хеш-сверки утверждать «совпадает» НЕЛЬЗЯ.** Размер — не доказательство. + +## 🔴 ФАКТ №2 — кириллица в имени папки ломает удалённое выполнение + +Три попытки построить удалённый манифест упали: + +| Попытка | Что сделал | Результат | +|---|---|---| +| 1 | `SUBDIR="Maskeliade-compare"` в heredoc-скрипте | `cd: can't cd to /data/Maskeliade-compare` — переменная не была заменена, путь в латинице, папки нет | +| 2 | передал путь аргументом в `/bin/sh` внутри alpine | `cd: can't cd to /data/Maskeliade` — **`М` не выжило**: путь потерял кириллические символы при передаче | +| 3 | `pkill -f` перед запуском | ssh вернул **exit 255** (сам `pkill` уронил сессию), `scp` при этом прошёл | + +**Вывод:** передавать кириллический путь через `ssh "…$VAR…"` / `sh -c` **ненадёжно** — символы +теряются. Работает только вариант, где кириллица **не проходит через аргументы**: +зашить путь прямо в скрипт-файл (созданный `write_file` локально, залитый `scp`), либо +переименовать папку в латиницу. + +> Согласуется с известным питфоллом: кириллица валит `tirith` как `confusable_text` (HIGH, +> MITRE T1036.005) — три блокировки/апрува за сессию. См. [[family/how-to/truenas-infrastructure]]. + +## Готовые артефакты (на Mac) + +Всё в `/Users/admin/tmp-maskeliade/`: + +| Файл | Назначение | +|---|---| +| `make-local-manifest.sh` | манифест `\t\t` для любого локального каталога (macOS `md5 -q`, `stat -f %z`) | +| `remote-v2.sh` | манифест для каталога на TrueNAS: `apk add coreutils` внутри `alpine`, `md5sum`, исключает `.DS_Store` / `._*` | +| `poll.sh` | опрос прогресса: строки, ошибки, RUNNING/DONE | +| `local.tsv` | ✅ **готов** — 917 файлов, `/Users/admin/Downloads/Maskeliade` | + +> ⚠️ **На TrueNAS у `truenas_admin` НЕТ `md5`/`md5sum`/`lsusb`** — хеши считать только внутри +> контейнера (`alpine:latest` + `coreutils`). Тот же приём, что `strings` вместо `sqlite3`. + +## Рабочий рецепт (при латинском пути) + +```bash +# 0. один раз: переименовать папку в латиницу (убирает ВСЕ проблемы выше) +# Edu/Маскелиаде → Edu/Maskeliade (делает Alex) + +# 1. локальный манифест +bash /Users/admin/tmp-maskeliade/make-local-manifest.sh \ + /Users/admin/Downloads/Maskeliade /Users/admin/tmp-maskeliade/local.tsv + +# 2. удалённый манифест (путь ЛАТИНИЦЕЙ, зашит в скрипт, залит scp) +scp -q /Users/admin/tmp-maskeliade/remote-v2.sh \ + truenas_admin@mallexxx.duckdns.org:/mnt/RED_2TB/storage/cmp-remote-v2.sh +ssh truenas_admin@mallexxx.duckdns.org \ + "nohup sh /mnt/RED_2TB/storage/cmp-remote-v2.sh /mnt/RED_2TB/Edu/Maskeliade \ + > /tmp/remote-manifest.tsv 2>/tmp/remote-err.txt & echo STARTED" + +# 3. забрать и сравнить +scp -q truenas_admin@mallexxx.duckdns.org:/tmp/remote-manifest.tsv /Users/admin/tmp-maskeliade/remote.tsv +join -t$'\t' -j1 -a1 -a2 -e MISSING -o 0,2.2,3.2,2.3,3.3 \ + <(sort /Users/admin/tmp-maskeliade/local.tsv) \ + <(sort /Users/admin/tmp-maskeliade/remote.tsv) \ + | awk -F'\t' '$2!=$3 || $4!=$5' +# пустой вывод = полное совпадение по содержимому +``` + +**Ожидаемое время:** ~5–10 мин на хеширование 8.7 G (сеть `192.168.1.x ↔ 192.168.2.x` — только +через внешку, ~104 ms RTT; хеши считаются **на NAS**, на Mac идёт только текст манифеста). + +## Следующий шаг + +1. **Решить развилку** (Alex): разрешить запускать `ssh` без апрува на время сверки — **или** + переименовать `Edu/Маскелиаде` → `Edu/Maskeliade` и сверять напрямую. +2. Догнать `remote.tsv`, сравнить, отдать три списка: нет на NAS / нет локально / содержимое разное. +3. **После сверки — поправить устаревшие доки** (см. ниже). + +## Что нужно поправить в доке после завершения + +| Док | Что устарело | +|---|---| +| `family/how-to/truenas-infrastructure.md` §WebDAV | «`Маскелиаде` — ПУСТАЯ папка» ❌ → сейчас 8.7 G, 6 подпапок | +| `family/how-to/truenas-infrastructure.md` §WebDAV | «план фикса согласован, НЕ выполнен» ❌ → **выполнен**, `root:nas_users`, `drwxrwxr-x` | +| `family/how-to/red2tb-dataset-map.md` §«Кто владелец Edu» | «применённый план (согласован, не выполнен)» ❌ → выполнен | +| `family/how-to/truenas-infrastructure.md` §WebDAV | реальный объект «файл в `Edu`, не в `Маскелиаде`» ❌ → объект теперь **папка** `Маскелиаде` | + +## Ссылки + +- [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — ACL-рецепт `nas_users`, ставший причиной нынешнего `root:nas_users` +- [[family/how-to/truenas-infrastructure]] — общая инфраструктура, WebDAV +- [[family/how-to/red2tb-dataset-map]] — карта датасетов, владельцы `Edu`