Sauvegarde & Clonage d'un système

[color=#0000FF]REFONTE COMPLÈTE DE CE FIL :

-A) Le premier ‘post’ concerne la sauvegarde praticable en ligne de commande.

-B) Le second ‘post’ traite du clonage d’un système complet.

-C) Le troisième ‘post’ propose le script qui permet l’application facile des deux précédents
[/color]

POUR DISCUTER, C’EST

-A) : SAUVEGARDE

Dans cet exemple, on considère que le système comporte 2 partitions : / et /home. La swap n’est pas à sauvegarder.

a/ Sauvegarde de tout le système en excluant certains dossiers plus ou moins temporaires.

Il est bien entendu que pour tout ce qui suit, ‘user’ sera remplacé par votre véritable nom d’utilisateur.
Les commandes sont précédées du # mais il est possible d’employer ‘sudo’ pour les adeptes.

– Créer un fichier ‘exclure’ dans /root. Portez-y les lignes suivantes :

/home (puisqu’on fait une sauvegarde “à part”.)
/cdrom
/dev
/lost+found
/media
/mnt
/proc
/run
/sys
/tmp
/var/tmp

Plus, éventuellement :

/usr/share/icons
/var/cache/apt/archives

Ou d’autres dossiers “lourds” qu’il ne vous semble pas utile de sauvegarder.

– Créer un dossier /home/controle/, puis un second /home/controle-user/
Ces deux dossiers, ne sont pas indispensables mais peuvent s’avérer pratiques en cas de fausse manœuvre. En effet, ils collectent les anciens dossiers/fichiers qui ont subi des modifications depuis la dernière sauvegarde ‘rsync’.
Si vous décidez d’ajouter un clone (post suivant) ou d’automatiser vos sauvegardes avec les scripts du 3ème ‘post’, ces deux dossiers sont inutiles.

Pour la partition qui va accueillir nos sauvegardes, il est préférable, quand on le peut, de l’installer sur un DD différent ( second DD int. ou DD ext.). Sa dimension devra être “confortable” et devra faire au minimum la totalité utilisée des deux partitions à sauvegarder.
Dans cette partition de sauvegarde, on va créer deux dossiers, que l’on nommera, pour cet exemple, “sauve” & “sauve-user”.
Je ne m’attarde pas sur les créations de partition et de dossier, d’autres tutos les ayant déjà traitées.
Pour l’exemple, nous placerons cette partition en ‘sdb1’

On passe maintenant à la pratique, en admettant que le DD où se trouve la partition de sauvegarde est opérationnel :

1/ Monter sdb1 sur /mnt/

DANS LES COMMANDES QUI SUIVENT, PRENEZ BIEN GARDE AUX ESPACEMENTS

2/ Sauvegarde de ‘/’

Si choix sans dossiers ‘controle’ :

Sauvegarde de /home/user éventuellement, en excluant aussi certains dossiers (à vous de les définir et de les placer dans un fichier /home/user/exclure).
ATTENTION, CET ÉVENTUEL FICHIER DEVRA COMPORTER LES DOSSIERS À EXCLURE EN CHEMIN RELATIF :
exemple :
/.KDE/tmp-machine/
/.mozilla/firefox/

3/ Sauvegarde de /home/user

ou

Explications :

  • -a : conserve toutes les informations sur les fichiers, comme les droits (chmod), la date de modification, etc. Il permet aussi la prise en charge des fichiers cachés.
  • -v : mode verbeux, affiche des informations détaillées sur la copie en cours.
  • –del : efface les dossiers/fichiers qui ont subit des modifications depuis le dernier traitement ‘rsync’.
  • –backup : conserve ces mêmes dossiers/fichiers et les place où lui indique la commande suivante.
  • –backup-dir : chemin où seront placés les dossiers/fichiers effacés par le traitement actuel
  • –exclude-from : indique le chemin du fichier qui mentionne les dossiers ne devant pas être pris en compte dans le traitement actuel.
  • Ensuite, et après un espacement, vient la partie qui doit être traitée : ‘/’ pour la première ligne & ‘/home/user’, pour la seconde.
  • Enfin, et après un espacement, vient le chemin du dossier où sera conservée la sauvegarde : ‘/mnt/sauve’ & ‘/mnt/sauve-user’.

Voilà la sauvegarde effectuée, il ne reste plus qu’à démonter.

En cas de besoin, vous pourrez “piocher” dans ces dossiers, après avoir monté la partition, pour remplacer des dossiers/fichiers corrompus lors d’une mise à jour, par exemple.

POUR DISCUTER, C’EST

POUR DISCUTER, C’EST

-B) : CRÉATION D’UN CLONE AVEC UTILISATION DE LA /HOME EXISTANTE

