На этой неделе я работал в основном над автоматическим и ручным монтированием репозиториев CernVM-FS из программы на C/C++.

В Linux монтирование репозиториев cvmfs выполняется автоматически с помощью autofs; когда процесс пытается получить доступ к записи репозитория под /cvmfs/{repo_name}, autofs позаботится о ее монтировании.

Аналогично для клиента JavaScript, чтобы запускать немодифицированные программы C/C++, которые могут иметь жестко запрограммированный доступ к /cvmfs/{repo_name}, я модифицировал базовую часть файловой системы Emscripten, чтобы включить автоматическое монтирование репозиториев.

В частности, я изменил функцию lookupPath в library_fs.js, чтобы сначала проверить, имеет ли входной путь (после разрешения) /cvmfs/{repo_name} в качестве префикса, и если да, создать каталог в /cvmfs/{repo_name}, если он еще не существует, и смонтировать репозиторий там, используя по умолчанию базовый URL cvmfs. Остальная часть логики в этой функции затем выполняется гладко, возвращая соответствующую файловую систему node, вызывая lookupNode, который, в свою очередь, вызывает lookup в объект CVMFS.

Пользователь также может установить URL репозитория по умолчанию из своего кода C/C++, используя атрибут base_url объекта CVMFS, например так:

EM_ASM(
    CVMFS.base_url = ‘http://hepvm.cern.ch';
);

И после этого, например, любой доступ под /cvmfs/cernvm-devel.cern.ch с использованием вызовов ввода-вывода POSIX приведет к монтированию репозитория cernvm-devel.cern.ch в этой точке.

Программа C/C++ теперь также может вручную монтировать CVMFS в любой каталог, например:

EM_ASM(
    FS.mkdir(‘/bin/{repo_name}’);
    FS.mount(CVMFS, repo_name: '{repo_name}', ‘/bin/{repo_name}’);
);

Второй аргумент FS.mount здесь — это общий объект настройки, переданный в базовую файловую систему Emscripten, который я использовал, чтобы позволить пользователю указать имя репозитория. Также следует отметить, что EM_ASM — это макрос, определенный в emscripten.h, который используется для встраивания встроенного кода JavaScript в код C/C++.

Наконец, Emscripten создает только один экземпляр библиотечного объекта для каждой программы. Следовательно, для того, чтобы объект CVMFS поддерживал монтирование разных репозиториев в разных точках монтирования, все атрибуты, специфичные для репозитория (базовый URL-адрес, пороговое значение размера кэша, переменные символической ссылки и т. д.), теперь будут храниться в карте JavaScript с использованием соответствующих точек монтирования как ключ. Пользователь должен будет указать эту точку монтирования в любых (будущих) функциях, которые обращаются к этим атрибутам или устанавливают их.