Purpose of FSVS
Overview
FSVS should do two things:
- Make reliable, compressed, non-intrusive, versioned backups with meta-data support.
- Help in system deployment.
Backups
As long as you regularly commit your machine's files, you're safe.
If your harddisk dies, you just update to the last version;
if you destroy or remove a file per accident, you can choose a version
from your repository.
Most of that can be done by subversion
today; what FSVS does more:
- meta-data support (although patches for subversion
exist;
but they don't have much chance to be ever included, in spite of
issue 1256
and many wishes on the mailings lists);
- non-intrusive means that there are no .svn subdirectories in every directory.
(This is like svk, but that's IMO slow and needs a local repository).
The advantage over using
rsync is the availiability of many versions per file,
and storing these compressed; scripts exist to have a few versions backuped with rsync,
but they're all full-text. (At least the changed files use their full size).
System deployment
Example tree:
base/
trunk/
tags/
version-1/
version-2/
version-3/
released/
user/
anthony/
bertram/
charlie/
machine/
workstation-1/
workstation-2/
workstation-3/
software/
package-1/
package-2/
Imagine having 10 similar machines with the same base-installation.
Then you install one machine, check that into the repository as
base/trunk,
and make a copy as
base/released.
The other machines get base/released as checkout source, and another (overlayed) from
eg. machine/A.
Per-machine changes are always committed into the machine/*-parts of the repository; this
would be eg. hostname, ip address, and similar things.
On the development machine all changes are stored into base/trunk; if you're satisfied
with your changes you merge into base/released, whereupon all other machines can update
to this latest version.
So by looking at machine/X you can always see what makes this machine different
from the others; and in base/released you can check out every old version to verify
problems and bugs.
It would be reasonable to have another tree in the repository for the user-data, eg user/X.
On user installation this directory would be checked out onto the machine below /home, and the user has the same data
area everywhere, and backuped as often as the administrator tells cron to do commits.
Optional software packages could be stored in another subtree. They should be of lower priority than the
base tree, because if conflicts arise1,
the base should always be prefered, to make sure that the machine
is at least accessible (it's better that a software doesn't work than that the machine stops working).
Note 1: Conflicts should not be "auto-merged". If two or more trees bring the same file,
the file from the "highest" tree wins.