– Créer une partition nouvelle sur le même DD ou sur un autre, qu’il soit interne ou externe.
Cette partition devra avoir sensiblement la même taille que celle qui abrite le système fonctionnel.
Bien sûr, cette partition nouvelle sera de même type (ext3 pour l’exemple).

Nous avons donc :

  • “Système fonctionnel” qui sera, pour l’exemple, installée sur ‘sda1’
  • “Clone”, sur ‘sda2’ (toujours pour l’exemple, il s’agit de la partition nouvellement créée)
  • /home (commune), sur ‘sda3’ (juste pour info car on ne la clone pas)

Monter la partition du clone sur /mnt

POUR LA CRÉATION, LE DOSSIER ‘EXCLURE’ SERA DIFFÉRENT DE CELUI DÉCRIT SUR LE PREMIER POST DE CE FIL. TOUTES LES LIGNES Y SERONT COMMENTÉES, SAUF CELLE DE LA /HOME.

– Cloner ‘/’ :

– Patienter car ça peut être assez long.

Pour que la fabrication du clone soit complète, il faut y créer un dossier /home vide.
Dans le fichier ‘/etc/fstab’, il faudra modifier la ligne du ‘/’ en remplaçant le chemin (sda1) par celui du clone (sda2).
Si vous utilisez les UUIDs, modifiez en conséquence (# blkid pour les connaître)

– Démonter

Il reste à updater Grub, de façon à ce qu’il prenne en compte cette nouvelle distribution.

Fin de l’installation, essais et dépannages éventuels :

– Rebooter et tenter une première connexion du clone ‘sda2’.
Si Grub a bien mis à jour, au boute, vérifiez que la ligne correspondante au clone (sda2) reporte bien les bons chemins partout où ils sont mentionnés. Pour éditer : tapez ‘e’.

(1) Si ça n’est pas le cas, modifiez à la main et boutez avec Ctrl + x.
Continuez le chargement total pour tout tester

Il est possible que le chargement soit interrompu au gestionnaire de connexion (GDM, KDM, etc.). Dans ce cas, un reboot en ‘single’ et l’entrée de :

# chmod 1777 /tmp devrait suffire.

(1) Si Grub n’a pas pris en compte les bons chemins ou n’a pas reconnu du tout la nouvelle partition :
Allez dans /etc/grub.cfg et copiez le bloc complet du système ‘père’ (sda1)
Avec votre éditeur de texte favori, ouvrez, en tant que ‘root’ le fichier /etc/grub.d/40_custom et collez-y votre copie, juste avant la dernière ligne “### END /etc/grub.d/40_custom ###” et en conservant le ‘init info’ du début.
Modifiez le chemin dans les deux lignes où il apparaît pour qu’il dirige bien vers le clone et non vers le système ‘père’.
Profitez-en pour modifier la première ligne aussitôt après ‘menuentry’ et entre les guillemets, en ajoutant au début ‘CLONE’, par exemple.
Refaites un # update-grub et reboutez pour voir cette fois votre ligne CLONE en dernière position.

Une fois la connexion au clone réussie, n’oubliez pas de décommenter les lignes du fichier ‘exclure’.

Pour les mises à jour du clone, procédez de la même façon que dans le premier ‘post’ de ce fil, en ajustant les partitions.

POUR DISCUTER, C’EST

POUR DISCUTER, C’EST

-C) : CE ‘POST’ VOUS PROPOSE UN SCRIPT QUI PERMET DE CUMULER LES DEUX POSSIBILITÉS : SAUVEGARDE ET CLONAGE.

Rassurez-vous, tout ce qui suit n’est qu’informations qui ne devraient vous demander que peu d’intervention, mais qu’il me semble nécessaire de lire

Ce script propose une “double sauvegarde”, mais ce n’est pas une obligation et on peut parfaitement ne consacrer qu’une seule partition à notre sauvegarde
De même, vous n’êtes pas obligé de créer un clone .

Votre choix sera donc :

[ul][li]créer et exploiter une seule sauvegarde,[/li]
[li]créer et exploiter deux sauvegardes,[/li]
[li]créer et exploiter un clone,[/li]
[li]créer et exploiter une sauvegarde et un clone,[/li]
[li]créer et exploiter deux sauvegardes et un clone.[/li][/ul]

Mon exemple personnel :

j’effectue une sauvegarde chaque fin de semaine, avant une mise à jour, elle aussi hebdomadaire. Les semaines impaires, j’utilise la ‘sauve’, tandis que les semaines paires, je choisis la ‘sauve2’.
Ainsi, j’ai toujours à disposition une sauvegarde vieille au plus d’une semaine. Si cette dernière venait à faillir, il me resterait l’autre dont l’ancienneté ne dépasse pas 14 jours.
J’ai un clone de mon système fonctionnel, que je mets à jour environ une fois par mois. Ce dernier, accompagné d’une /home séparée, clonée, elle aussi, me permets, en cas de besoin, d’avoir à disposition un système complet en quelques secondes.

