Как включить и правильно настроить дедупликацию на файловой системе btrfs на NAS Asustor модели AS6804T?

В Asustor (ADM 5.1.2.RE51) в поставляемом софте есть поиск файлов-дубликатов, но отсутствует дедупликация на уровне файловой системы. Мне нужно освободить место, не удаляя «лишние» файлы из директорий. <br/> <br/> Насколько я понимаю, дедупликация для btrfs делается сторонними утилитами (в первую очередь интересует bees), но не ясно, что из этого реально запустить на NAS. Как правильно установить и настроить такую утилиту — напрямую в системе ADM или внутри Docker? В случае Docker: как настроить контейнер, чтобы он имел доступ к файловой системе, которую нужно дедуплицировать? <br/> <br/> Судя по документации, в ADM 5 используется собственный менеджер пакетов apkg и свой формат пакетов (.apk), не имеющий отношения к Android.
  • 17 февраля 2026 г. 15:01
Ответы на вопрос 2
Короткий ответ сразу: btrfs‑дедупликация на Asustor делается не «включением в ADM», а сторонними утилитами (duperemove / bees / пр.). Практически самый надёжный и удобный путь — запустить dedupe‑утилиту в Docker‑контейнере (или собрать её через Entware/апк на самой системе), смонтировать нужный btrfs‑том в контейнер и дать контейнеру соответствующие привилегии (CAP_SYS_ADMIN или --privileged). Ниже — подробный план, рекомендации и примеры команд.

1) Важные замечания перед началом
- Сделайте резервную копию критичных данных и протестируйте на небольшой тестовой папке. Дедупликация влияет на размещение данных на диске — ошибка/сбой в процессе может быть неприятен.
- Дедупликация работает только для файлов, находящихся на одном и том же btrfs‑файловом системе (но может работать и между субволюмами на той же FS).
- Технические требования: операции dedupe используют btrfs ioctl (BTRFS_IOC_DUP_RANGE и т.п.). Для выполнения из контейнера нужен root и CAP_SYS_ADMIN (или --privileged).
- Учтите снапшоты: если у вас есть снапшоты, дедупликация может или уменьшать занимаемый объём (общие экстенты) либо эффекта будет меньше — всё зависит от того, какие данные и где хранятся. Всегда проверяйте размер до/после.
- Dedupe CPU/IO‑тяжёлое: запускайте в непиковое время, пользуйтесь nice/ionice.

2) Какую утилиту выбрать
- Рекомендую duperemove — активнее поддерживается, прост в использовании и предназначен для btrfs block‑level dedupe.
- Bees — тоже встречается, но часто менее поддерживается; можно использовать, но чаще практикуют duperemove.
- Альтернативы (hardlinking, fdupes + hardlink) меняют inode (могут ломать приложения, права отслеживания и т.п.) — не всегда желательный вариант.

3) Вариант A — запуск в Docker (рекомендованный, безопасный)
Плюсы: не лезете в системные пакеты ADM, легко удалить контейнер, используете стандартные дистрибутивы.

Пример Dockerfile (для сборки образа с duperemove):
(пример для x86_64 — AS6804T это Intel, поэтому OK)

Dockerfile:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y duperemove btrfs-progs git build-essential \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /data
ENTRYPOINT ["/bin/bash"]

Сборка:
docker build -t duperemove:latest .

Запуск контейнера — примеры:
- Простой запуск интерактивно, с доступом к папке на NAS:
docker run --rm -it \
  --cap-add SYS_ADMIN \
  -v /volume1/YourShare:/data:rw \
  duperemove:latest /bin/bash

Если вы не уверены, можно использовать --privileged вместо --cap-add SYS_ADMIN (но это более «широко»):
docker run --rm -it --privileged -v /volume1/YourShare:/data:rw duperemove:latest /bin/bash

Почему так: duperemove вызывает btrfs ioctl на файловых дескрипторах. Если путь /volume1/YourShare — это точка монтирования бtrfs на хосте, привязка её в контейнер даст утилите возможность выполнить ioctl, но для этого контейнеру нужны права CAP_SYS_ADMIN.

Примеры команд внутри контейнера
- Сканирование (без применения изменений) — сначала протестируйте:
duperemove -rnh /data

