]> arthur.barton.de Git - bup.git/blob - README.md
Update HACKING and README for 0.30.1
[bup.git] / README.md
1 bup: It backs things up
2 =======================
3
4 bup is a program that backs things up.  It's short for "backup." Can you
5 believe that nobody else has named an open source program "bup" after all
6 this time?  Me neither.
7
8 Despite its unassuming name, bup is pretty cool.  To give you an idea of
9 just how cool it is, I wrote you this poem:
10
11                              Bup is teh awesome
12                           What rhymes with awesome?
13                             I guess maybe possum
14                            But that's irrelevant.
15                         
16 Hmm.  Did that help?  Maybe prose is more useful after all.
17
18
19 Reasons bup is awesome
20 ----------------------
21
22 bup has a few advantages over other backup software:
23
24  - It uses a rolling checksum algorithm (similar to rsync) to split large
25    files into chunks.  The most useful result of this is you can backup huge
26    virtual machine (VM) disk images, databases, and XML files incrementally,
27    even though they're typically all in one huge file, and not use tons of
28    disk space for multiple versions.
29    
30  - It uses the packfile format from git (the open source version control
31    system), so you can access the stored data even if you don't like bup's
32    user interface.
33    
34  - Unlike git, it writes packfiles *directly* (instead of having a separate
35    garbage collection / repacking stage) so it's fast even with gratuitously
36    huge amounts of data.  bup's improved index formats also allow you to
37    track far more filenames than git (millions) and keep track of far more
38    objects (hundreds or thousands of gigabytes).
39    
40  - Data is "automagically" shared between incremental backups without having
41    to know which backup is based on which other one - even if the backups
42    are made from two different computers that don't even know about each
43    other.  You just tell bup to back stuff up, and it saves only the minimum
44    amount of data needed.
45    
46  - You can back up directly to a remote bup server, without needing tons of
47    temporary disk space on the computer being backed up.  And if your backup
48    is interrupted halfway through, the next run will pick up where you left
49    off.  And it's easy to set up a bup server: just install bup on any
50    machine where you have ssh access.
51    
52  - Bup can use "par2" redundancy to recover corrupted backups even if your
53    disk has undetected bad sectors.
54    
55  - Even when a backup is incremental, you don't have to worry about
56    restoring the full backup, then each of the incrementals in turn; an
57    incremental backup *acts* as if it's a full backup, it just takes less
58    disk space.
59    
60  - You can mount your bup repository as a FUSE filesystem and access the
61    content that way, and even export it over Samba.
62    
63  - It's written in python (with some C parts to make it faster) so it's easy
64    for you to extend and maintain.
65
66
67 Reasons you might want to avoid bup
68 -----------------------------------
69
70  - It's not remotely as well tested as something like tar, so it's
71    more likely to eat your data.  It's also missing some
72    probably-critical features, though fewer than it used to be.
73    
74  - It requires python >= 2.6, a C compiler, and an installed git
75    version >= 1.5.6.  It also requires par2 if you want fsck to be
76    able to generate the information needed to recover from some types
77    of corruption.
78  
79  - It currently only works on Linux, FreeBSD, NetBSD, OS X >= 10.4,
80    Solaris, or Windows (with Cygwin, and maybe with WSL).  Patches to
81    support other platforms are welcome.
82
83  - Any items in "Things that are stupid" below.
84
85
86 Notable changes introduced by a release
87 =======================================
88
89  - <a href="note/0.30.1-from-0.30.md">Changes in 0.30.1 as compared to 0.30</a>
90  - <a href="note/0.30-from-0.29.3.md">Changes in 0.30 as compared to 0.29.3</a>
91  - <a href="note/0.29.3-from-0.29.2.md">Changes in 0.29.3 as compared to 0.29.2</a>
92  - <a href="note/0.29.2-from-0.29.1.md">Changes in 0.29.2 as compared to 0.29.1</a>
93  - <a href="note/0.29.1-from-0.29.md">Changes in 0.29.1 as compared to 0.29</a>
94  - <a href="note/0.29-from-0.28.1.md">Changes in 0.29 as compared to 0.28.1</a>
95  - <a href="note/0.28.1-from-0.28.md">Changes in 0.28.1 as compared to 0.28</a>
96  - <a href="note/0.28-from-0.27.1.md">Changes in 0.28 as compared to 0.27.1</a>
97  - <a href="note/0.27.1-from-0.27.md">Changes in 0.27.1 as compared to 0.27</a>
98
99
100 Test status
101 ===========
102
103 | branch | Debian                                                                                                                                         | FreeBSD                                                                                                                                          | macOS                                                                                                                                        |
104 |--------|------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------|
105 | master | [![Debian test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=master&task=debian)](https://cirrus-ci.com/github/bup/bup) | [![FreeBSD test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=master&task=freebsd)](https://cirrus-ci.com/github/bup/bup) | [![macOS test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=master&task=macos)](https://cirrus-ci.com/github/bup/bup) |
106 | 0.29.x | [![Debian test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=0.29.x&task=debian)](https://cirrus-ci.com/github/bup/bup) | [![FreeBSD test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=0.29.x&task=freebsd)](https://cirrus-ci.com/github/bup/bup) | [![macOS test status](https://api.cirrus-ci.com/github/bup/bup.svg?branch=0.29.x&task=macos)](https://cirrus-ci.com/github/bup/bup) |
107
108 Getting started
109 ===============
110
111 From source
112 -----------
113
114  - Check out the bup source code using git:
115  
116         git clone https://github.com/bup/bup
117
118  - This will leave you on the master branch, which is perfect if you
119    would like to help with development, but if you'd just like to use
120    bup, please check out the latest stable release like this:
121
122         git checkout 0.29.1
123
124    You can see the latest stable release here:
125    https://github.com/bup/bup/releases.
126
127  - Install the required python libraries (including the development
128    libraries).
129
130    On very recent Debian/Ubuntu versions, this may be sufficient (run
131    as root):
132
133             apt-get build-dep bup
134
135    Otherwise try this (substitute python2.6-dev if you have an older
136    system):
137
138             apt-get install python2.7-dev python-fuse
139             apt-get install python-pyxattr python-pylibacl
140             apt-get install linux-libc-dev
141             apt-get install acl attr
142             apt-get install python-tornado # optional
143
144    On CentOS (for CentOS 6, at least), this should be sufficient (run
145    as root):
146
147             yum groupinstall "Development Tools"
148             yum install python python-devel
149             yum install fuse-python pyxattr pylibacl
150             yum install perl-Time-HiRes
151
152    In addition to the default CentOS repositories, you may need to add
153    RPMForge (for fuse-python) and EPEL (for pyxattr and pylibacl).
154
155    On Cygwin, install python, make, rsync, and gcc4.
156
157    If you would like to use the optional bup web server on systems
158    without a tornado package, you may want to try this:
159
160             pip install tornado
161
162  - Build the python module and symlinks:
163
164         make
165         
166  - Run the tests:
167  
168         make long-check
169
170     or if you're in a bit more of a hurry:
171
172         make check
173         
174     The tests should pass.  If they don't pass for you, stop here and
175     send an email to bup-list@googlegroups.com.  Though if there are
176     symbolic links along the current working directory path, the tests
177     may fail.  Running something like this before "make test" should
178     sidestep the problem:
179
180         cd "$(pwd -P)"
181
182  - You can install bup via "make install", and override the default
183    destination with DESTDIR and PREFIX.
184
185    Files are normally installed to "$DESTDIR/$PREFIX" where DESTDIR is
186    empty by default, and PREFIX is set to /usr/local.  So if you wanted to
187    install bup to /opt/bup, you might do something like this:
188
189         make install DESTDIR=/opt/bup PREFIX=''
190
191  - The Python executable that bup will use is chosen by ./configure,
192    which will search for a reasonable version unless PYTHON is set in
193    the environment, in which case, bup will use that path.  You can
194    see which Python executable was chosen by looking at the
195    configure output, or examining cmd/python-cmd.sh, and you can
196    change the selection by re-running ./configure.
197
198 From binary packages
199 --------------------
200
201 Binary packages of bup are known to be built for the following OSes:
202
203  - Debian:
204     http://packages.debian.org/search?searchon=names&keywords=bup
205  - Ubuntu:
206     http://packages.ubuntu.com/search?searchon=names&keywords=bup
207  - pkgsrc (NetBSD, Dragonfly, and others)
208     http://pkgsrc.se/sysutils/bup
209     http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
210  - Arch Linux:
211     https://www.archlinux.org/packages/?sort=&q=bup
212  - Fedora:
213     https://apps.fedoraproject.org/packages/bup
214
215
216 Using bup
217 ---------
218
219  - Get help for any bup command:
220
221         bup help
222         bup help init
223         bup help index
224         bup help save
225         bup help restore
226         ...
227
228  - Initialize the default BUP_DIR (~/.bup -- you can choose another by
229    either specifying `bup -d DIR ...` or setting the `BUP_DIR`
230    environment variable for a command):
231
232         bup init
233
234  - Make a local backup (-v or -vv will increase the verbosity):
235
236         bup index /etc
237         bup save -n local-etc /etc
238
239  - Restore a local backup to ./dest:
240
241         bup restore -C ./dest local-etc/latest/etc
242         ls -l dest/etc
243
244  - Look at how much disk space your backup took:
245
246         du -s ~/.bup
247
248  - Make another backup (which should be mostly identical to the last one;
249    notice that you don't have to *specify* that this backup is incremental,
250    it just saves space automatically):
251
252         bup index /etc
253         bup save -n local-etc /etc
254
255  - Look how little extra space your second backup used (on top of the first):
256
257         du -s ~/.bup
258
259  - Get a list of your previous backups:
260
261         bup ls local-etc
262
263  - Restore your first backup again:
264
265         bup restore -C ./dest-2 local-etc/2013-11-23-11195/etc
266
267  - Make a backup to a remote server which must already have the 'bup' command
268    somewhere in its PATH (see /etc/profile, etc/environment, ~/.profile, or
269    ~/.bashrc), and be accessible via ssh.
270    Make sure to replace SERVERNAME with the actual hostname of your server:
271
272         bup init -r SERVERNAME:path/to/remote-bup-dir
273         bup index /etc
274         bup save -r SERVERNAME:path/to/remote-bup-dir -n local-etc /etc
275
276  - Make a remote backup to ~/.bup on SERVER:
277
278         bup index /etc
279         bup save -r SERVER: -n local-etc /etc
280
281  - See what saves are available in ~/.bup on SERVER:
282
283         bup ls -r SERVER:
284
285  - Restore the remote backup to ./dest:
286
287         bup restore -r SERVER: -C ./dest local-etc/latest/etc
288         ls -l dest/etc
289
290  - Defend your backups from death rays (OK fine, more likely from the
291    occasional bad disk block).  This writes parity information
292    (currently via par2) for all of the existing data so that bup may
293    be able to recover from some amount of repository corruption:
294
295         bup fsck -g
296
297  - Use split/join instead of index/save/restore.  Try making a local
298    backup using tar:
299  
300         tar -cvf - /etc | bup split -n local-etc -vv
301         
302  - Try restoring the tarball:
303  
304         bup join local-etc | tar -tf -
305         
306  - Look at how much disk space your backup took:
307  
308         du -s ~/.bup
309         
310  - Make another tar backup:
311  
312         tar -cvf - /etc | bup split -n local-etc -vv
313         
314  - Look at how little extra space your second backup used on top of
315    the first:
316  
317         du -s ~/.bup
318         
319  - Restore the first tar backup again (the ~1 is git notation for "one
320    older than the most recent"):
321    
322         bup join local-etc~1 | tar -tf -
323  
324  - Get a list of your previous split-based backups:
325  
326         GIT_DIR=~/.bup git log local-etc
327         
328  - Save a tar archive to a remote server (without tar -z to facilitate
329    deduplication):
330    
331         tar -cvf - /etc | bup split -r SERVERNAME: -n local-etc -vv
332  
333  - Restore the archive:
334  
335         bup join -r SERVERNAME: local-etc | tar -tf -
336         
337 That's all there is to it!
338
339
340 Notes on FreeBSD
341 ----------------
342
343 - FreeBSD's default 'make' command doesn't like bup's Makefile. In order to
344   compile the code, run tests and install bup, you need to install GNU Make
345   from the port named 'gmake' and use its executable instead in the commands
346   seen above. (i.e. 'gmake test' runs bup's test suite)
347
348 - Python's development headers are automatically installed with the 'python'
349   port so there's no need to install them separately.
350
351 - To use the 'bup fuse' command, you need to install the fuse kernel module
352   from the 'fusefs-kmod' port in the 'sysutils' section and the libraries from
353   the port named 'py-fusefs' in the 'devel' section.
354
355 - The 'par2' command can be found in the port named 'par2cmdline'.
356
357 - In order to compile the documentation, you need pandoc which can be found in
358   the port named 'hs-pandoc' in the 'textproc' section.
359
360
361 Notes on NetBSD/pkgsrc
362 ----------------------
363
364  - See pkgsrc/sysutils/bup, which should be the most recent stable
365    release and includes man pages.  It also has a reasonable set of
366    dependencies (git, par2, py-fuse-bindings).
367
368  - The "fuse-python" package referred to is hard to locate, and is a
369    separate tarball for the python language binding distributed by the
370    fuse project on sourceforge.  It is available as
371    pkgsrc/filesystems/py-fuse-bindings and on NetBSD 5, "bup fuse"
372    works with it.
373
374  - "bup fuse" presents every directory/file as inode 0.  The directory
375    traversal code ("fts") in NetBSD's libc will interpret this as a
376    cycle and error out, so "ls -R" and "find" will not work.
377
378  - There is no support for ACLs.  If/when some enterprising person
379    fixes this, adjust t/compare-trees.
380
381
382 Notes on Cygwin
383 ---------------
384
385  - There is no support for ACLs.  If/when some enterprising person
386    fixes this, adjust t/compare-trees.
387
388  - In t/test.sh, two tests have been disabled.  These tests check to
389    see that repeated saves produce identical trees and that an
390    intervening index doesn't change the SHA1.  Apparently Cygwin has
391    some unusual behaviors with respect to access times (that probably
392    warrant further investigation).  Possibly related:
393    http://cygwin.com/ml/cygwin/2007-06/msg00436.html
394
395
396 Notes on OS X
397 -------------
398
399  - There is no support for ACLs.  If/when some enterprising person
400    fixes this, adjust t/compare-trees.
401
402
403 How it works
404 ============
405
406 Basic storage:
407 --------------
408
409 bup stores its data in a git-formatted repository.  Unfortunately, git
410 itself doesn't actually behave very well for bup's use case (huge numbers of
411 files, files with huge sizes, retaining file permissions/ownership are
412 important), so we mostly don't use git's *code* except for a few helper
413 programs.  For example, bup has its own git packfile writer written in
414 python.
415
416 Basically, 'bup split' reads the data on stdin (or from files specified on
417 the command line), breaks it into chunks using a rolling checksum (similar to
418 rsync), and saves those chunks into a new git packfile.  There is at least one
419 git packfile per backup.
420
421 When deciding whether to write a particular chunk into the new packfile, bup
422 first checks all the other packfiles that exist to see if they already have that
423 chunk.  If they do, the chunk is skipped.
424
425 git packs come in two parts: the pack itself (*.pack) and the index (*.idx).
426 The index is pretty small, and contains a list of all the objects in the
427 pack.  Thus, when generating a remote backup, we don't have to have a copy
428 of the packfiles from the remote server: the local end just downloads a copy
429 of the server's *index* files, and compares objects against those when
430 generating the new pack, which it sends directly to the server.
431
432 The "-n" option to 'bup split' and 'bup save' is the name of the backup you
433 want to create, but it's actually implemented as a git branch.  So you can
434 do cute things like checkout a particular branch using git, and receive a
435 bunch of chunk files corresponding to the file you split.
436
437 If you use '-b' or '-t' or '-c' instead of '-n', bup split will output a
438 list of blobs, a tree containing that list of blobs, or a commit containing
439 that tree, respectively, to stdout.  You can use this to construct your own
440 scripts that do something with those values.
441
442 The bup index:
443 --------------
444
445 'bup index' walks through your filesystem and updates a file (whose name is,
446 by default, ~/.bup/bupindex) to contain the name, attributes, and an
447 optional git SHA1 (blob id) of each file and directory.
448
449 'bup save' basically just runs the equivalent of 'bup split' a whole bunch
450 of times, once per file in the index, and assembles a git tree
451 that contains all the resulting objects.  Among other things, that makes
452 'git diff' much more useful (compared to splitting a tarball, which is
453 essentially a big binary blob).  However, since bup splits large files into
454 smaller chunks, the resulting tree structure doesn't *exactly* correspond to
455 what git itself would have stored.  Also, the tree format used by 'bup save'
456 will probably change in the future to support storing file ownership, more
457 complex file permissions, and so on.
458
459 If a file has previously been written by 'bup save', then its git blob/tree
460 id is stored in the index.  This lets 'bup save' avoid reading that file to
461 produce future incremental backups, which means it can go *very* fast unless
462 a lot of files have changed.
463
464  
465 Things that are stupid for now but which we'll fix later
466 ========================================================
467
468 Help with any of these problems, or others, is very welcome.  Join the
469 mailing list (see below) if you'd like to help.
470
471  - 'bup save' and 'bup restore' have immature metadata support.
472  
473     On the plus side, they actually do have support now, but it's new,
474     and not remotely as well tested as tar/rsync/whatever's.  However,
475     you have to start somewhere, and as of 0.25, we think it's ready
476     for more general use.  Please let us know if you have any trouble.
477
478     Also, if any strip or graft-style options are specified to 'bup
479     save', then no metadata will be written for the root directory.
480     That's obviously less than ideal.
481
482  - bup is overly optimistic about mmap.  Right now bup just assumes
483    that it can mmap as large a block as it likes, and that mmap will
484    never fail.  Yeah, right... If nothing else, this has failed on
485    32-bit architectures (and 31-bit is even worse -- looking at you,
486    s390).
487
488    To fix this, we might just implement a FakeMmap[1] class that uses
489    normal file IO and handles all of the mmap methods[2] that bup
490    actually calls.  Then we'd swap in one of those whenever mmap
491    fails.
492
493    This would also require implementing some of the methods needed to
494    support "[]" array access, probably at a minimum __getitem__,
495    __setitem__, and __setslice__ [3].
496
497      [1] http://comments.gmane.org/gmane.comp.sysutils.backup.bup/613
498      [2] http://docs.python.org/2/library/mmap.html
499      [3] http://docs.python.org/2/reference/datamodel.html#emulating-container-types
500
501  - 'bup index' is slower than it should be.
502  
503     It's still rather fast: it can iterate through all the filenames on my
504     600,000 file filesystem in a few seconds.  But it still needs to rewrite
505     the entire index file just to add a single filename, which is pretty
506     nasty; it should just leave the new files in a second "extra index" file
507     or something.
508    
509  - bup could use inotify for *really* efficient incremental backups.
510
511     You could even have your system doing "continuous" backups: whenever a
512     file changes, we immediately send an image of it to the server.  We could
513     give the continuous-backup process a really low CPU and I/O priority so
514     you wouldn't even know it was running.
515
516  - bup only has experimental support for pruning old backups.
517
518    While you should now be able to drop old saves and branches with
519    `bup rm`, and reclaim the space occupied by data that's no longer
520    needed by other backups with `bup gc`, these commands are
521    experimental, and should be handled with great care.  See the
522    man pages for more information.
523
524    Unless you want to help test the new commands, one possible
525    workaround is to just start a new BUP_DIR occasionally,
526    i.e. bup-2013, bup-2014...
527
528  - bup has never been tested on anything but Linux, FreeBSD, NetBSD,
529    OS X, and Windows+Cygwin.
530  
531     There's nothing that makes it *inherently* non-portable, though, so
532     that's mostly a matter of someone putting in some effort.  (For a
533     "native" Windows port, the most annoying thing is the absence of ssh in
534     a default Windows installation.)
535     
536  - bup needs better documentation.
537  
538     According to an article about bup in Linux Weekly News
539     (https://lwn.net/Articles/380983/), "it's a bit short on examples and
540     a user guide would be nice."  Documentation is the sort of thing that
541     will never be great unless someone from outside contributes it (since
542     the developers can never remember which parts are hard to understand).
543     
544  - bup is "relatively speedy" and has "pretty good" compression.
545  
546     ...according to the same LWN article.  Clearly neither of those is good
547     enough.  We should have awe-inspiring speed and crazy-good compression. 
548     Must work on that.  Writing more parts in C might help with the speed.
549    
550  - bup has no GUI.
551  
552    Actually, that's not stupid, but you might consider it a
553    limitation.  See the ["Related Projects"](https://bup.github.io/)
554    list for some possible options.
555     
556 More Documentation
557 ==================
558
559 bup has an extensive set of man pages.  Try using 'bup help' to get
560 started, or use 'bup help SUBCOMMAND' for any bup subcommand (like split,
561 join, index, save, etc.) to get details on that command.
562
563 For further technical details, please see ./DESIGN.
564
565
566 How you can help
567 ================
568
569 bup is a work in progress and there are many ways it can still be improved.
570 If you'd like to contribute patches, ideas, or bug reports, please join the
571 bup mailing list.
572
573 You can find the mailing list archives here:
574
575         http://groups.google.com/group/bup-list
576         
577 and you can subscribe by sending a message to:
578
579         bup-list+subscribe@googlegroups.com
580
581 Please see <a href="HACKING">./HACKING</a> for
582 additional information, i.e. how to submit patches (hint - no pull
583 requests), how we handle branches, etc.
584
585
586 Have fun,
587
588 Avery