Skip to content

Instantly share code, notes, and snippets.

@sveetch
Created January 26, 2018 13:34
Show Gist options
  • Save sveetch/35cdf4e6dd940758a75c9ee51ca60340 to your computer and use it in GitHub Desktop.
Save sveetch/35cdf4e6dd940758a75c9ee51ca60340 to your computer and use it in GitHub Desktop.
Simple backup process with tar
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
A simple script to check about sources paths contained in a
listing file.
Listing file contains a path on each line, path should be absolute and will
be checked with os.path.exists.
Once finished, script will output first the validated file path list then
after the paths that do not exists on FS.
"""
import io, os
def check(filepath):
"""
Check source paths from given file from ``filepath``
"""
collection = []
available = []
errors = []
with io.open(filepath, 'r') as fp:
for item in fp:
collection.append(item.strip())
for item in collection:
if not os.path.exists(item):
errors.append(item)
else:
available.append(item)
print("Validated files:")
for item in available:
print(item)
print('')
print("Invalid files:")
for item in errors:
print(item)
print('')
if __name__ == '__main__':
import argparse
description = ('Open a file to check every items exists on Filesystem')
parser = argparse.ArgumentParser(description=description)
parser.add_argument('filepath', metavar='filepath',
help='File that contains paths to check, one path on each line')
args = parser.parse_args()
if os.path.exists(args.filepath):
print("Opening file for checking: {}".format(args.filepath))
print('')
check(args.filepath)
else:
print("Given path does not exists: {}".format(args.filepath))

Simple backup process with tar

Le processus simple et de séléctionner les sources (fichier ou répertoire) à collecter dans un fichier texte, un élément par ligne.

Il est fourni ensuite à tar comme liste de fichiers à sauvegarder dans un tarball.

Il est conseillé de diviser en plusieurs tarballs les types de fichiers comme sauvegarder à part les configs et les documents, de sorte à ne pas avoir un unique tarball géant à ouvrir pour récupérer un simple fichier de configuration.

Séléction des fichiers

Avec un navigateur de fichiers comme Dolphin, on peut simplement séléctionner les fichiers et répertoires, faire Édition > Copier et leur chemin complet sera mis dans le "presse papier". Le navigateur ne traîte pas la copie de fichiers directement, il n'y a pas de risques d'obstruction de la mémoire.

On peut ensuite coller cette liste dans un fichier texte et l'on aura une simple liste de fichiers et répertoires pour alimenter tar.

À noter que la liste des fichiers est préfixé par le nom de protocole utilisé pour accéder aux fichiers, tel que file:// pour un fichier local, ftp:// pour un fichier sur un serveur FTP, etc.. Retirez le et n'essayez pas de copier autre chose qu'un fichier local, tar ne pourra probablement pas le traiter.

Sauvegarde

Partant du principe qu'un fichier files.txt a été créé avec le contenu suivant (selon la méthode de Séléction des fichiers précédemment décrite): :

/home/goldorak/pngquant/Screenshot_20180123_150045.png
/home/goldorak/pngquant/Screenshot_20180123_162825.png
/home/goldorak/Sveetoy-sass-0.8.0.zip

Avant de continuer il est fortement recommandé de fermer toute les applications utilisant les sources listés dans le fichier sinon vous risquez des pertes, un échec du processus ou même bloquer tar de façon muette et infinie dans certains cas (selon le mode d'ouverture du fichier).

On peut alors procéder à la sauvegarde de la manière suivante: :

tar -cvzf mybackup.tar.gz --dereference --hard-dereference --files-from=files.txt

L'option cvzf créé un tarball compressé avec gunzip en mode verbeux. tar parcours de façon récursive les répertoires qui lui sont indiqués.

Les options --dereference et --hard-dereference forcent la copie de la cible de liens symboliques ou hard.

Les chemins absolus seront convertis en chemin relatif au tarball de sorte à ce que décompresser l'archive ne risque pas d'écraser les chemins absolus ciblés et les crééront depuis l'emplacement courant.

Ajouter l'option --absolute-names à la commande de sauvegarde si vous souhaitez conserver le chemin absolu complet.

Les lignes du fichier des sources qui commenceront par un - seront considérés comme des options pour tar. Si vous avez des chemins commencant par -, ajouter l'option --verbatim-files-from pour vous assurer qu'ils seront bien considérer comme des fichiers et ne perturberont pas le processus de sauvegarde.

Si éventuellement votre de séléction de sources est "trop large" vous pouvez exclure des fichiers avec l'option --exclude=PATTERN, consultez l'aide de tar pour plus de détails sur les motifs d'exclusions possibles.

Restauration

La restauration consiste juste à ouvrir l'archive: :

tar -xvzf mybackup.tar.gz

Tout les fichiers seront créés à partir de l'emplacement courant. L'arborescence récursive des fichiers et répertoires sauvegardés est restaurée intégralement mais depuis l'emplacement courant.

Différence avec Rsync

Rsync est un outil de synchronisation qui peut servir pour sauvegarder mais un tarball est utilisable plus aisément et depuis un système linux basique.

En outre il ne compresse rien, son utilisation demande plus d'espace disque.

Par contre Rsync peut être plus rapide car après la première synchronisation il ne retraite pas l'intégralité des fichiers, seulement ceux supprimés ou nouvellement créés.

Rsync est un outil à utiliser périodiquement, tar est un outil à utiliser de façon ponctuel.

Validation d'un fichier de chemins de sources

Pour éviter des déconvenues il peut être utile de valider que les chemins contenu dans un fichier de listing à utiliser pour une sauvegarde, n'a pas de chemins invalides.

Un simple script Python est fourni avec ce document pour valider ces fichiers de listing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment