- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF92:Что за штука
Материал из Linuxformat.
Что за штука… libferris?
- Согласно философии Unix, все в мире – файлы, верно? Но на самом ли деле все? Автор libferris Бен Мартин тоже задался этим вопросом.
- Почему вы назвали библиотеку libferris?
И вы хотите знать, почему Бьюллер? [Феррис Бьюллер (Ferris Bueller) – название американской комедии, – прим. перев.] Нет, он тут совершенно ни при чем! Настоящая (ну, почти) причина выбора этого названия – слово “ferris” звучит похоже на акроним Virtual File System (VFS), если его произносить вслух: «Ви-Эф-Эс».
- Э-э… а что такое виртуальная файловая система?
Идея состоит в том, чтобы работать с вещами, которые обычно не рассматриваются как файловая система, так, будто это она и есть. Старый добрый пример такого подхода – рассматривать FTP-сервер как локальный диск.
- И что в этом хорошего?
Ну, например, представьте, что вы можете использовать некоторый запрос, и получить все файлы, удовлетворяющие этому запросу, сформировав содержимое виртуального каталога. Вы просто говорите «Найдите мне все файлы группы R.E.M.» и получаете каталог со всеми этими файлами. Поскольку это файловая система, то вы с этим каталогом можете делать то же, что и с обычными файлами – копировать их в плейер, ставить в очередь воспроизведения Amarok или что там еще можно делать с набором файлов.
- Но есть уже GnomeVFS и KIO от KDE, неужели миру мало виртуальных файловых систем?
Главная идея libferris – файловой системой может быть что угодно, надо только предусмотреть в libferris подключаемый модуль для каждой новой штуки, которую вы хотите смонтировать. Такие модули уже существуют для реляционных баз данных, XML-файлов, почтовых ящиков, приложений и даже для расположения файловых систем поверх самих себя. Даже один файл, вроде RPM, может стать файловой системой. Извлечение и сохранение метаданных тоже входит в задачи проекта.
- Погодите минутку: а как приложение может быть файловой системой?
Многие приложения ориентированы на данные. Например, в Firefox есть список окон и вкладок, и каждая содержит документ с иерархической структурой. Проигрыватель видео и музыки, например, XMMS или Amarok, содержит список файлов и текущую позицию воспроизведения в этом списке. Если вы смонтируете XMMS как файловую систему, то сможете копировать файлы из вашего списка воспроизведения на мобильный плейер с помощью обычной утилиты cp. Если вы смонтируете Firefox, то сможете скопировать на диск виртуальный файл, соответствующий третьему параграфу просматриваемой web-страницы.
Точно так же, как вы управляете ядром Linux через файловую систему /proc, вы сможете через некоторые файлы управлять поведением приложения. Например, записав единицу в файл amarok://control/play, вы даете команду начать проигрывание. А чтение и запись файла amarok://control/volume позволит вам контролировать громкость.
- Чуть раньше вы упоминали «извлечение и сохранение метаданных». Зачем это нужно в libferris?
Когда вы упоминаете о метаданных для файловой системы, большинство думает про такие вещи, как размер файла, время модификации и имя владельца. Но в libferris метаданные могут включать любую информацию о файле. Например, для аудио-записей метаданными могут быть имя артиста и название композиции, извлеченные из ID3-тэгов. Поскольку все метаданные доступны через один и тот же интерфейс, вы может легко отсортировать каталог по ID3-номеру дорожки точно так же, как и по имени.
- Понятно... А как насчет сохранения?
Метаданные могут храниться или с использованием механизма расширенных атрибутов на уровне ядра (Extended Attributes, EA), или в персональном хранилище в формате RDF. RDF – это набор стандартов W3C, позволяющий программистам указывать метаданные, которые могут быть использованы различными приложениями. Обычно так хранят ссылки на дополнительную информацию – например, на web-страницы или локальные файлы. Использование RDF для хранения метаданных позволяет добавлять заметки к FLAC-файлу, к NFS-тому, доступному только для чтения, к строке в базе данных или к web-странице. Использование метаданных возможно где угодно, так что вы всегда найдете файлы на их основе.
- Идея в общем хорошая, но команда find на 500 ГБ диске работает довольно медленно.
В последние годы (а проект стартовал в 2001 г.) в libferris были добавлены возможности индексирования и поиска. Индексирование вынесено в отдельные модули, так что у вас есть возможность выбирать, с помощью чего создавать и хранить индекс. Есть модули для PostgreSQL, Lucene, Xapian, Beagle и других библиотек. Индексирование – достаточно заковыристая задача: и на скорость поиска по вашему индексу, и на объем используемой при этом памяти влияет способ обновления индекса. Наличие нескольких подключаемых модулей позволяет выбрать вариант, который вам подходит лучше всего.
Кстати, это значит, что вместо стандартной утилиты find(1) лучше использовать ferris-find(1). У нее тот же самый интерфейс, но она гораздо быстрее, так как использует индекс файловой системы.
- Ага, значит “ferris-find(1)”? Это значит, что файловая система libferris должна обслуживаться специальными утилитами?
Не обязательно. Вы можете подключать файловые системы libferris к ядру Linux с помощью Fuse.
- Супер! Кстати, а что такое Fuse?
С помощью Fuse (Filesystem in UserSpace) вы можете заставить ядро Linux перенаправлять системные вызовы к приложению, запущенному пользователем, вместо того чтобы обрабатывать их на месте. Это позволяет разработчикам писать файловые системы, независимые от ядра, поскольку они работают не внутри него, а в виде отдельных процессов. Если я использую команду cat, чтобы посмотреть содержимое файла в файловой системе Fuse, cat попросит ядро Linux передать ему файловые данные, ядро же в свою очередь запросит процесс пользователя и вернет полученные от него результаты команде. Такая схема работы позволяет cat считать, что она работает с обычной ядерной файловой системой.
- А при чем тут libferris?
У libferris есть команда ferrisfs, использующая Fuse для доступа через ядро Linux ко всему, что является файловой системой libferris. Это дает возможность программам, которые ничего не знают про libferris, читать и писать данные в файловой системе libferris обычным способом.
Большая часть дистрибутивов Linux уже включает пакеты с Fuse и его утилиты.
Кроме того, существуют варианты реализации традиционных утилит командной строки, таких как ls, cp, mv, rm и cat, которые используют libferris без помощи Fuse, напрямую.
- Зачем же возиться с переписыванием ls, cp и остальных, если libferris можно использовать
через Fuse?
Ну, во-первых libferris была создана до того, как появился Fuse. А во-вторых, вы можете добавить парутройку очень удобных фильтров и опций сортировки при использовании утилит, разработанных с учетом libferris. Например, вы может использовать ввод-вывод с отображением файла в память, чтобы скопировать файл. Это может быть полезно, так как libferris сообщит ядру, что вы будете читать и писать последовательно, и ядро сможет подстроить стратегию кэширования. Таким образом, в вашем дисковом кэше останется гораздо меньше ненужной информации, чем при использовании других утилит копирования.
Работать с метаданными тоже гораздо удобнее при помощи новых клиентов. Вы можете указать, какие из них вы предпочитаете видеть при просмотре каталога в ferrisls, дополнительно указав отфильтровать или отсортировать результаты на основе метаданных.
- Есть ли еще что-нибудь интересное для меня, о Создатель?
Если бы мне пришлось выбирать любимую возможность libferris, я бы указал на оповещения об изменении виртуальных файлов внутри XML-документа или базы данных Berkeley DB4. Одним из процессов вы можете смонтировать XML-файл и затем получать оповещения об изменениях, выполняемых другим процессом. Это делает поведение DB4-файла очень похожим на поведение настоящей файловой системы.
Второе место получило бы сохранение истории обращения к метаданным. Потом вы можете выполнять к этой истории запросы типа «Какие последние 50 фильмов я смотрел?» или «Какие DVD я смотрел на неделе после возвращения с Linux Kongress?»...
- Какие еще безумные планы есть для libferris?
Подключение новых штук у нас всегда в поле зрения. Мы также планируем интегрироваться с большим числом XML-утилит и стандартов: например, пользователи смогут выполнять запросы XQueries на файловой системе libferris или на ее индексе.
- Ну вы и голова. Где я могу получить подробную информацию и скачать программу?
Спасибо, я знаю. Домашняя страница нашего проекта: http://witme.sf.net/libferris.web. Новые версии обычно выходят каждые один-два месяца, и анонсируются на http://freshmeat.net. LXF