mhddfs: объединение нескольких файловых систем в одну большую виртуальную

Предположим, у вас есть три жёстких диска - на 80, 40 и 60 гигабайт. И 150 гигабайт музыки, которую надо на этих дисках хранить. Как лучше всего поступить в таком случае?

Два пути, которые были мне до недавнего времени известны, это:

  • или разложить музыку по трём дискам вручную, создав по одному каталогу «Music» на каждом диске;
  • или создать из этих дисков какой-нибудь RAID-массив.

Однако, первый метод довольно утомителен, так как каждый раз при добавлении новых файлов нужно решать, куда именно их положить, а потом помнить, где что хранится. Для упрощения последней задачи, можно делить музыку по дискам согласно какому-либо признаку, например по её жанру - а потом, столкнувшись с нехваткой места на диске с классической музыкой, перемещать часть её на диск с рок-музыкой, и расставлять вокруг подпорки из симлинков.

RAID же, хотя и решает эту проблему, всегда связан со значительной потерей либо надёжности хранения, либо полезного дискового пространства.

Но недавно, я случайно нашёл гораздо более удобное и гибкое решение описанной проблемы: mhddfs. Это модуль файловой системы для FUSE, позволяющий объединить несколько обычных файловых систем в одну большую «виртуальную», которая будет содержать в себе не только все файлы объединённых ФС, но и всё их свободное место. Кроме того, в отличие от других подобных модулей, этот не ограничивает возможность записи на виртуальную объединённую ФС, а автоматически распределяет новые файлы по тем физическим дискам, где ещё есть свободное место.

Пакет под названием mhddfs доступен в дистрибутивах Debian, Ubuntu, и, вероятно, во многих других.

Итак, предположим, три ваших жёстких диска примонтированы в каталоги /mnt/hdd1 /mnt/hdd2 and /mnt/hdd3. Это может выглядеть примерно так:

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/sda1              80G   50G   30G  63% /mnt/hdd1
/dev/sdb1              40G   35G    5G  88% /mnt/hdd2
/dev/sdc1              60G   10G   50G  17% /mnt/hdd3

После установки mhddfs, можно создать новую точку монтирования - назовём её /mnt/virtual - и подключить в неё все три предыдущие. Пользоваться FUSE можно и не имея прав root, но для упрощения примеров предположим, что у нас они всё-таки есть.

# mkdir /mnt/virtual
# mhddfs /mnt/hdd1,/mnt/hdd2,/mnt/hdd3 /mnt/virtual -o allow_other
option: allow_other (1)
mhddfs: directory '/mnt/hdd1' added to list
mhddfs: directory '/mnt/hdd2' added to list
mhddfs: directory '/mnt/hdd3' added to list
mhddfs: move size limit 4294967296 bytes
mhddfs: mount point '/mnt/virtual'

Ключ «-o allow_other» здесь означает, что новая файловая система должна быть видна всем пользователям, а не только тому, кто её создал.

Результат будет выглядеть вот так:

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/sda1              80G   50G   30G  63% /mnt/hdd1
/dev/sdb1              40G   35G    5G  88% /mnt/hdd2
/dev/sdc1              60G   10G   50G  17% /mnt/hdd3
mhddfs                180G   95G   85G  53% /mnt/virtual

Как видим, виртуальная файловая система успешно создана. Она суммировала общий объём всех трёх дисков (180G), объединила их использованное (95G) и свободное (85G) пространство. Если посмотреть список файлов и каталогов, находящихся в /mnt/virtual, можно увидеть, что там находятся все файлы со всех трёх дисков - другими словами, все три дерева каталогов там присутствуют в виде «наложения» друг на друга.

Что же произойдёт при попытке создать новые файлы или каталоги внутри /mnt/virtual? Вопрос довольно непростой, но автор mhddfs (кстати, наш соотечественник, Дмитрий Обухов) справился с ним «на отлично». При создании нового файла на виртуальной файловой системе, mhddfs выберет реальный диск для записи автоматически, в зависимости от порядка перечисления их в команде на монтирование и от наличия на них свободного места. Если на первом диске свободного места достаточно, т.е. не меньше значения mlimit из опций mhddfs (которое по умолчанию равно четырём гигабайтам) - файл будет создан там. Если места меньше, чем mlimit - файл будет создан на втором диске. Если и на нём места мало - файл будет создан на третьем диске. Если же на каждом из трёх дисков свободного места меньше, чем значение mlimit, будет выбран просто-напросто диск, где свободного места осталось больше всего.

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

Таким образом, с файлами в /mnt/virtual теперь можно работать абсолютно так же, как и с очень большим реальным диском – не думая, что где хранится, что откуда читается, и т.д. Кроме того, благодаря тому, что всё свободное место всех дисков также объединено, можно не думать, на какой из дисков записать новые файлы - пока хотя бы на одном из них есть место, mhddfs сама оптимально разложит файлы, абсолютно без вашего вмешательства.

Если вы решите сделать, чтобы виртуальная объединённая ФС подключалась при каждой загрузке компьютера, можно добавить следующее в /etc/fstab:

mhddfs#/mnt/hdd1,/mnt/hdd2,/mnt/hdd3 /mnt/virtual fuse defaults,allow_other 0 0

Подробности см. в man mhddfs.

И последнее, но весьма важное, о чём стоит упомянуть. При внедрении любого настолько же «глобального» решения следует обязательно подумать о том, насколько проблематично будет, при необходимости, отказаться от его использования.

К счастью, в случае mhddfs, это очень просто. Если в какой-то момент, к примеру, купив новый жёсткий диск на 500 гигабайт, вы решите более не использовать виртуальную ФС, можно просто скопировать все файлы и каталоги с неё на новый диск, и размонтировать mhddfs. Данные, которые раньше были объединены виртуально, теперь будут объединены реально, на одном диске.

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

Ссылки