Объяснение флагов (duperemove):
- -r — рекурсивно
- -n — только поиск (no‑dedupe) — не вносит изменений, выводит результаты
- -h — человекочитаемый вывод

- Выполнение дедупликации:
duperemove -drh /data

- Можно использовать --hashfile чтобы сохранять и возобновлять расчёт хэшей:
duperemove -drh --hashfile /tmp/dupes.hash /data

- Рекомендуется запускать с nice/ionice и логированием:
nice -n 10 ionice -c2 -n7 duperemove -drh --hashfile /tmp/dupes.hash /data 2>&1 | tee /tmp/duperemove.log

4) Вариант B — установка прямо в ADM (apkg / Entware)
- Теоретически можно установить Entware (opkg) или собрать пакет под ADM, и установить duperemove/bees нативно. Это сложнее: нужно подходящий toolchain/пакет для архитектуры и часто править зависимости.
- Плюс нативной установки — не нужен Docker и привилегии контейнера. Минус — вмешательство в систему ADM, возможные ограничения доступа, сложность сборки и поддержки.
- Если хотите идти этим путём — ищите готовые пакеты в сообществе Asustor / Entware. Если не уверены, лучше Docker.

5) Остальные практические советы и типичные проблемы
- Проверьте, что путь, который вы монтируете в контейнер, находится на btrfs: на хосте:
mount | grep /volume1/YourShare
или
df -T /volume1/YourShare

- До и после проверяйте занятое место/статистику btrfs:
btrfs filesystem df -h /volume1
btrfs filesystem du -s /volume1/YourShare

- Маленький тест: скопируйте пару одинаковых файлов в тестовую папку и запустите dedupe, убедитесь, что space уменьшился как ожидается.

- Совместимость с компрессией: если на FS включена компрессия, это может влиять на поведение; обычно dedupe работает на уровне необработанных экстентов, но проверяйте на тесте.

- Где могут быть подводные камни:
  - если файл открыт/используется активно, поведение может быть непредсказуемым;
  - если у вас много снапшотов, часть данных может «сопротивляться» освобождению пространства;
  - дублирующиеся данные, но в разных FS — не будут объединены.

6) Небольшая памятка команд для проверки и отладки (на хосте через SSH)
- узнать FS и тип:
df -Th /volume1/YourShare
- статус btrfs:
sudo btrfs filesystem show
sudo btrfs filesystem df -h /volume1
- посмотреть размеры дерикторий:
du -sh /volume1/YourShare/*

7) Про bees
- bees тоже осуществляет дедупликацию, но часто требует установки Python 2/старых зависимостей и может быть менее прост в сборке. Если хотите — можно попытаться собрать bees в контейнере аналогичным образом, но рекомендую начать с duperemove.

8) Резюме / план действий
- Включите SSH и сделайте бэкап.
- Запустите Docker‑контейнер с Ubuntu (или готовым образом) и duperemove, с привилегиями (--cap-add SYS_ADMIN или --privileged).
- Смонтируйте нужную папку внутрь контейнера (-v /volumeX/Share:/data).
- Сначала выполните сканирование (dry‑run), проверьте отчёт.
- Если результаты устраивают — запустите реальную дедупликацию (duperemove -drh ...). Используйте nice/ionice.
- Проверьте btrfs filesystem df/du до/после.

Если хотите, могу:
- Подготовить готовый Dockerfile + образ (уже настроенный) и прислать конкретные команды сборки/запуска для вашего пути (/volume1/…).
- Подсказать команды для теста на небольшой директории и объяснить формат вывода duperemove.
- Помочь с инструкцией по установке Entware/пакета на конкретную версию ADM, если хотите ставить нативно.
дедупликация btrfs требует определенную версию модуля ядра. Рекомендую утилиту duperemove, она как раз для разовой операции, требует минимум 4.5 версию ядра (вроде бы сам функционал появился раньше <br/> <br/> маловероятно что вы сможете на android что то сделать с файловой системой, даже при наличии root потребуется собирать утилиты, так как готовых под вашу версию скорее всего не будет. <br/> <br/> Лучшим решением будет подключить диски к полноценной linux, провести операцию дедупликации и вернуть назад.
Похожие вопросы