November 19, 2008
This article was contributed by Ben Martin
The Unix mantra "everything is a file" gives you great flexibility
over where you store your data and how information is manipulated and
replicated. Unfortunately, many things in Unix and Linux are not
files, or ones that you might want to interact with anyway. For example,
a PostgreSQL database is ultimately stored in a collection of binary
files though you probably wouldn't want to interact with those files
directly. Instead of storing settings in a collection of tiny files,
many applications use XML to store settings in a single file but then
have to deal with parsing XML instead of just reading little files.
libferris lets you mount both PostgreSQL and XML and provides you with
a useful way to interact with the data contained in both as a virtual
filesystem.
Other operating systems like Plan 9 pushed the
envelope further than Unix, making more things "just a file". Unfortunately,
to use Plan 9 you had to abandon your trusty old Unix roots and jump to
an entirely new operating system.
I started the libferris virtual
filesystem project back in 2001 to push the "everything is a file"
concept further, it was all implemented on a Linux base.
Libferris is a virtual filesystem
implemented as a shared library with
FUSE bindings.
Because FUSE is
already in the Linux kernel you don't have to do any kernel patching
to use libferris. Because libferris is a shared library and not in the
kernel, it can use other libraries to help it mount data sources like
XML, relational databases and Emacs to name a few. And as an upshot of
being out of kernel, I can work on letting libferris mount anything I
like no matter how strange it might be without any third party
approval.
There are actually two ways to use libferris -- through a native C++
interface and using the normal Unix APIs with FUSE. The FUSE interface is
very useful if you want to rsync(1) some structured information from
an XML file into a PostgreSQL database. Just mount them both with FUSE
and rsync away. Another few interesting things you can do with the
FUSE interface is expose data as a virtual office
document using XSLT stylesheets that libferris processes for you
as well as geotagging with Google
Earth.
The design of libferris revolves around two primitives: exposing file contents as C++
std::iostreams, and rich metadata support through an interface similar
to Extended Attributes (EA) attr_get(3). Since then
libferris has gained sophisticated support for indexing both the full
text contents of files as well as their metadata. Libferris is written in C++ and aims to take full advantage of the
language. Interfaces are designed to be as easy to pickup for C++
programmers as possible, for example, displaying a directory can be
done using iterators, find(), begin() to
end() etc.
Both the types of things that libferris can provide as virtual
filesystems and the metadata handling are done through a plugin
interface. The handling of metadata is done through the Extended
Attributes (EA) interface. This EA interface is also virtualized --
if you write an attribute to file:///foo/bar and the kernel
filesystem supports extended attributes, then the value will be saved
in a kernel level EA using attr_set(3). On the other hand if
file:///foo/bar happens to exist on a network filesystem that
does not support EA, then your value is saved in RDF by libferris. In
both cases the value can be read again using an identical interface.
Looking at filesystems in an abstract way -- a hierarchy of files,
file contents, and metadata associated with files and directories as
key-value pairs -- there is somewhat of a resemblance to the data
model of XML. Although there are obvious differences: XML elements can
have multiple text nodes as contents, an XML element does not need to
have specific unique names for each child XML element and so on. In
many cases it can be advantageous to smooth over the differences and
view a filesystem as XML and vice versa. Over the years libferris has
gained the ability to interact with it's virtual filesystems as
virtual Document Object Models (DOM)s. The reverse is also true, you
can take an xerces-c DOM and interact with it as a virtual
filesystem. Using virtual DOMs makes it easy to create a view of a
filesystem using a browser and XSLT. See xml.com
for information on using XQuery against a libferris virtual
filesystem.
The ability to mount XML and Berkeley db4 data as filesystems has long
been a part of libferris. If you want to store a filesystem inside a
platform independent format, then using XML is great, whereas the speed
of individual file look up in a Berkeley db4 database of many many
file records can come in handy. Each format has its advantages, but
they are all just virtual filesystems as far as libferris is
concerned.
When a filesystem can offer what it likes through key-value pairs (EA)
associated with files, relational databases can also be viewed as a
virtual filesystem. Databases, views, tables and result sets become
directories, tuples become files named by the value of their primary
key, and the individual values of tuples are exposed as Extended
Attributes on their tuple file. Again, PostgreSQL appears just like
another virtual filesystem. For relational data there are a few
caveats, for example, to create a new "file" in a table you must
supply at least the primary key EA as well as any EA which are
explicitly marked "not null" in the database.
Libferris will automatically mount many filesystems for the user. For
example, if you try to read an XML file as though it is a directory
then libferris will implicitly mount it as one for you. This does blur
the lines between what is a directory and what is a file in the
system. There is some additional metadata that libferris makes
available if you would like to avoid the automatic mounting. For
example, if you wish not to descend into XML files then read the
is-file metadata and if it is true do not attempt to descend into the
file.
One of the motivations for creating libferris as a project of its own
was to be able to expose anything that I felt could be interacted with
in an interesting manner as a filesystem as one. So libferris can
mount some things that folks might not think of as filesystems --
including Firefox, Emacs, DBus, LDAP, Evolution, Amarok, klipper, xmms,
X Window System and gphoto2.
The metadata plugins for libferris currently support extracting
information from file formats automatically, for example, EXIF, XMP
and ID3 tags. Metadata overlays are also supported, so you can see
what tags you have associated with an image in f-spot through extended
attributes in libferris. I use the term overlays because a central
repository of tag data (in this case from f-spot) is scattered over an
entire filesystem in libferris. The lower level metadata plugins
handle more standard extended attributes usage, for example using
attr_set(3) to store values or saving them in RDF.
Many of the standard utilities have been rewritten to use the native
libferris API and take advantage of extra features it offers. Things
like ls, cp, mv, rm, cat, io-redirection, touch, head and tail all
have native libferris versions which are shipped with the main
tarball. These all also serve as code samples for how to use the
libferris API. Extensions to the normal clients include the ability to
output directory listings in XML for ferrisls, ferriscp has the
ability to use memory mapped IO as well as the more standard
open(), read() and write() calls to perform the
copy. Using memory mapped IO this way also uses the madvise(2)
MADV_SEQUENTIAL call to let the kernel correctly select caching
policy.
The indexing support in libferris is also handled using plugins. Two
different indexing plugin types exist; full text and metadata. There
are two types of plugin, because the strategy for how to create an
index can be quite different depending on if you are performing a
search for some words in a document text or if you wish to find files
with certain metadata values. Using inverted files can be great for
resolving a ranked full text query for "alice wonderland" but finding
all files in either my home directory or /pictures that have
been modified in December 2008 can be solved in a number of ways.
There are currently indexing plugins for CLucene, Lucene, LDAP,
Federations of other libferris indexes, ODBC, PostgreSQL, Redland
(RDF), Xapian, Beagle, Strigi and some custom designs. There are
likely to be more index plugins explicitly designed to work on NAND
Flash in the future. Those interested in indexing and libferris should
see this article.
A major advantage of closely combining the index and search operations
into the virtual filesystem is that anything the virtual filesystem
can see can be indexed. When searches are performed you should also
be able to interact with any of the results as a virtual
filesystem. This avoids the issue where a discrete search library
might return a URL that the client can not do anything with.
So, what does it look like to code using libferris? Most objects in
ferris are smart pointers, many using intrusive reference
counting. The type for such objects is prefixed with "fh_" to indicate
a ferris handle. The notion of files and directories is amalgamated
into a single "Context" abstraction. To get a smart pointer to a
filesystem path the Resolve() function is used. So without
further ado, to get a file and its metadata with libferris:
fh_context c = Resolve( "~/myfile" );
{
// let the scope close it for me
fh_istream ss = c->getIOStream( ios::trunc );
ss << "Bah!" << endl;
}
// std::string getStrAttr( fh_context, eaname, default-value, ... )
string filename = getStrAttr( c, "name", "" );
string md5sum = getStrAttr( c, "md5", "" );
cout << "the filename should be myfile:" << filename << endl;
cout << "the md5 checksum is:" << md5sum << endl;
setStrAttr( c, "foo", "bar" );
fh_attribute a = c->getAttribute("foo");
fh_istream ass = a->getIStream();
cout << "Getting the metadata again:";
copy( istreambuf_iterator<char>(ass),
istreambuf_iterator<char>(),
ostreambuf_iterator<char>(cout));
cout << endl;
Libferris is steadily gaining commercial interest. Currently I provide
things like custom builds of libferris, explicit support for new test
cases in the core regression test suite that are important to clients
and of course extensions to libferris to perform a specific task that
might be desired.
There are
packages available for both 32 and 64-bit Fedora
8,
9
and Ubuntu 7.10 gusty
as well as 32bit packages for
openSUSE 10.3. Unfortunately there is currently a bug in building
64bit stldb4 on openSUSE. Install the libferris-suite package to pull in
all the dependencies.
Feel free to email the witme-feris
mailing list or add comments to this article suggesting any weird and
wonderful (and obscure) filesystems you have experienced in the
past. Though my libferris.TODO file always grows more than it shrinks,
I'm always happy to add new and exciting suggestions near the top of
it.
Comments (6 posted)
System Applications
Database Software
Version 2.0.5 Release Candidate 1 of the Firebird DBMS has been
announced.
"
This sub-release introduces some more bug fixes and vulnerability closures backported from V.2.1.2 development. It does not add any new functionality to the database engine.
One fix of note is that DummyPacketInterval behaviour, broken since v.2.0, has been fixed."
Comments (none posted)
The November 16, 2008 edition of the PostgreSQL Weekly News
is online with the latest PostgreSQL DBMS articles and resources.
Full Story (comments: none)
Device Drivers
Version 002 of DeviceKit has been announced.
"
DeviceKit is an abstraction for enumerating devices and listening to
device events. Any application on the system can access the
org.freedesktop.DeviceKit service via the system message bus. On
GNU/Linux, DeviceKit can be considered a simple D-Bus frontend to
udev(7)."
Full Story (comments: none)
Filesystem Utilities
Stable version 1.2.1-17 of Clonezila, a live-disk partition management
and disk cloning utility, has been
announced.
"
This release is based on Debian Lenny with Kernel 2.6.26-8. A Simplified Chinese interface was added. An option to reboot or shutdown after clone is finished was added. Hardware and software info will be saved in a clonezilla image. An option to generate MD5 or SHA1 checksums after an image was saved was added. Running on serial console ttyS0 is supported. Some more info will be saved in image dir. Some bugs were fixed."
Comments (none posted)
Networking Tools
The Monkeysphere project has been launched.
"
The Monkeysphere enables you to use the OpenPGP web of trust to verify
ssh connections. SSH key-based authentication is tried-and-true, but it
lacks a true Public Key Infrastructure for key certification, revocation
and expiration. Monkeysphere is a framework that uses the OpenPGP web of
trust for these PKI functions. It can be used in both directions: for
users to get validated host keys, and for hosts to authenticate users."
Full Story (comments: none)
Security
Version 3.2 of Metasploit Framework has been announced, it adds
some new capabilities.
"
The Metasploit Project
announced today the free, world-wide availability of version 3.2 of
their exploit development and attack framework. The latest version
is provided under a true open source software license (BSD) and is
backed by a community-based development team."
Full Story (comments: none)
Telecom
On November 12, the OpenMoko project
announced that all of its system images had
been removed from the download server. When users asked about what was
going on, the
answer that came back was:
"
The short story is that we are in a protracted battle with some
patent trolls. Google for Sisvel. In order to get ourselves in a stronger
position, we want to make sure no copies/instances/whatever of
patent-infested technologies like MP2 and MP3 exist on our servers. Our
phones never shipped with end-user MP3 playback features, but we want to
use this opportunity to make sure it's not even in some remote place
somewhere." The OpenMoko project did not need to run into this
particular hassle.
Comments (23 posted)
Web Site Development
Version 1.0.1 of the Django web development platform has been
announced.
"
Following the previously-announced schedule, today the Django team has released Django 1.0.1. This is a bugfix-only release containing fixes and improvements to the Django 1.0 codebase, and is a recommended upgrade for anyone using or targeting Django 1.0."
Comments (none posted)
Miscellaneous
Version 1.0.0 of Hatta has been announced.
"
Hatta is a small wiki engine designed to run locally or via WSGI inside
a directory in a Mercurial repository. All the pages are normal text or
binary (for images and such) files, also editable from outside of the
wiki -- the page history is taken from the repository."
Full Story (comments: none)
Version 0.8 of
systemtap
has been announced, it includes new features and bug fixes.
"
SystemTap provides free software (GPL) infrastructure to simplify the gathering of information about the running Linux system. This assists diagnosis of a performance or functional problem. SystemTap eliminates the need for the developer to go through the tedious and disruptive instrument, recompile, install, and reboot sequence that may be otherwise required to collect data."
Full Story (comments: none)
Version 2.3 of Zenoss, an enterprise network and systems management application written in Python/Zope, has been
announced.
"
Zenoss 2.3 includes improvements in Windows and Java application monitoring as well as native VMware management for Zenoss Enterprise Edition. We are also taking the opportunity to highlight over 30 new ZenPacks developed by the Zenoss community for expert monitoring of Asterisk PBX, Brocade Switches, Cisco Security Appliance, and many more."
Comments (none posted)
Desktop Applications
Audio Applications
Revision 3 of LV2 has been announced.
"
LV2 is a standard for plugins and matching host applications, mainly
targeted at audio processing and generation. LV2 is a simple but
extensible successor of LADSPA, intended to address the limitations of
LADSPA which many applications have outgrown.
This revision changes the data portion of the specification only (i.e.
lv2.h is unchanged)."
Full Story (comments: none)
Version 0.6.1 of SLV2 has been announced.
"
SLV2 is a library to make the use of LV2 plugins as simple as possible for applications.
Changes this release:
- I18N support, courtesy Lars Luthman
- New functions: slv2_port_get_value, slv2_instance_get_extension_data
- Fix slv2_plugin_get_supported_features
- Fancy new build system
- Some Mac portability stuff I think? Probably some other stuff too".
Full Story (comments: none)
Business Applications
Version 1.5 of Yet Another Meeting Assistant (YaMA) has been announced.
"
Whats New in version 1.5 :
1. Evaluate suitability of Action Items for Export
2. Ability to specify custom meeting type
3. Ability to Parse Actions from previous Minutes
4. Display TimeZone"
Full Story (comments: none)
Desktop Environments
The following new GNOME software has been announced this week:
You can find more new GNOME software releases at
gnomefiles.org.
Comments (none posted)
The October 12, 2008 edition of the
KDE Commit-Digest has been
announced.
The content summary says:
"
More improvements in KBruch as part of a Brazilian student projects initiative. Ability to search by "HD Catalog Number" in KStars. Initial Kross support in the Rocs educational tool. Multiple projection support in the Marble Plasmoid. Preliminary support for editors in Klotz (formerly KLDraw). Ability to change the alignment of the window title in the Oxygen window decoration..."
Comments (none posted)
The following new KDE software has been announced this week:
You can find more new KDE software releases at
kde-apps.org.
Comments (none posted)
Version 4.6 Beta 2 of Xfce, a light weight desktop environment, has been
announced.
"
The second Beta was delayed for 2 weeks, but it was worth it.
every feature we made a freeze-exception for has made it into this release.
This means a lot of bugs have been fixed this time as well".
Comments (none posted)
The release schedule for X server version 1.6 has been announced
by Keith Packard.
"
I volunteered to manage an X server 1.6 release, tentatively scheduled
for the end of the year (yes, this year, 2008). This release will
include DRI2 and RandR 1.3 support. I'd like to know how much of the new
Xinput stuff will be ready in time."
Full Story (comments: none)
The following new Xorg software has been announced this week:
More information can be found on the
X.Org Foundation wiki.
Comments (none posted)
Desktop Publishing
Version 1.5.7 of LyX, a GUI front-end to the TeX typesetter,
has been announced.
"
This is the sixth
maintenance release in the 1.5.x cycle and it is expected to be the final
release in this series, since a new series of stable releases has just been
introduced by our new major release, LyX 1.6.0. Besides the obligatory bug
fixes, the main feature of this release is the ability to read files created by LyX 1.6.0 (this feature requires python 2.3.4 or newer).
All users who intend to stick with the 1.5.x series for the time being are
encouraged to upgrade to this version."
Full Story (comments: none)
Financial Applications
Version 1.0 of Tryton ERP has been announced.
"
This is the first release of Tryton, a fork of OpenERP (formally known
as TinyERP). This release is the result of 8 months of intensive work
which consist of the rewrite of all modules (including contact, sale,
purchase, invoice, analytic and general account and inventory
management) and some parts of the core features. It is available in four
languages (English, French, German and Spanish)."
Full Story (comments: 1)
Games
A demo release of Shoot Out has been
announced.
"
Shoot out is a arcade shooter similar to galaga or space invaders using SDL.
The demo for ShootOut is finally release. The download is the linux tarball at the moment."
Comments (none posted)
Version 0.3.8 of WFMath has been
announced.
"
WFMath, or the WorldForge Math librarys main focus is geometric objects, and it has classes for several shapes as well as the basic math objects, points, vectors, matrices and quaternions. It is required by all WorldForge components.
This release is aimed at all developers. Changes in this version:
* The source has been updated to build cleanly on modern compilers.
* The build files have been updated to work better with modern tools."
Comments (none posted)
Interoperability
Version 0.2.0 of odf-converter-integrator has been
announced.
"
odf-converter-integrator is an easy way to open Microsoft Office 2007 files (also called Office Open XML, .docx, .xlsx, and .pptx) with a high-quality conversion on any Linux or Windows system in any OpenOffice.org.
The odf-converter-integrator releases 0.2.0. Highlights in this release are OdfConverter 2.0 which improves the performance and accuracy of file conversions. Also changes in the integration improve the compatibility with Linux distributions."
Comments (none posted)
Mail Clients
Version 1.1.0 of Sylph-Searcher has been
announced.
"
Sylph-Searcher is a program that enables fast full-text search of messages stored in mailboxes of Sylpheed, or normal MH folders."
Comments (none posted)
Medical Applications
LinuxMedNews
reports
on an open-source ultrasound system.
"
As Vincent reported in his post "Medical GNOME", the French company Supersonic Imagine (founded in 2005) just announced its next-generation ultrasound system for breast lesion imaging that will come with mostly Open Source software components.
The new system is called Aixplorer."
Comments (none posted)
Multimedia
Version 0.5.18 of Elisa Media Center has been announced.
"
The release cycle for this version was exceptionally two weeks instead
of one to fit a lot of important changes (some of which are visible,
some not but nonetheless important).
This release brings its usual lot of bug fixes and exciting new
features.."
Full Story (comments: none)
Music Applications
Versions 0.1.1 of Tapeutape and Tranches has been announced.
"
I've released new versions of Tapeutape (virtual sampler) and
Tranches (beatrepeat/redirect/rearrange).
There are also tutorials for both of them."
Full Story (comments: none)
Office Applications
Version 0.0.10 of pyspread has been announced, it features a code
rewrite and bug fixes.
"
Pyspread is a 3D spreadsheet application. Each cell accepts a Python
expression and returns an accessible object. Python modules are usable
from the spreadsheet table without external scripts."
Full Story (comments: none)
Web Browsers
Versions 3.0.4 and 2.0.0.18 of the Firefox browser have been announced.
"
As part of Mozilla Corporation's ongoing stability and security update
process, Firefox 3.0.4 and Firefox 2.0.0.18 are now available for
Windows, Mac, and Linux as free downloads".
Full Story (comments: none)
Languages and Tools
C
The November 17, 2008 edition of the GCC 4.4.0 Status Report
has been published.
"
We are now in regression and documentation fixes only mode.
When the number of P1 bugs drops to zero and the number of
P1, P2 and P3 bugs reaches 100, we'll branch 4.4.0 and open
4.5 stage 1."
Full Story (comments: none)
pcc, the portable C compiler, has
teamed up with the BSD Fund to try to attract donations to
fund the completion of a "usable" 1.0 release. The BSD folks have long been dissatisfied with GCC, but Linux developers have eyed pcc (and others) as well. LWN
looked at pcc a little over a year ago. (Thanks to Brian Plummer).
Comments (45 posted)
Caml
The November 18, 2008 edition of the Caml Weekly News
is out with new articles about the Caml language.
Full Story (comments: none)
Java
Version of OpenSwing has been
announced, it features a number of new capabilities.
"
OpenSwing is a component library that provides a rich set of advanced graphics components and a framework for developing java applications based on Swing front-end. It can be applied both to rich client applications and Rich Internet Applications."
Comments (none posted)
Version 3.1beta3 of OpenXava has been
announced.
"
OpenXava is a framework to develop AJAX Java Enterprise/J2EE applications rapidly and easily. Allows you to define applications just with POJOs, JPA and Java 5 annotations. Feature rich and flexible since it's used for years to create business applications with Java.
OpenXava 3.1beta3 has all functionality of 3.0.3 but it generates an AJAX application. Just update to OX3.1 and your OX (3.x, 2.x, or 1.x) application will be AJAX without touching a single line of code.
In this new 3.1beta3 we have rounded the edges a lot, so it's near to a production ready version."
Comments (none posted)
Perl
Version 0.8.1 of Parrot, a virtual machine for running dynamic languages,
has been announced.
Full Story (comments: none)
The October 27 - November 2, 2008 edition of
This Week on perl5-porters is out with the latest Perl 5 news.
Comments (none posted)
PHP
Version 4.2.009 of TCPDF has been
announced.
"
TCPDF is a Free Libre Open Source PHP class for generating PDF documents without requiring external extensions.TCPDF Supports UTF-8, Unicode, RTL languages and (x)HTML. TCPDF project was started in 2002 and now it is freely used all over the world by millions of people."
Comments (none posted)
Python
The November 17, 2008 edition of the Python-URL! is online with
a new collection of Python article links.
Full Story (comments: none)
Tcl/Tk
The November 19, 2008 edition of the Tcl-URL! is online with new
Tcl/Tk articles and resources.
Full Story (comments: none)
Debuggers
Tom Tromey
blogs about a
gdb/python integration effort.
"
Im hoping we can ship a Python-enabled gdb in F11. Hopefully that will boost adoption. Im also planning to ship a suite of libstdc++ pretty-printers in F11, so even if you dont write any Python yourself, you can still benefit. (For those not following the progress, we have a feature that lets you write custom visualizers based on type; this makes printing a std::vector, or whatever, much simpler.)"
(Thanks to Mark Wielaard).
Comments (none posted)
Libraries
Version 1.8.4 of the Cairo graphics library has been announced.
"
This is the second update to cairo's stable
1.8 series and contains a small number of bug fixes, (in particular a
few fixes for build failures of cairo 1.8.2 on various systems). This
is being released just over two weeks after cairo 1.8.2."
Full Story (comments: none)
Version 2.1rc2 of PyTables has been announced.
"
PyTables is a library for managing hierarchical datasets and designed to
efficiently cope with extremely large amounts of data with support for
full 64-bit file addressing. PyTables runs on top of the HDF5 library
and NumPy package for achieving maximum throughput and convenient use.
This is the second release candidate for 2.1, and I have decided to
release it because many bugs have been fixed and some enhancements have
been added since 2.1rc1."
Full Story (comments: none)
Page editor: Forrest Cook
Next page: Linux in the news>>