Объединение нескольких файловых систем без создания массива

Предположим, у вас есть 40 гигабайт данных и три диска по 20 гигабайт, на которые эти данные нужно разместить.
Вариантов для размещения данных не так много. Либо создавать RAID-массив (LVM), либо распределять данные по отдельным файловым системам. Но это неудобно. В первом случае мы часть пространства потеряем при создании массива под служебную информацию, во втором как-то надо распределять данные, и при этом помнить, что куда положил.

Существует программа mhddfs, работающая как модуль для FUSE, позволяющий объединить несколько смонтированных файловых систем в одну. Предположим, мы примонтировали наши три диска в соответствующие поддиректории в директории /mnt:

$ df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/sda1 20G 12G 8G 60% /mnt/disk1
/dev/sdb1 20G 18G 2G 90% /mnt/disk2
/dev/sdc1 20G 10G 10G 50% /mnt/disk3
...

Установим mhddfs. Например, для Debian и Ubuntu это будет такая команда:

# apt-get install mhddfs

После установки FUSE можно создать новую точку монтирования и подключить туда эти файловые системы. Это можно сделать и без прав рута. Для того, чтобы файловая система была доступна другим пользователям, а не только тому, который ее смонтировал, используется ключ «allow_others»:

$ mkdir /home/user/big_drive
$ mhddfs /mnt/disk1,/mnt/disk2,/mnt/disk3 /home/user/big_drive -o allow_others
option: allow_other (1)
mhddfs: directory '/mnt/disk1' added to list
mhddfs: directory '/mnt/disk2' added to list
mhddfs: directory '/mnt/disk3' added to list
mhddfs: move size limit 4294967296 bytes
mhddfs: mount point '/home/usert/big_drive'

Результат работы команды «df -h» будет такой:

$ df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/sda1 20G 12G 8G 60% /mnt/disk1
/dev/sdb1 20G 18G 2G 90% /mnt/disk2
/dev/sdc1 20G 10G 10G 50% /mnt/disk3
mhddfs 60G 40G 20G 53% /mnt/user/big_drive

Виртуальная файловая система создана. Она имеет объем, составляющий сумму объемов отдельных файловых систем. Если войти в папку /mnt/user/big_drive, то можно увидеть, что там находятся файлы, расположенные во всех трех файловых системах, которые скомбинированы в папке /mnt/user/big_drive.

При создании файлов и директорий внутри «большой» директории реальный диск будет выбран для записи автоматически, в зависимости от свободного места на нем и порядка перечисления при монтировании. Если на первом диске свободного места больше, чем «move size limit» (параметр mlimit, по умолчанию 4 гигабайта), то файл будет создан на нем. Если меньше, то на втором. Если на втором тоже места меньше, чем mlimit, то файл будет создан на третьем. Если же свободного места на каждом из дисков осталось меньше, чем mlimit, то запись будет производиться на диск, на котором просто больше свободного места. Если место закончится прямо во время записи файла, то ошибки записи не возникнет, а уже записанная часть файла будет перемещена на другой диск, и файл будет дописываться уже туда.

Для автоматического монтирования виртуальной объединенной файловой системы можно записать в /etc/fstab следующую строчку:

mhddfs#/mnt/disk1,/mnt/disk2,/mnt/disk3 /home/user/big_drive fuse defaults,allow_other 0 0

При покупке одного большого диска вы сможете просто скопировать содержимое большой файловой системы (или содержимое каждой из «маленьких» по отдельности, если большая файловая система не смонтирована), поскольку, в отличие от обычного RAID-массива, файлы не разделяются между дисками, а каждый отдельный файл хранится полностью на каком-то одном диске.

Автор этой замечательной программы — Дмитрий Обухов.
Домашняя страница — http://mhddfs.uvw.ru/

[wysija_form id=»2″]