Коротко — причина в том, что «внезапное» отключение питания оставляет непереписанные или незафлашенные данные в кэше (в драйвере FUSE/ntfs-3g, в USB‑контроллере флешки, в самом роутере), и NTFS при следующем монтировании считает том «грязным» (Windows ставит метку и предлагает chkdsk). Просто rw, sync, noatime частично помогают, но не устраняют все уровни кэширования и/или не используют низкоуровневые барьеры/FUA — особенно когда используется ntfs-3g через FUSE или сама флешка агрессивно кэширует данные.
Что можно сделать (порядок действий и рекомендации):
1) Самое надёжное — убрать NTFS и использовать файловую систему, которая родно поддерживается Linux (ext4, f2fs).
- ext4 с журналированием гораздо устойчивее к внезапным отключениям, при одинаковых условиях вероятность «пометки» гораздо ниже.
- Недостаток: Windows не умеет читать ext4 «из коробки», но вы можете общий доступ организовать через Samba (т. е. хранить диск в ext4 и смотреть файлы по сети).
2) Если необходимо именно NTFS (планируете физически брать флешку в Windows):
- По возможности установить и использовать kernel‑драйвер ntfs3 (Paragon/встроенный в новые ядра) вместо ntfs‑3g (FUSE). ntfs3 лучше поддерживает принудительную коммутацию данных (FUA/barriers) и надёжнее при внезапных выключениях.
- Если ntfs3 недоступен на OpenWrt, посмотрите, можно ли собрать/установить модуль или обновить ядро.
3) Настройки Samba — заставить сервер писать данные на диск сразу:
- В конфигурации smb.conf для общего ресурса добавить/включить:
- strict sync = yes
- sync always = yes
- write cache size = 0
- oplocks = no
- level2 oplocks = no
- aio read size = 0
- Эти опции уменьшают буферизацию на стороне Samba и повышают вероятность, что клиентские записи попадут на носитель немедленно.
4) Монтажные опции — минимизировать кэширование:
- sync уже включили — правильно (требует синхронных записей). Для ntfs-3g дополнительно можно поставить big_writes если есть.
- Для ext4 можно использовать data=journal и commit=1 (например, mount -o data=journal,commit=1) — это уменьшает окно потерь (но повышает износ и замедляет работу).
5) Отключение/контроль аппаратного кэша устройства:
- Некоторые флешки имеют собственные контроллеры с кешем, которые не подчиняются системным FUA/barriers. Их нельзя «полностью» отключить. Поэтому выбор качественной флешки/HDD (с поддержкой безопасного сброса буфера) помогает.
- Для дисков SATA можно пробовать hdparm -W0 /dev/sdX (выключить write caching), но для USB флешек это часто не работает.
6) Аппаратные меры — UPS / аккумулятор:
- Самое практическое решение в бытовых условиях — поставить UPS/повербанк с pass‑through или источник бесперебойного питания для роутера. Это исключит «резкие» отключения.
- Более хитро: предусмотреть питание с задержкой, чтобы роутер успевал корректно размонтировать диски при выключении питания (нужен внешний контроллер/скрипт).
7) Корректное размонтирование при плановом выключении:
- Если у вас есть способ заранее детектировать выключение питания (например, кнопка выключения или сигнал от внешнего питания), сделать скрипт, который запустит sync и umount /opt/usb до полного отключения.
8) Резервное копирование и мониторинг:
- Делайте регулярные бэкапы важных данных (чтобы не восстанавливать файлы через chkdsk).
- Логи (dmesg, syslog) помогут понять, какие ошибки I/O происходили при предыдущем падении.
Рекомендованная последовательность действий сейчас
1. Попробуйте временно перенести данные на ext4 и проверить: оставьте флешку в ext4 и имитируйте отключения — если проблема уходит, причина в слабой поддержке NTFS на роутере.
2. Если ext4 не вариант — попробуйте установить/использовать ntfs3 kernel module.
3. Параллельно включите в Samba strict sync/sync always и протестируйте.
4. Подумайте об источнике бесперебойного питания для роутера (самое реальное решение для 100% безопасности).
Если хотите, помогу:
- подсказать конкретные строки для smb.conf под OpenWrt,
- проверить, доступен ли ntfs3 в вашей сборке OpenWrt (скажите версию OpenWrt и модель роутера),
- или пошаговый план миграции флешки на ext4 с возможностью доступа из Windows (через SMB).