Когда фильмы, музыка и резервные копии перестают помещаться на один диск, покупать один большой необязательно: mergerfs объединяет несколько существующих файловых систем в общий каталог. Файлы при этом не размазываются по дискам, а лежат целиком на одном из них, и это важно понимать до настройки. Разберём монтирование через fstab, политики размещения, добавление диска и диагностику.
Что даёт mergerfs и чего не даёт
mergerfs — файловая система в пространстве пользователя на базе FUSE. Она показывает содержимое нескольких каталогов-веток как один общий каталог. Запись нового файла направляется в одну ветку по выбранной политике, чтение идёт из той ветки, где файл реально находится. Чтение и удаление работают прозрачно.
Это не RAID: нет ни чередования, ни чётности, ни зеркалирования. При отказе диска теряются только файлы, лежавшие на нём, но восстановить их из остальных веток нельзя. Зато пул можно собрать из дисков разного размера и с разными файловыми системами, а данные остаются обычными файлами, которые читаются без mergerfs. Для медиатеки, архива загрузок и домашнего сервера это удобно; для базы данных, виртуальных машин и активной работы с тысячами мелких файлов — плохой выбор.
Подготовка дисков
Сначала подготовьте каждую ветку как обычную файловую систему и смонтируйте её в отдельный каталог. Только после этого собирайте пул: если диск не смонтирован, mergerfs будет писать в пустую точку монтирования на системном разделе, и вы потеряете место.
sudo apt install mergerfs
sudo mkdir -p /mnt/disk1 /mnt/disk2 /mnt/pool
sudo mkfs.ext4 -L data1 /dev/sdb1
sudo blkid /dev/sdb1
Первая команда ставит пакет и зависимости FUSE, вторая создаёт точки монтирования. Третья форматирует диск, четвёртая показывает UUID для fstab. Перед mkfs проверьте имя раздела: форматирование уничтожает данные.
Монтирование пула
Ветки указываются в первом поле fstab через двоеточие. Опции задают поведение пула при создании файлов и кэширование.
/mnt/disk1:/mnt/disk2 /mnt/pool fuse.mergerfs defaults,noatime,category.create=epmfs,minfreespace=20G,moveonenospc=true,fsname=mergerfs 0 0
sudo systemctl daemon-reload
sudo mount -a
findmnt /mnt/pool
df -h /mnt/pool
Современные версии mergerfs сами управляют inode, а опция use_ino из старых руководств удалена с версии 2.35. epmfs — политика создания: сначала ищется ветка, где уже есть такой путь, затем выбирается диск с наибольшим свободным местом. minfreespace=20G не позволяет заполнить диск до нуля, moveonenospc переносит файл при нехватке места. noatime снижает лишние записи.
Если пул монтируется раньше дисков, добавьте x-systemd.requires-mounts-for=/mnt/disk1 и x-systemd.requires-mounts-for=/mnt/disk2. После правки fstab всегда выполняйте mount -a и смотрите на ошибки, а не перезагружайтесь вслепую.
Политики размещения
Политика решает, на какой диск попадёт новый файл. Для медиатеки важна предсказуемость: сериал должен лежать по возможности на одном диске, а не расползаться по всем.
- epmfs — существующий путь, затем максимум свободного места; разумный выбор по умолчанию.
- mfs — всегда самый свободный диск; хорошо для равномерного заполнения.
- ff — первый диск, где хватает места; просто, но заполняет диски по порядку.
- lfs — диск с наименьшим свободным местом; применяют редко и осознанно.
- rand — случайная ветка; годится для тестов, но не для предсказуемости.
Политики делятся на создание, действие и поиск. Для повседневной работы достаточно category.create. Не меняйте политику на ходу без понимания: уже созданные файлы не переедут, изменится только поведение новых. moveonenospc — страховка, но запас свободного места всё равно нужен.
Полезные опции
cache.files=partial включает кэширование файлов и помогает программам с отображением памяти, например медиасерверам. dropcacheonclose=true освобождает кэш после закрытия файла. cache.writeback=true включает отложенную запись, но повышает риск потери данных при внезапном сбое. posix_acl=true нужен, если вы используете ACL.
Не включайте все опции сразу. Каждая меняет семантику и может удивить приложение, которое ожидает обычную файловую систему. Начните с category.create=epmfs, а кэш добавляйте, если медиасервер жалуется на производительность.
Добавление и замена диска
sudo mkdir -p /mnt/disk3
sudo mkfs.ext4 -L data3 /dev/sdd1
sudo umount /mnt/pool
sudo mount /mnt/pool
Новый диск форматируется, монтируется в свою точку и добавляется в список веток fstab. Затем пул перемонтируется. Старые файлы не перераспределяются: новый диск получит только новые данные. Перед размонтированием остановите службы, которые пишут в пул.
При замене диска сначала скопируйте данные на новую ветку, проверьте контрольные суммы, и только потом убирайте старую из fstab. Не выдёргивайте диск из работающего пула: FUSE может вернуть ошибку ввода-вывода, и приложение запишет неполный файл.
Диагностика
findmnt -no SOURCE,OPTIONS /mnt/pool
df -h /mnt/pool
df -h /mnt/disk1 /mnt/disk2
getfattr -d -m - /mnt/pool/film.mkv
df для пула показывает суммарный объём и свободное место всех веток. getfattr из пакета attr показывает расширенные атрибуты; при включённых xattr там будет путь к реальной ветке, что помогает понять, где лежит файл.
Ошибки FUSE смотрите в journalctl -k -b | grep -i mergerfs и в dmesg. Если пул пропал после обновления ядра или перезагрузки, почти всегда виноват порядок монтирования или опечатка в fstab.
Балансировка
rsync -aHAX --remove-source-files /mnt/disk1/Фильмы/ /mnt/disk2/Фильмы/
find /mnt/disk1/Фильмы -type d -empty -delete
Автоматической балансировки нет. Когда один диск заполнен, а другой свободен, файлы переносят вручную. Делайте это при остановленных службах. --remove-source-files удаляет исходник только после успешной передачи, но каталоги остаются; пустые можно убрать отдельно.
Для больших архивов сначала скопируйте, сверьте размер и только потом удаляйте оригинал.
Ограничения и резервные копии
mergerfs не создаёт чётность и не умеет снапшоты. Для защиты от отказа диска его иногда сочетают со SnapRAID: тот считает контрольные суммы по расписанию и позволяет восстановить потерянный диск, но не даёт мгновенного отказоустойчивого массива. Для критичных данных нужен обычный бэкап на отдельный носитель, а не только пул.
Жёсткие ссылки между ветками не работают. Некоторые приложения полагаются на inotify и могут не замечать изменения, сделанные в другой ветке. Базы данных и виртуальные машины лучше держать на обычном разделе. Пул не защищает от ошибки «rm -rf»: права и резервные копии остаются вашей ответственностью.
Итог
mergerfs — простой способ собрать диски разного размера в один каталог без переформатирования и потери данных. Настройте отдельные точки монтирования, аккуратный fstab, политику epmfs и резерв на minfreespace. Не ждите от пула отказоустойчивости: это удобная надстройка над обычными файловыми системами, а не замена RAID и резервному копированию.