На этой неделе я работал в основном над автоматическим и ручным монтированием репозиториев 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 с использованием соответствующих точек монтирования как ключ. Пользователь должен будет указать эту точку монтирования в любых (будущих) функциях, которые обращаются к этим атрибутам или устанавливают их.