You are here: romanrm.net » Добро пожаловать! » mhddfs: объединение нескольких файловых систем в одну большую виртуальную
mhddfs: объединение нескольких файловых систем в одну большую виртуальную
Обновление в 2020 г.
В последнее время у MHDDFS замечены проблемы с надёжностью работы (Segmentation fault при хождении по каталогам). Поэтому сейчас я перешёл с неё на MergerFS. Концепция в точности та же самая, но работает надёжно, и имеет немного другой набор фич и синтаксис конфигурации.
Изначальная статья
Предположим, у вас есть три жёстких диска - на 80, 40 и 60 гигабайт. И 150 гигабайт музыки, которую надо на этих дисках хранить. Как лучше всего поступить в таком случае?
Два пути, которые были мне до недавнего времени известны, это:
- или разложить музыку по трём дискам вручную, создав по одному каталогу “Music” на каждом диске;
- или создать из этих дисков какой-нибудь RAID-массив.
Однако, первый метод довольно утомителен, так как каждый раз при добавлении новых файлов нужно решать, куда именно их положить, а потом помнить, где что хранится. Для упрощения последней задачи, можно делить музыку по дискам согласно какому-либо признаку, например по её жанру - а потом, столкнувшись с нехваткой места на диске с классической музыкой, перемещать часть её на диск с рок-музыкой, и расставлять вокруг подпорки из симлинков.
RAID же, хотя и решает эту проблему, всегда связан со значительной потерей либо надёжности хранения, либо полезного дискового пространства.
Но недавно, я случайно нашёл гораздо более удобное и гибкое решение описанной проблемы: mhddfs. Это модуль файловой системы для FUSE, позволяющий объединить несколько обычных файловых систем в одну большую “виртуальную”, которая будет содержать в себе не только все файлы объединённых ФС, но и всё их свободное место. Кроме того, в отличие от других подобных модулей, этот не ограничивает возможность записи на виртуальную объединённую ФС, а автоматически распределяет новые файлы по тем физическим дискам, где ещё есть свободное место.
Пакет под названием mhddfs
доступен в Debian и во многих других дистрибутивах.
Итак, предположим, три ваших жёстких диска примонтированы в каталоги /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
.