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