The short story: I needed a tool to manage my dotfiles. I forked Luc Dufrene's libetc [http://ordiluc.net/fs/libetc/] after it seemed unmaintained. Here is its description:
Unfortunately, I eventually run into LD_PRELOAD problems (mainly with programs using dlopen like VirtualBox and screen). So I decided to rewrite it using FUSE, and make it more generic.
To use contexts, you need /proc/(pid)/cmdline. But don't use contexts if you can avoid it !
make && sudo make install
Make sure that user_allow_other is enabled in /etc/fuse.conf.
m#^(?!\.)# . m#^\.(cache|config|local)# . m#^\.# .config/
That is, all dotfiles will be put in .config/ (without the leading dot), excepting .cache and .local.
m#^(?!\.)# . m#^\.(cache|config|local)# . - /^\S*busybox/ /^/ . - // m#^\.# .config/
rewritefs -o config=/mnt/home/me/.config/rewritefs /mnt/home/me /home/me
Then, accessing to files in /home/me will follow rules defined in your config file.
mount.fuse rewritefs#/mnt/home/me /home/me -o config=/mnt/home/me/.config/rewritefs,allow_other
allow_other and default_permissions is here to allow standards users to access the filesystem with standard permissions.
So, you can use the fstab entry:
rewritefs#/mnt/home/me /home/me fuse config=/mnt/home/me/.config/rewritefs,allow_other 0 0
See rewritefs --help for all FUSE options.
Alternatively, you can directly use rewritefs as a file system type:
/mnt/home/me /home/me rewritefs config=/mnt/home/me/.config/rewritefs,allow_other 0 0
Let's say you have your raw home dirs in /mnt/home/$USER. Then, to use rewritefs on /home/$USER with configuration file stored at /mnt/home/$USER/.config/rewritefs, you need to add this to pam_mount.xml:
<volume fstype="fuse" path="rewritefs##/mnt/home/%(USER)" mountpoint="~" options="config=/mnt/home/%(USER)/.config/rewritefs,allow_other" />
You can add user="me" to limit this to yourself (but think to create symlinks for other users !)
Don't forget to activate pam_mount in your pam configuration too. This is distribution-dependent ; you have to refer to the corresponding documentation.
ls: cannot access /home/user/.vimrc: No such file or directory ls: cannot access /home/user/.zshrc: No such file or directory d????????? ? ? ? ? ? .ssh/
Short answer: You have to manually move .vimrc, zshrc, .ssh/ inside .config before using rewritefs.
Long answer: If .ssh is translated (by the rules you gave to rewritefs) into .config/ssh, and that you didn’t renamed .ssh into .config/ssh yourself (i.e. that .ssh still exists and .config/ssh doesn’t exists on the original filesystem), that’s the intended behavior.
Rewritefs does not rewrite readdir(), since it would need "backwards" rewriting (and that’s not technically possible, since the rules are defined using regular expressions). ls calls readdir(), which returns .ssh. ls then tries to call stat(".ssh") to find metadata (permissions, mtime and so on), which is rewritten into stat(".config/ssh") which does not exists, hence this error.
/foo/i m/fOo/u m/dev\/null/ m|tata| m|This\sis \san\sextended \sregexep|x
Note that m{foo} is not recognized ; you must use m{foo{
i and x has the same meaning than in Perl. u means "use utf-8" (both for pattern and input string).
Limit the following rules to programs matching REGEXP (comparing with the content of /proc/(pid)/cmdline, replacing null characters with spaces)
A file matching REGEXP will be rewritten to rewritten-path. To be more accurate, the matched data will be replaced by rewritten-path in the filename. For example, with this rule:
/fo/ ba
accessing to foo will be translated into bao. Warning, if you don't start your regexp with ^, "information" will be rewritten into "inbamation" !
If rewritten-path is ., it means "don't rewrite anything".
. and .. will never be proposed to be translated.
You can access captured groups as backreferences (\1, \2, …).
A regular expression can be written in more than one line, in particular in conjunction with the x flag.
For example, instead of writing:
/\.(gtk-bookmarks|mysql_history)/ .cache/\1
you can write the more efficient:
/\.(?=gtk-bookmarks|mysql_history)/ .cache/
I urge you to read "Mastering regular expressions" if you want to make rules substantially different from the example.