Поиск по этому блогу

воскресенье, 31 марта 2013 г.

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


Автор: Роман Мамедов.http://beshenov.ru/debaday/200805.html

Оригинал: «mhddfs: join several real filesystems together to form a single larger one», 25 мая 2008 г.

Пусть имеются три диска: на 80, 40 и 60 Гб; и 150 Гб аудиофайлов, которые нужно разместить на дисках. Как вы это сделаете?

Раньше я знал о двух решениях: создать— либо три различных каталога с музыкой на каждом диске;
— либо нечто вроде RAID и объединить диски в один массив.


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

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

Но недавно я нашел более удачное решение для таких задач: mhddfs. Это модуль FUSE, позволяющий комбинировать файловые системы в одну большую виртуальную, содержащую все файлы компонентов, а также всё их свободное пространство. Более того, в отличие от прочих сходных модулей (unionfs?), mhddfs не ограничивает возможность добавления новых файлов в комбинированную файловую систему и разумно определяет, где эти файлы хранить.

Пусть три жестких диска монтированы в /mnt/hdd1, /mnt/hdd2 и /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 для этого не нужно иметь привилегии суперпользователя (нужно только входить в группу 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

Как видите, была создана новая файловая система, объединяющая емкости дисков. Если вы посмотрите /mnt/virtual, то увидите там файлы со всех трех дисков и наложенные друг на друга структуры директорий.

Но что если попытаться записать файлы в /mnt/virtual? Ну, это довольно хитрый вопрос, и, должен признать, автор mhddfs решил его очень хорошо. Когда вы создаете новый файл в виртуальной файловой системе, mhddfs проверяет свободное пространство на всех дисках. Если на первом диске достаточно места, то файл размещается там. Иначе, если на диске места мало (меньше значения параметра mlimit — по умолчанию 4 Гб), будет использован второй диск. Если и он занят, то будет использован третий. Если же на всех дисках свободное пространство не превышает mlimit, то используется диск, где свободного пространства больше.

Кроме того, если если на середине записи какой-то диск заполняется (допустим, вы попытались создать очень большой файл), то запись не отменяется, и mhddfs просто перемещает данные на другой диск (где больше свободного места). Всё это полностью прозрачно для приложения, записывающего файл.

Теперь можно просто работать с файлами в /mnt/virtual, не заботясь о том, что берется с какого диска, и о прочих вещах; также можно просто переместить туда новые файлы и не думать, где они на деле будут храниться.

Если нужно создавать точку монтирования автоматически при каждой загрузке, то можно добавить такую строчку в /etc/fstab:
mhddfs#/mnt/hdd1,/mnt/hdd2,/mnt/hdd3 /mnt/virtual fuse defaults,allow_other 0 0

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

В дальнейшем, если потребуется, то закончить работу с mhddfs и не потерять данные или структуру директорий будет просто. Допустим, вы купили новый жесткий диск на 500 Гб и хотите продать старые маленькие диски. Просто подключите новый диск и скопируйте на него содержимое /mnt/virtual, после чего удалите точку монтирования mhddfs и отсоедините старые диски. Вся виртуальная структура файлов будет зафиксирована на настоящем диске. И, благодаря тому, что сами файлы не разделяются на части для разных дисков, даже если mhddfs вдруг перестанет работать (что маловероятно), то всё равно можно будет копировать данные со всех трех дисков в один каталог и получить ту же структуру, что и была на /mnt/virtual.

Комментариев нет:

Отправить комментарий