Introduction
When rdiff-backup writes to storage provided over UNFS3 then it encounters the following error:
Exception '[Errno 116] Stale NFS file handle: '/staging/backups/ditalini_root.rdiffbackup/bin/rdiff-backup.tmp.39'' raised of class 'exceptions.OSError': File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 302, in error_check_Main try: Main(arglist) File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 322, in Main take_action(rps) File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 278, in take_action elif action == "backup": Backup(rps[0], rps[1]) File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 344, in Backup backup.Mirror(rpin, rpout) File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 38, in Mirror DestS.patch(dest_rpath, source_diffiter) File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 218, in patch ITR(diff.index, diff) File "/var/lib/python-support/python2.4/rdiff_backup/rorpiter.py", line 281, in __call__ last_branch.fast_process(*args) File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 515, in fast_process if self.patch_to_temp(mirror_rp, diff_rorp, tf): File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 536, in patch_to_temp result = self.patch_snapshot_to_temp(diff_rorp, new) File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 561, in patch_snapshot_to_temp rpath.copy_attribs(diff_rorp, new) File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 166, in copy_attribs rpout.chown(*rpout.conn.user_group.map_rpath(rpin)) File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 874, in chown try: self.conn.C.lchown(self.path, uid, gid)
This problem stems from that UNFS3 does not implement lchown().
This page describes how Alexis Huxley got rdiff-backup working with UNFS3.
Procedure
- Create lchown.c containing:
#include <sys/types.h> int lchown( const char *path, uid_t owner, gid_t group) { return(0); }
- Convert this to a shared library with the commands:
PUBLIBNAME=librdiffhack.so.1 PRVLIBNAME=$PUBLIBNAME.0.1 LIBDIR=/usr/local/lib gcc -fPIC -g -c -Wall lchown.c gcc -shared -Wl,-soname,$PUBLIBNAME -o $PRVLIBNAME lchown.o -lc mkdir -p $LIBDIR cp $PRVLIBNAME $LIBDIR ln -s $PRVLIBNAME $LIBDIR/$PUBLIBNAME
- Trick rdiff-backup into using this version of lchown() either by invoking it as follows:
LD_PRELOAD=/usr/local/lib/librdiffhack.so.1 rdiff-backup ...
or by creating a wrapper script like this one:
#!/bin/sh LD_PRELOAD=/usr/local/lib/librdiffhack.so.1 exec rdiff-backup "$@"