среда, 12 марта 2008 г.

unionfs как элемент распределённой FS

Unionfs — это стэковая файловая система. Может сливать содержимое нескольких каталогов, оставляя их физическое содержание обособленным. Возможно любое сочетание ветвей только-для-чтения (ro) и перезаписываемых ветвей (rw), а также вставку и удаление веток на лету.


Задача

Имеем NFS-доступный каталог с дистфайлами (архивами исходников) портов на сервере (обновляется редко). На одной из сетевых машин также имеется каталог /usr/ports/distfiles, в котором находятся более новые версии дистфайлов. Проблема в том, что в серверном NFS-хранилище находится очень много файлов, нужных для сборки всего и вся, они редко изменяют свои версии. А на сетевой машине только то, что она скачала сама из Сети.
Как бы сделать так, чтобы сетевая машина могла использовать не только свои дистфайлы, но и дистфайлы сервера?


Решение

На сетевой машине делаем:

% mount_nfs -o ro server:/usr/ports/distfiles /mnt/server/distfiles
% mount_unionfs -o below /mnt/server/distfiles /usr/ports/distfiles



Таким образом, на сетевой машине мы получили полное дерево портов со всеми дистфайлами. Новые файлы будут сохранятся локально (удобно, если NFS-каталог для нас read-only). Любые изменившиеся файлы в NFS-каталоге будут скопированы в локальное хранилище (/usr/ports/distfiles сетевой машины) с последующим применением изменений. Эти исключения описаны параграфом в mount_unionfs(8).

Стратегия обработки файлов в unionfs такая: сначала поиск ведётся в upper layer (это первый параметр), затем в lower layer (это второй параметр). При удачном поиске в lower layer идёт "теневое зеркалирование" файла на upper layer (без копирования), затем проведение операций открытия файлов и работы с ними. Ключ -o below приводит к инверсии lower layer и upper layer.


Ссылки

"Реализация UnionFS под FreeBSD стала более стабильной"

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