Bup: Difference between revisions

From miki
Jump to navigation Jump to search
 
(8 intermediate revisions by the same user not shown)
Line 28: Line 28:
export PYTHON=/opt/bin/python2 # To avoid using /usr/bin/python, see bup doc.
export PYTHON=/opt/bin/python2 # To avoid using /usr/bin/python, see bup doc.
make
make
make test # Many issues... see below.
make test
make install PREFIX=/opt
</source>
</source>
Houston, we have a problem. We can reproduce as follows:
Houston, we have a problem. We can reproduce as follows:
Line 44: Line 45:
<source lang="bash">
<source lang="bash">
LD_PRELOAD=/opt/lib/libintl.so python2.7 bup_intl_issue.py
LD_PRELOAD=/opt/lib/libintl.so python2.7 bup_intl_issue.py
</source>
But this trick does not work when calling <code>bup</code>.

Let's postpone that. I've another problem when installing <code>fuse-python</code>:
<source lang=bash>
pip2.7 install fuse-python
# Collecting fuse-python
# Using cached fuse-python-0.2.tar.gz
# Complete output from command python setup.py egg_info:
# pkg-config unavailable, build terminated
#
# ----------------------------------------
# Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-sKLWYV/fuse-python/
</source>

To run <code>bup</code> via ssh, we must add it to the PATH.
* Make sure that <code>PermitUserEnvironment yes</code> is in the file {{file|sshd_config}} on the server.
* Add to {{file|~/.ssh/environment}}:
<source lang="bash">
PATH=/opt/bin:/opt/local/bin:/opt/sbin:$PATH
</source>

== Install on Raspberry-pi ==
<source lang="bash">
git clone https://github.com/bup/bup
sudo apt-get install python2.7-dev python-fuse python-pyxattr python-pylibacl linux-libc-dev acl attr python-tornado pandoc
make
make test
sudo make install # First run make install before checkinstall
sudo checkinstall # ... or checkinstall fails
</source>

== Server config ==

;.ssh/authorized_keys
Bup connects to remote backup server using git. When connecting, the client assumes that the server runs a special bup shell, <code>bup server</code>. For this we must configure the file {{file|.ssh/authorized_keys}} on the server as follows:

<source lang="bash">
command="BUP_DEBUG=0 BUP_FORCE_TTY=3 bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...
</source>

== Usage ==

Now, from the client:
<source lang="bash">
bup init -r server:/path/to/bup/dir
# Initialized empty Git repository in /home/localuser/.bup/
#
# Initialized empty Git repository in /path/to/bup/dir
</source>

== Benchmarks ==
TBC

<source lang="bash">
du -hs /var/www/datasheet/
# 321M /var/www/datasheet/
# </source>

<source lang="text">
bup init -r laciebup:/shares/beq06659/bup
bup index /var/www/datasheet
time bup save -r laciebup:/shares/beq06659/bup -n var-www-datasheet /var/www/datasheet
#
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.
# Receiving index from server: 481300/481300, done.
#
# real 0m36.811s
# user 0m5.880s
# sys 0m0.652s
#
bup init -r griffinbup:/smb/lacie-cloudbox/beq06659/bup
bup index /var/www/datasheet
time bup save -r griffinbup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
#
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.
# Receiving index from server: 481300/481300, done.
#
# real 0m9.190s
# user 0m6.660s
# sys 0m0.684s
#
bup init -r griffinbup:.bup
bup index /var/www/datasheet
time bup save -r griffinbup:.bup -n var-www-datasheet /var/www/datasheet
#
# Reading index: 115, done.
# Receiving index from server: 481300/481300, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.
# Receiving index from server: 1100/1100, done.
#
# real 0m4.311s
# user 0m2.756s
# sys 0m0.392s
bup init -r pibup:.bup
bup index /var/www/datasheet
time bup save -r pibup:.bup -n var-www-datasheet /var/www/datasheet
#
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.
# Receiving index from server: 481300/481300, done.
#
# real 1m6.180s
# user 0m6.904s
# sys 0m0.604s
#
bup init -r pibup:/smb/lacie-cloudbox/beq06659/bup
bup index /var/www/datasheet
time bup save -r pibup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
#
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.
# Receiving index from server: 481300/481300, done.
#
# real 1m1.208s
# user 0m6.624s
# sys 0m0.564s
</source>

