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