ciopfs
ciopfs is a stackable or overlay linux userspace file system (implemented with
fuse) which mounts
a normal directory on a regular file system in case insensitive fashion.
The commands below should illustrate it's function.
mkdir -p ~/tmp/ciopfs/{.data,case-insensitve}
ciopfs ~/tmp/ciopfs/.data ~/tmp/ciopfs/case-insensitive
cd ~/tmp/ciopfs
mkdir -p case-insensitive/DeMo/SubFolder
echo demo >> case-insensitive/DEMO/subFolder/MyFileAt this point your file system should look like this:
case-insensitive
`-- DeMo
`-- SubFolder
`-- MyFile
.data
`-- demo
`-- subfolder
`-- myfile
To avoid any conflicts you should not manipulate the data directory
directly, any change should be done over the mount point. Any filenames
in the data directory which aren't all lower case are ignored.
If you want to mount the file system automatically at boot time add a line
like the one below to your /etc/fstab.
/data/projects/ciopfs/data /data/projects/ciopfs/mnt ciopfs allow_other,default_permissions,use_ino,attr_timeout=0 0 0Download
- ciopfs-0.2 released (30.06.2008)
- unicode support based on glib
- better error handling in out of memory situations
- various code cleanups
- ciopfs-0.1 released (24.05.2008)
Development
You can always fetch the current codebase from the git repository.
git clone git://repo.or.cz/ciopfs.gitIf you have comments, suggestions, ideas, a bug report, a patch or something else related to ciopfs then don't hesitate to contact me directly: mat[at]brain-dump.org.
How it works
ciopfs works by translating every path element to lower case before further
operations take place. On file or directory creation the original file name
is stored in an extended attribute which is later returned upon request.
This can be seen below:
getfattr -dR .data
# file: .data/demo
user.filename="DeMo"
# file: .data/demo/subfolder
user.filename="SubFolder"
# file: .data/demo/subfolder/myfile
user.filename="MyFile"Runtime Requirements
If you want the file system to preserve case information you have to make sure
that the underlying file system supports extended attributes (for example for
ext{2,3} you need a kernel with CONFIG_EXT{2,3}_FS_XATTR enabled).
You probably also want to mount the underlying filesystem with the user_xattr
option which allows non root users to create extended attributes.
Build Requirements
In order to compile ciopfs you will need the fuse development files,
libattr
and if you plan to use unicode characters within file names you will either need
glib which is the default or
alternatively libicu from icu-project.org.
If you want to use neither of those the file system will fall back to libc's
tolower(3) function which is only defined for [a-zA-Z] which means
it will only work case insensitvely for ascii file names.
For ease of use the following 3 Makefile targets are supported:
unicode-glib(default)unicode-icuascii
Running one of those followed by sudo make install should do everything
that is needed.
POSIX Compliance
ciopfs passes all test of the Linux POSIX file system test suite when mounted as root user with the options
allow_other,use_ino,attr_timeout=0,entry_timeout=0
and $fs set to "ciopfs" in the test suite configuration file. This was tested with
ext3 as the underlying file system.
Stability and Speed
ciopfs just passes every requested operation to the underlying file system so in theory
it shouldn't have a negative impact on stability. However if you find a bug then send
me an email with the instruction to reproduce it.
As far as speed is of concern, i didn't really benchmark or optimize it so far. There is the usual
overhead associated with user / kernel space context switches. Furthermore ciopfs in it's
current implementation uses libc's malloc/free quite extensively, maybe this could be a
bottleneck.
License
ciopfs is licensed under the GNU GPL v2.
