Логическое объединение нескольких файловых систем при помощи 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