I try to keep my Linux system as clean as possible, but for almost every project I inadvertently have to install some packages with
apt-get, build some from source with
make install, or even install some proprietary program that in turn requires more packages. So over time my system acquires more and more junk.
To solve this problem, I made “
virualenv for system packages”, a little script that makes a
chroot with an unholy combination of OverlayFS and bind mounts. From inside the
chroot, it looks and behaves exactly like your
/, with no overhead or isolation whatsoever. The only difference is that writes to all system directories go to an overlay directory.
$ sudo bash activate.sh (env)$ sudo apt-get install everything (env)$ sudo make install (env)$ echo "Hello world" > hello.txt (env)$ ^D $ everything Command not found $ cat hello.txt Hello world
In the Python world this is pretty much the standard. You make a
pip install all the things you need, and delete then environment after your project is done. I want this kind of behavior for all of my software.
Of course you can run everything in a VM, a Docker image, or a
chroot. But these typically provide isolation that I don’t want or need. They also have a lot of overhead in RAM, disk space, and most importantly, effort on my part. However, the git-like overlay filesystems used by Docker gave me an idea.
What if I made a
chroot, but instead of putting an entire Debian installation inside it, make an overlay on my own system. The only trouble is that special directories like
/dev should work as usual, and preferably my
/home folder should also persist outside the
The solution turns out to be relatively simple: My
/home and all the special directories are mounted with
mount --bind. All system directories like
/bin are mounted with
mount -t overlay.
It works great for from-source installs and proprietary software. It also works for
apt-get, but I’m sure weird things will happen once you upgrade your system. Once it gets wonky, just nuke the env and start over.
Get the code here, pull requests welcome.