Duplicity (Español)
Duplicity es un programa de copias de seguridad en red.
Puede guardar instantáneas de directorios y archivos en un archivo tar remoto encriptado con GnuPG, que actúa como repositorio de copias de seguridad. La conexión con el repositorio remoto puede realizarse a través de cualquiera de los siguientes protocolos: rsync, ftp, HSI, WebDAV, Tahoe-LAFS, o Amazon S3.
Las copias de seguridad son incrementales, lo que significa que sólo se almacenan los cambios en los archivos (desde la última instantánea).
Instalación
Frontends
- Duply, un frontend de shell, disponible en el AUR.
-
deja-dup, un frontend fácil de utilizar. Proporciona la herramienta de línea de comandos
deja-dup
y el frontend GTKdeja-dup-preferences
.
Utilización básica
Realizar copias de seguridad
Para realizar una copia de seguridad de la carpeta local /home/me a la ubicación remota /usr/backup en el host other.host a través del protocolo scp/ssh, ejecute la orden
duplicity /home/me scp://uid@other.host//usr/backup
La primera vez que se ejecute esta orden, se creará una copia de seguridad completa. Si se vuelve a ejecutar exactamente la misma orden, se creará una copia de seguridad incremental en el repositorio de copias de seguridad existente.
Las opciones adicionales de la línea de comandos permiten:
- incluir o excluir archivos y directorios específicos de la copia de seguridad (utilizando patrones de shell o expresiones regulares)
- ajustar el cifrado y la firma de las copias de seguridad
Restaurar archivos desde la copia de seguridad
Para restaurar la carpeta local /home/me al estado de la última instantánea guardada en el repositorio remoto /usr/backup en el host other.host, ejecute
duplicity scp://uid@other.host//usr/backup /home/me
Nótese el orden inverso de los argumentos en comparación con el comando de copia de seguridad anterior. El argumento de la URL se trata siempre como el repositorio de la copia de seguridad, y el argumento de la ruta local como el directorio a sincronizar con la copia de seguridad. (Un repositorio local de copias de seguridad debe ser especificado explícitamente usando el prefijo file:// protocol)
Las opciones adicionales de la línea de comandos permiten:
- restaurar un archivo específico en lugar de todo el repositorio
- restaurar archivos al estado que tenían en una fecha específica, en vez de a la instantánea más reciente disponible
Inspección y mantenimiento del repositorio
Existen algunas opciones adicionales en la línea de comandos para comparar el estado del repositorio con el estado de los archivos locales, y para eliminar instantáneas antiguas de forma que sólo se mantenga una cantidad fija de instantáneas o sólo las que sean más recientes que una fecha determinada.
Véase la página de manual para más detalles.
Ejemplo de script de copia de seguridad
#!/bin/sh ## Remote backup script. Requires duplicity and gpg-agent with the keys and passphrases loaded as root. ## Uses separate encryption and signing keys ## Usage: 'backup_remote.sh' enc_key=44D79E41 sign_key=F5C978E3 src="/mnt/backup/" dest="scp://destination.com//backups/homeserver" # Keychain is used to source the ssh-agent keys when running from a cron job type -P keychain &>/dev/null || { echo "I require keychain but it's not installed. Aborting." >&2; exit 1; } eval `keychain --eval web_rsa` || exit 1 ## Note: cannot use keychain for gpg-agent because it does not currently (2.7.1) read in all the keys correctly. ## Gpg will ask for a passphrase twice for each key...once for encryption/decryption and once for signing. ## This makes unattended backups impossible, especially when trying to resume an interrupted backup. if [ -f "${HOME}/.gnupg/gpg-agent-info" ]; then . "${HOME}/.gnupg/gpg-agent-info" export GPG_AGENT_INFO fi duplicity --use-agent \ --verbosity notice \ --encrypt-key "$enc_key" \ --sign-key "$sign_key" \ --full-if-older-than 60D \ --num-retries 3 \ --asynchronous-upload \ --volsize 100 \ --archive-dir /root/.cache/duplicity \ --log-file /var/log/duplicity.log \ --exclude /mnt/backup/fsarchiver \ --exclude '**rdiff-backup-data' \ "$src" "$dest"
chown root `tty`
antes de iniciarlo. Esto no es problema cuando se ejecuta gpg-agent como un usuario no root.function gpg_start { gnupginf="${HOME}/.gnupg/gpg-agent-info" if pgrep -u "${USER}" gpg-agent >/dev/null 2>&1; then eval "$(cat $gnupginf)" eval "$(cut -d= -f1 < $gnupginf | xargs echo export)" else eval "$(gpg-agent -s --daemon --write-env-file $gnupginf)" fi } function keys { touch test-gpg.txt touch test-gpg.txt1 gpg -r 'Duplicity Encryption Key' -e test-gpg.txt gpg -r 'Duplicity Signature Key' -e test-gpg.txt1 gpg -u <signing key> --detach-sign test-gpg.txt gpg -u <encryption key> --detach-sign test-gpg.txt1 gpg -d test-gpg.txt.gpg gpg -d test-gpg.txt1.gpg rm test-gpg.txt* } gpg_start
Solución de problemas
Si obtiene errores gpg que mencionan "inappropriate ioctl for device" lo más probable es que tenga que ver con los cambios en el comportamiento del gpg-agent desde la versión 2.1 en adelante. Véase este hilo para más información. En general, uno necesita permitir explícitamente que los programas proporcionen la frase de contraseña al gpg-agent en vez de preguntar al usuario.
Los pasos necesarios para remediar este problema se detallan en GnuPG#Unattended passphrase.