== Troubleshoot ==
=== fsync(...) - Invalid argument ===
<source lang="bash">
time bup save -r griffinbup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
# Traceback (most recent call last):
# ...
# File "/usr/local/lib/bup/bup/git.py", line 776, in _end
# os.fsync(self.parentfd)
# OSError: [Errno 22] Invalid argument
# ...
# bup.client.ClientError: server exited unexpectedly with code 1
</source>

<code>fsync()</code> is not supported on Samba fs, for directory fd. See [https://groups.google.com/forum/#!searchin/bup-list/samba%7Csort:relevance/bup-list/5rqPrlo_6h8/XYENSGjoAwAJ], [https://github.com/borgbackup/borg/issues/1287].

The fix from [https://github.com/borgbackup/borg/pull/1288/commits/0005023a7354856fafcea144110bcc2b42accd40 borgbackup]:
<source lang="python">
+import errno
# ...
os.fsync(self.parentfd)
+ except OSError as os_error:
+ # Some network filesystems don't support this and fail with EINVAL.
+ # Other error codes (e.g. EIO) shouldn't be silenced.
+ if os_error.errno != errno.EINVAL:
+ raise
</source>

=== 'init-dir: command not found' on 'bup init'===

<source lang="bash">
bup init -r griffin:/smb/lacie-cloudbox/beq06659/bup
# Initialized empty Git repository in /home/peetersm/.bup/
#
# -bash: line 1: init-dir: command not found
# ...
</source>

The server must be configured to start a <code>bup server</code> shell when connecting with ssh.
This can be achieved by configuring the file {{file|~/.ssh/authorized_keys}} as follows:

<source lang="bash">
command="/path/to/bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...
</source>

On the mailing list, people uses a more complex line:
<source lang="bash">
from="198.51.100.123,2001:db8::123",command="BUP_DEBUG=0 BUP_FORCE_TTY=3 bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...
</source>
</source>

Latest revision as of 22:56, 1 May 2017

References

Bup reviews:

Also details how to setup snapshot on Windows using vscsc to make consistent backups.
Someone commented that par2 should be replaced by zfec.

Install on Lacie-Cloudbox

git clone https://github.com/bup/bup
ipkg install attr libacl
ipkg install python27 py27-tornado py27-pip
which python
which python2
# optware python only available as "python2", and pip as "pip2.7"
pip2.7 install fuse-python
# pip2.7 install xattr libacl
# # error: /opt/local/lib/python2.5/site-packages (in --site-dirs) is not on sys.path
# export PYTHONPATH=/opt/local/lib/python2.5/site-packages
# # see https://forum.qnap.com/viewtopic.php?t=73608

pip2.7 install pyxattr pylibacl       # Do NOT install xattr

export PYTHON=/opt/bin/python2        # To avoid using /usr/bin/python, see bup doc.
make
make test                             # Many issues... see below.
make install PREFIX=/opt

Houston, we have a problem. We can reproduce as follows:

cat bup_intl_issue.py
# import posix1e;           # From package pylibacl
python bup_intl_issue.py
# /opt/bin/python2.7: symbol 'libintl_gettext': can't resolve symbol
# Traceback (most recent call last):
#   File "bup_intl_issue.py", line 1, in <module>
#     import posix1e;
# ImportError: unknown dlopen() error

We can fix the issue using the LD_PRELOAD trick though:

LD_PRELOAD=/opt/lib/libintl.so python2.7 bup_intl_issue.py

But this trick does not work when calling bup.

Let's postpone that. I've another problem when installing fuse-python:

pip2.7 install fuse-python
# Collecting fuse-python
#   Using cached fuse-python-0.2.tar.gz
#     Complete output from command python setup.py egg_info:
#     pkg-config unavailable, build terminated
#
#     ----------------------------------------
# Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-sKLWYV/fuse-python/

To run bup via ssh, we must add it to the PATH.

  • Make sure that PermitUserEnvironment yes is in the file sshd_config on the server.
  • Add to ~/.ssh/environment:
PATH=/opt/bin:/opt/local/bin:/opt/sbin:$PATH

Install on Raspberry-pi

git clone https://github.com/bup/bup
sudo apt-get install python2.7-dev python-fuse python-pyxattr python-pylibacl linux-libc-dev acl attr python-tornado pandoc
make
make test
sudo make install           # First run make install before checkinstall
sudo checkinstall           # ... or checkinstall fails

Server config

.ssh/authorized_keys

Bup connects to remote backup server using git. When connecting, the client assumes that the server runs a special bup shell, bup server. For this we must configure the file .ssh/authorized_keys on the server as follows:

command="BUP_DEBUG=0 BUP_FORCE_TTY=3 bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...

Usage

Now, from the client:

bup init -r server:/path/to/bup/dir
# Initialized empty Git repository in /home/localuser/.bup/
#
# Initialized empty Git repository in /path/to/bup/dir

Benchmarks

TBC

du -hs /var/www/datasheet/
# 321M	/var/www/datasheet/
#
bup init -r laciebup:/shares/beq06659/bup
bup index /var/www/datasheet
time bup save -r laciebup:/shares/beq06659/bup -n var-www-datasheet /var/www/datasheet
# 
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.    
# Receiving index from server: 481300/481300, done.
# 
# real	0m36.811s
# user	0m5.880s
# sys	0m0.652s
# 
bup init -r griffinbup:/smb/lacie-cloudbox/beq06659/bup
bup index /var/www/datasheet
time bup save -r griffinbup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
# 
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.    
# Receiving index from server: 481300/481300, done.
# 
# real	0m9.190s
# user	0m6.660s
# sys	0m0.684s
# 
bup init -r griffinbup:.bup
bup index /var/www/datasheet
time bup save -r griffinbup:.bup -n var-www-datasheet /var/www/datasheet
# 
# Reading index: 115, done.
# Receiving index from server: 481300/481300, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.    
# Receiving index from server: 1100/1100, done.    
# 
# real	0m4.311s
# user	0m2.756s
# sys	0m0.392s
bup init -r pibup:.bup
bup index /var/www/datasheet
time bup save -r pibup:.bup -n var-www-datasheet /var/www/datasheet
# 
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.    
# Receiving index from server: 481300/481300, done.         
# 
# real	1m6.180s
# user	0m6.904s
# sys	0m0.604s
# 
bup init -r pibup:/smb/lacie-cloudbox/beq06659/bup
bup index /var/www/datasheet
time bup save -r pibup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
# 
# Reading index: 115, done.
# Saving: 100.00% (327721/327721k, 115/115 files), done.    
# Receiving index from server: 481300/481300, done.         
# 
# real	1m1.208s
# user	0m6.624s
# sys	0m0.564s

Troubleshoot

fsync(...) - Invalid argument

time bup save -r griffinbup:/smb/lacie-cloudbox/beq06659/bup -n var-www-datasheet /var/www/datasheet
# Traceback (most recent call last):               
#   ...
#   File "/usr/local/lib/bup/bup/git.py", line 776, in _end
#     os.fsync(self.parentfd)
# OSError: [Errno 22] Invalid argument
#   ...
# bup.client.ClientError: server exited unexpectedly with code 1

fsync() is not supported on Samba fs, for directory fd. See [1], [2].

The fix from borgbackup:

+import errno
# ...
         os.fsync(self.parentfd)
+    except OSError as os_error:
+        # Some network filesystems don't support this and fail with EINVAL.
+        # Other error codes (e.g. EIO) shouldn't be silenced.
+        if os_error.errno != errno.EINVAL:
+            raise

'init-dir: command not found' on 'bup init'

bup init -r griffin:/smb/lacie-cloudbox/beq06659/bup
# Initialized empty Git repository in /home/peetersm/.bup/
# 
# -bash: line 1: init-dir: command not found
# ...

The server must be configured to start a bup server shell when connecting with ssh. This can be achieved by configuring the file ~/.ssh/authorized_keys as follows:

command="/path/to/bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...

On the mailing list, people uses a more complex line:

from="198.51.100.123,2001:db8::123",command="BUP_DEBUG=0 BUP_FORCE_TTY=3 bup server",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...