May 15, 2020

Логическое объединение нескольких файловых систем при помощи mergerfs

FUSE-модуль Mergerfs позволяет логически объединить несколько файловых
систем в одну, например, для объединения разнесённых на разные диски коллекции
видео или музыки в одну иерархию.

В отличие от aufs и overlayfs в mergerfs не создаётся отдельного слоя для
записи и данная ФС не может применяться поверх разделов, доступных в режиме
только для чтения. Но mergerfs даёт возможность прямой записи в
примонтированный раздел в соответствии с заданной политикой, например, запись
может осуществляться в ФС, в которой больше свободного места. Также можно
включить в один сводный раздел ФС, доступную на запись, и ФС только для чтения.
В такой конфигурации операции записи будут производиться в разделе, который
допускает запись.

Среди особенностей mergerfs: настройка поведения размещения новых файлов,
работа в пространстве пользователей через FUSE, поддержка расширенных
атрибутов (xattrs) и смены атрибутов chattr, работа с различными ФС, поддержка
POSIX ACL.

Проектом собираются пакеты для Fedora, Debian и Ubuntu.

Устанавливаем mergerfs в Fedora 31:

wget https://github.com/trapexit/mergerfs/releases/download/2.29.0/mergerfs-2.29.0-1.fc31.x86_64.rpm sudo dnf install mergerfs-2.29.0-1.fc31.x86_64.rpm


Допустим, в системе есть два раздела /disk1 и /disk2, на которых имеются каталоги с видео:

$ df -hT | grep disk /dev/sdb1 ext4 23M 386K 21M 2% /disk1 /dev/sdc1 ext4 44M 1.1M 40M 3% /disk2 $ ls -l /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file1.mkv $ ls -l /disk2/Videos/ total 2 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file2.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 file3.mkv


Создадим логический раздел /media, который будет включать в себя как /disk1, так и /disk2:

$ sudo mergerfs -o defaults,allow_other,use_ino,category.create=mfs,moveonenospc=true,minfreespace=1M /disk1:/disk2 /media
где

defaults - применение настроек по умолчанию allow_other - возможность доступа непривилегированных пользователей, а не только root use_ino - манипуляция исходными inode вместо libfuse для того, чтобы связанные файлы имели одинаковые inode. category.create=mfs - распределение новых файлов в зависимости от доступного свободного пространства. moveonenospc=true - в случае сбоя записи искать раздел с большим свободным местом. minfreespace=1M - минимальное свободное место для записи. disk1 - первый подключаемый раздел disk2 - второй подключаемый раздел /media - точка монтирования

После монтирования получим:

$ df -hT | grep media 1:2 fuse.mergerfs 66M 1.4M 60M 3% /media
Если скопировать в /media/Videos/ большой новый файл, для которого не хватает
места в /disk1, но который вмещается в /disk2, то это файл будет размещён в
разделе /disk2. Разделы /disk1 и /disk2 после монтирования остаются доступны
для любых операций, /media объединяет их лишь логически.

$ ls -lh file4.mkv -rw-rw-r--. 1 curt curt 30M Apr 20 08:45 file4.mkv $ cp file4.mkv /media/Videos/ $ ls -l /disk1/Videos/ total 1 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file1.mkv $ ls -l /disk2/Videos/ total 30003 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file2.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 file3.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 file4.mkv $ ls -l /media/Videos/ total 30004 -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file1.mkv -rw-rw-r--. 1 curt curt 0 Mar 8 17:21 file2.mkv -rw-r--r--. 1 curt curt 0 Mar 8 17:17 file3.mkv -rw-rw-r--. 1 curt curt 30720000 Apr 20 08:47 file4.mkv

Источник: The OpenNET Project