Files
obsidian-vault/personal/tech/truenas-local-tree-comparison.md
T

150 lines
9.4 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.
---
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`