Il faudra donc commencer par copier le script et coller cette copie dans un fichier que vous nommerez, par exemple “sauvegarde”.
Je vous conseille, mais ce n’est pas une obligation, de le placer dans /home/user/bin (ce dernier dossier devant être créé s’il n’existe pas). Il conviendra de placer ce dossier ‘bin’ dans le PATH, afin de pouvoir envoyer ce script de n’importe quel endroit de votre architecture :
$ echo ‘export PATH=$PATH:/home/user/bin’ >> /home/user/.bashrc

MODIFICATION DE LA PARTIE CI-DESSUS EN ROUGE :
[color=#40BF00][b]Placez ce script dans /usr/local/bin/ donnez-lui root comme propriétaire et comme groupe :

chown root:root /usr/local/bin/sauvegarde

et donnez-lui les droit 755 pour pouvoir l’exécuter en tant qu’‘user’ :

chmod 755 /usr/local/bin/sauvegarde

Comme pour tout script, il faudra le rendre exécutable avec :

chmod +x /usr/local/bin/sauvegarde[/b]

[/color]

AIDE À LA PERSONNALISATION DE CE SCRIPT :

Il faut maintenant passer à la personnalisation du script et pour ce faire, le seul endroit où vous devriez avoir à intervenir est la partie droite du bloc “variables”, après le signe ‘=’. Prenez garde de bien respecter les espacements et de ne pas supprimer les apostrophes, ni les parenthèses.
Ne pas modifier les 2 premières apostrophes (’’) qui représentent le zéro de façon à indexer à partir de ‘1’.
Pour ne pas utiliser une des 4 possibilité, il suffit de laisser un vide à la place de la donnée dans la ligne “ddext=…”. Par exemple, si vous ne voulez créer qu’une seule sauvegarde plus un clone, accompagné d’une /home séparée, modifiez la ligne ‘ddext’ ainsi :

Ne pouvant pas trouver la partition, le script vous affichera une erreur et vous demandera de recommencer. À vous de ne pas taper le chiffre (2 pour l’exemple).
Ne modifiez pas les autres lignes.

mount_rep="/mnt/autre"
il s’agit du dossier qui sera monté temporairement et qui recevra votre partition de sauvegarde. S’il n’existe pas, il sera créé automatiquement lors de la première utilisation. ‘/mnt’ étant le dossier habituel pour les montages temporaires, j’ai préféré créer un sous-dossier “autre”, mais là encore, ce n’est pas une obligation.

Attention à la confusion possible entre 2 apostrophes ‘’ et un guillemet ". Dans les lignes que vous aurez à personnaliser à partir d’ici, il s’agit de 2 apostrophes

ddext=('' '/dev/sdb9' '/dev/sdb10' '/dev/sdb7' '/dev/sdb1')
À la place de /dev/sdb9, vous porterez l’adresse de la première partition de sauvegarde et à la place de /dev/sdb10, celle de votre seconde partition de sauvegarde. Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite votre système. Ces deux partitions peuvent être sur des DDs internes ou externes. Il vous appartiendra, là aussi de créer ces partitions. Elles devront être de capacité suffisante pour recevoir tout votre système, plus une certaine réserve de sécurité.
/dev/sdb7 sera remplacé par la partition qui hébergera votre clone et /dev/sdb1 par celle qui abritera la /home séparée du clone.

Là, ce sont les systèmes de fichiers en rapport avec les partitions du dessus.

Ce sont les deux “fichiers texte” dont il est question dans le premier ‘post’ de ce fil.

Ce sont les dossiers de sauvegarde à proprement parler.

Là, on a les dossiers que l’on veut sauver
La première donnée ‘/’ n’est pas à modifier, elle concerne l’ensemble du système, sauf les dossiers et fichiers exclus, portés dans le fichier ‘exclure’. La seconde concerne votre dossier personnel ~/ qu’il est préférable d’écrire en entier : /home/user.

Je pense avoir fait un tour assez exhaustif des questions mais si vous rencontrez un problème non évoqué ici, n’hésitez pas à poser votre question sur le lien en rouge, en tête et en fin de ce post.

------------------- LE SCRIPT À COPIER COMMENCE APRÈS CETTE LIGNE -----------------

[code]#!/bin/bash

BEGIN INIT INFO

Nom du script : sauvegarde & clone

Auteur : Ricardo, aidé de l’équipe du forum Debian-fr.org

Date de création : octobre 2011

Utilité : faciliter les sauvegardes

Version : cette version est écrite pour l’utilisation avec deux partitions de sauvegarde, à alterner dans le temps, plus un clone.

#+ Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
#+ Ce script a été écrit de façon à ce qu’il soit le plus générique possible. Les seules données que vous devriez devoir changer,
#+ se trouvent dans la partie droite des variables.

Pre-requis : voir tuto du premier ‘post’

Droits : entièrement libres

Modifié le : octobre 2011

Objet de la modification : ajout de la sauvegarde d’un clone complet et/ou d’une /home séparée

END INIT INFO

#----------------- Fonctions ----------------------------
function sauvegarde()
{
sudo rsync -av --del --exclude-from="$1" “$2” “$3”
# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
if (("$?" > 0))
then
printf “\nErreur lors de la sauvegarde de %s\n” “$3"
else
printf ‘\E[33;45m’”\nSauvegarde de %s : OK\n" “$3”; tput sgr0
sleep 5 # pour permettre de voir le résultat de la sauvegarde de '/'
fi
}

function sortie_propre()
{

Si la partition de sauvegarde n’était pas montée lors de l’appel, on la démonte avant de sortir.

if [ “${deja_montee}” = 0 ]
then
sudo umount "${mount_rep}"
else

Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter mais en s’assurant que les données ont bien été écrites.

  sync

fi
exit
}

#----------------- Variables -------------------

CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C’EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT

#+ POUR CE FAIRE, JE VOUS CONSEILLE DE VOUS RÉFÉRER AU TUTO INDIQUÉ DANS LE “PRE-REQUIS” DU “BEGIN INIT INFO”

mount_rep="/mnt/autre"

la première donnée, vide, figure le [0], de façon à commencer par [1]

ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’ ‘/dev/sdb7’ ‘/dev/sdb1’)
systeme_fich=(’’ ‘ext3’ ‘ext2’ ‘ext3’ ‘ext3’)
exclure=(’’ ‘/root/exclure’ ‘/home/ricardo/exclure’ ‘/root/exclure’ ‘/home/ricardo/exclure’)
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’ ‘/mnt/autre’ ‘/mnt/autre/ricardo’)
dossier_a_sauver=(’’ ‘/’ ‘/home/ricardo/’ ‘/’ ‘/home/ricardo/’)

