[2026-09-23] eagle: family/how-to/truenas-infrastructure.md personal/tech/truenas-local-tree-comparison.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-23 14:01:55 +06:00
1 parent 00beffc97f
commit d09c5b51b7
2 files changed
+153 -1

No files matched your search

+4 -1
View File
@@ -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**, а группы, в которой реально есть все нужные юзеры, там нет вовсе.
@@ -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` | манифест `<path>\t<size>\t<md5>` для любого локального каталога (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`