139 lines
4.8 KiB
Plaintext
139 lines
4.8 KiB
Plaintext
ciopfs - case insensitive on purpose filesystem
|
||
|
||
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-insensitive}
|
||
ciopfs ~/tmp/ciopfs/.data ~/tmp/ciopfs/case-insensitive
|
||
cd ~/tmp/ciopfs
|
||
mkdir -p case-insensitive/DeMo/SubFolder
|
||
echo demo >> case-insensitive/DEMO/subFolder/MyFile
|
||
|
||
At 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. All 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.
|
||
|
||
/ciopfs/data /ciopfs/mnt ciopfs allow_other,default_permissions,use_ino,attr_timeout=0 0 0
|
||
|
||
Note that ciopfs is primarily designed for single user mode. It was originally
|
||
developed to mount the wine program folder and provide faster case insensitive
|
||
file access. If you want to give multiple users write access to the same file
|
||
system, then you have to mount it as root. However, in order to avoid security
|
||
problems ciopfs will force fuse into single threaded mode and thus hurt
|
||
performance.
|
||
|
||
News
|
||
|
||
* ciopfs-0.4 released (18.06.2011)
|
||
* Bugfix in symlink creation
|
||
* Better errno handling
|
||
* ciopfs-0.3 released (25.09.2010)
|
||
* Security improvements: ciopfs forces single threaded mode if the file
|
||
system is mounted by root and accessible for others
|
||
* ASCII mode should now work (an off by one error which caused a segfault
|
||
was fixed)
|
||
* Various bug fixes
|
||
* 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)
|
||
|
||
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 is illustrated 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.
|
||
|
||
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]. Hence, it will only work
|
||
case insensitively for ASCII file names.
|
||
|
||
For ease of use the following 3 Makefile targets are supported:
|
||
|
||
* unicode-glib (default)
|
||
* unicode-icu
|
||
* ascii
|
||
|
||
Running one of those followed by sudo make install should do everything that is
|
||
needed.
|
||
|
||
Alternatively, you can also use one of the distribution provided binary
|
||
packages.
|
||
|
||
POSIX Compliance
|
||
|
||
ciopfs passes all test of a slightly patched POSIX file system test suite when
|
||
mounted as root user with the following options:
|
||
|
||
allow_other,use_ino,attr_timeout=0,entry_timeout=0
|
||
|
||
and $fs set to "ciopfs" in the test suite configuration file. This was last
|
||
tested with pjd-fstest-20090130-RC.tgz and 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.
|
||
|
||
Development
|
||
|
||
You can always fetch the current code base from the git repository located at
|
||
Github or Sourcehut.
|
||
|
||
If you have comments, suggestions, ideas, a bug report, a patch or something
|
||
else related to ciopfs then don’t hesitate to write me an email.
|
||
|
||
License
|
||
|
||
ciopfs is licensed under the GNU GPL v2.
|