#----------------- Départ du script ----------------------------

Teste l’existence du dossier de montage et le crée s’il n’existe pas.

mkdir -p “${mount_rep}”

Choix, puis test de la partition de sauvegarde. Si le montage ne s’effectue pas, on sort via la fonction sortie_propre()

deja_montee=0
PS3="Entrez le N° de la sauvegarde choisie : "
select choix_sauvegarde in “sauve” “sauve2” “sauve-clone” “sauve-Home-clone” quitter
do
case ${REPLY} in
[1,2,3,4])
index=${REPLY}
if [ ! -e “${ddext[$index]}” ]
then
printf “\n Impossible de se connecter à %s \n Vérifiez qu’il s’agit de la bonne partition et recommencez \n” “${ddext[$index]}” >&2; exit 1;
else
if ! grep -q “^${ddext[$index]} “${mount_rep}” ${systeme_fich[$index]}” /etc/mtab
then
sudo mount -t “${systeme_fich[$index]}” “${ddext[$index]}” “${mount_rep}” || { deja_montee=1; sortie_propre; }
break
else
printf "Info : La partition ${ddext[$index]} est déjà montée\n"
deja_montee=1
break
fi
fi
;;
5) echo “On sort du script”; sortie_propre
;;
*) echo “Saisie non valide !”
;;
esac
done

Teste l’emplacement de la corbeille et si elle est pleine (présence de fichier(s) dans … /files). Si elle l’est, liste les fichiers qu’elle contient

echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

chemin_trash="${XDG_DATA_HOME:-$HOME/.local/share}/Trash"

corbeille="$chemin_trash/files"

if [ -z $(ls -A “$corbeille”) &> /dev/null ]
then
echo "LA CORBEILLE EST VIDE"
else
ls -a "$corbeille"
read -p "on peut la vider ? o/* : " vider
if [ “$vider” = o ]
then
shopt -s dotglob
rm -rf “$chemin_trash”/{files/,info/,metadata}*
shopt -u dotglob
echo "CORBEILLE VIDÉE"
else
echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
fi
fi

Ordre de sauvegarde faisant appel à la fonction ‘sauvegarde()’

read -p "prêt pour la sauvegarde ? o/* : " onyva
if [ “$onyva” = o ]
then
case “$index” in
1|2)
for choix in ‘1’ ‘2’
do
sauvegarde “${exclure[$choix]}” “${dossier_a_sauver[$choix]}” "${sauve[$choix]}"
done
;;
3|4)
sauvegarde “${exclure[$index]}” “${dossier_a_sauver[$index]}” “${sauve[$index]}”
;;
esac
else
sortie_propre
fi

sortie_propre [/code]
----------------------- FIN DU SCRIPT-------------------

POUR DISCUTER, C’EST

Il y a eu quelques modifications indiquées en rouge dans les messages.

POUR DISCUTER, C’EST