122 votes

GIT comme outil de sauvegarde

Sur un serveur, installez git

cd /
git init
git add .
git commit -a -m "Yes, this is server"

Puis obtenir /.git/ pour pointer vers un lecteur réseau (SAN, NFS, Samba, etc.) ou un disque différent. Utilisez une tâche cron toutes les heures/jours etc. pour mettre à jour les modifications. Le répertoire .git contiendra une copie versionnée de tous les fichiers du serveur (à l'exclusion des fichiers inutiles/compliqués comme /proc, /dev, etc.)

Pour un serveur de développement non important, pour lequel je ne veux pas m'embêter à mettre en place un système de sauvegarde adéquat, et pour lequel les sauvegardes ne seraient que pratiques (nous ne faisons pas de besoin de pour sauvegarder ce serveur mais cela permettrait de gagner du temps si les choses tournaient mal), est-ce que cela pourrait être une solution de sauvegarde valable ou est-ce que cela va juste tomber dans un gros tas de caca ?

3 votes

Sparkleshare n'utilise-t-elle pas une idée similaire ?

0 votes

@B14D3 Je pense que sparkleshare est plutôt une sorte de Dropbox, mais je vais y réfléchir.

2 votes

Tu as raison, mais il utilise git pour faire une sorte de truc buckup (copier sur plusieurs pc et contrôler les versions des fichiers) ;)

108voto

Eric Noob Points 531

Vous n'êtes pas une personne stupide. Utilisation de git comme mécanisme de sauvegarde peut être attrayant, et malgré ce que d'autres personnes ont dit, git fonctionne très bien avec les fichiers binaires. Lire cette page du Git Book pour plus d'informations sur ce sujet. Fondamentalement, puisque git n'utilise pas de mécanisme de stockage delta, elle ne se soucie pas vraiment ce que vos fichiers ressemblent (mais l'utilité de git diff est assez faible pour des fichiers binaires avec une configuration de base).

Le plus gros problème avec l'utilisation git pour la sauvegarde est qu'elle ne préserve pas la plupart des métadonnées du système de fichiers. Plus précisément, git n'enregistre pas :

  • groupes de fichiers
  • propriétaires de fichiers
  • les autorisations de fichiers (autres que "est-ce exécutable")
  • attributs étendus

Vous pouvez résoudre ce problème en écrivant des outils permettant d'enregistrer ces informations de manière explicite dans votre référentiel, mais cela peut être délicat à réaliser.

Une recherche Google pour métadonnées de sauvegarde git donne un certain nombre de résultats qui semblent valoir la peine d'être lus (y compris certains outils qui tentent déjà de compenser les problèmes que j'ai soulevés ici).

etckeeper a été développé pour sauvegarder /etc et résout bon nombre de ces problèmes.

22 votes

+1 pour avoir mentionné les ACLs/permissions

28 votes

Git ne stocke pas non plus les répertoires vides.

0 votes

Et ça craint aussi pour le suivi des déplacements/renommages de fichiers, à travers l'historique.

30voto

stew Points 9143

Je ne l'ai pas utilisé, mais vous pouvez regarder à bup qui est un outil de sauvegarde basé sur git.

0 votes

Je n'ai jamais vu de bup avant, ça a l'air intéressant

3 votes

J'ai commencé à utiliser bup récemment, juste quelques jours avant que mon disque dur ne tombe en panne ;) La restauration s'est bien passée, donc recommandé !

1 votes

@AndréParamés donc ce que tu dis c'est que juste après avoir installé bup ton disque dur a planté... mmmmhh... :) je plaisante

12voto

Rob Wells Points 21714

Bien que vous puissiez techniquement le faire, j'émettrais deux réserves à ce sujet :

1, Vous utilisez un système de contrôle de version source pour les données binaires. Vous l'utilisez donc pour quelque chose pour lequel il n'a pas été conçu.

2, je m'inquiète de votre processus de développement si vous n'avez pas de processus (documenté ou automatisé) pour construire une nouvelle machine. Et si vous vous faisiez renverser par un bus, qui saurait ce qu'il faut faire et ce qui est important ?

La reprise après sinistre est importante, mais il est préférable d'automatiser (script) la configuration d'une nouvelle boîte de développement que de simplement tout sauvegarder. Bien sûr, utilisez git pour votre script/documentation mais pas pour chaque fichier sur un ordinateur.

5 votes

Les boîtes de développement proviennent toutes de fichiers KickStart, et en fait la boîte moyenne dure environ 2 ou 3 mois avant d'être reconstruite. Mais les gens changent les configurations et font des choses, nous reconstruisons les boîtes et les gens disent "hé, je sais que je ne l'ai pas mis dans le contrôle de la source mais j'avais des trucs sur cette boîte" et je me moque d'eux pour leur stupidité. Tout autour, de bons moments. Les données binaires seraient une saloperie, c'est quelque chose que j'ai totalement négligé sous la douche.

0 votes

J'applaudis votre attitude envers ceux qui ne respectent pas les principes de base. Personnellement, j'ai une situation similaire à la vôtre, mais j'ai un dépôt git qui lie tous les fichiers de configuration qui pourraient être importants plutôt que d'être un fourre-tout. Plus un document txt avec les étapes de configuration.

2 votes

Je pense que git fonctionne assez bien pour les fichiers binaires, vide la majeure partie du repo de Google Android sont des dépôts git d'exécutables préconstruits.

11voto

Stone Points 6841

Il peut être une solution de sauvegarde valable, etckeeper est basé sur cette idée. Mais gardez un œil sur le .git les permissions du répertoire poussant autrement /etc/shadow peut être lisible dans le .git répertoire.

8voto

user64141 Points 191

J'utilise git comme sauvegarde pour mon système Windows, et cela a été incroyablement utile. Au bas du post, je montre les scripts que j'utilise pour configurer sur un système Windows. Utiliser git comme sauvegarde pour n'importe quel système offre 2 gros avantages :

  1. Contrairement aux solutions commerciales qui utilisent souvent leur propre format propriétaire, votre sauvegarde est dans un format open source largement supporté et très bien documenté. Cela vous donne un contrôle total sur vos données. Il est très facile de voir quels fichiers ont été modifiés et quand. Si vous souhaitez tronquer votre historique, vous pouvez également le faire. Vous voulez effacer quelque chose de votre historique ? Aucun problème. Récupérer une version de votre fichier est aussi simple que n'importe quelle commande git.
  2. Autant de miroirs que vous le souhaitez, et tous peuvent avoir des temps de sauvegarde personnalisés. Vous aurez votre miroir local, qui n'est pas accablé par un trafic Internet lent, et vous donne donc (1) la possibilité de faire des sauvegardes plus fréquentes tout au long de la journée et (2) un temps de restauration rapide. (Les sauvegardes fréquentes sont un énorme avantage, car je trouve que la plupart du temps, la perte d'un document est due à une erreur de l'utilisateur. Par exemple, votre enfant écrase accidentellement un document sur lequel il travaillait depuis 5 heures). Mais vous aurez votre miroir distant, qui offre l'avantage de la protection des données en cas de sinistre local ou de vol. Et supposons que vous souhaitiez que votre miroir distant effectue une sauvegarde à une heure personnalisée pour économiser votre bande passante Internet ? Aucun problème.

En résumé : Une sauvegarde git vous donne une quantité incroyable de pouvoir sur le contrôle de la façon dont vos sauvegardes se produisent.

Je l'ai configuré sur mon système Windows. La première étape est de créer le repo git local où vous allez commit toutes vos données locales. Je recommande l'utilisation d'un second disque dur local, mais l'utilisation du même disque dur fonctionnera aussi (mais il est prévu que vous poussiez ceci quelque part à distance, ou sinon vous êtes foutu si le disque dur meurt).

Vous devrez d'abord installer cygwin (avec rsync), et aussi installer git pour Windows : http://git-scm.com/download/win

Ensuite, créez votre dépôt git local (à exécuter une seule fois) :

init-repo.bat :

@echo off
REM SCRIPT PURPOSE: CREATE YOUR LOCAL GIT-REPO (RUN ONLY ONCE)

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror

REM Create the backup git repo. 
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
mkdir %GBKUP_LOCAL_MIRROR_HOME%
git %GIT_PARAMS% init
git %GIT_PARAMS% config core.autocrlf false
git %GIT_PARAMS% config core.ignorecase false 
git %GIT_PARAMS% config core.fileMode false
git %GIT_PARAMS% config user.email backup@yourComputerName
git %GIT_PARAMS% config user.name backup

REM add a remote to the git repo.  Make sure you have set myRemoteServer in ~/.ssh/config   
REM The path on the remote server will vary.  Our remote server is a Windows machine running cygwin+ssh.  
REM For better security, you could install gitolite on the remote server, and forbid any non-fast-forward merges, and thus stop a malicious user from overwriting your backups.
git %GIT_PARAMS% remote add origin myRemoteServer:/cygdrive/c/backup/yourComputerName.git

REM treat all files as binary; so you don't have to worry about autocrlf changing your line endings
SET ATTRIBUTES_FILE=%GBKUP_LOCAL_MIRROR_HOME%\.git\info\attributes
echo.>> %ATTRIBUTES_FILE% 
echo *.gbkuptest text>> %ATTRIBUTES_FILE% 
echo * binary>> %ATTRIBUTES_FILE% 
REM compression is often a waste of time with binary files
echo * -delta>> %ATTRIBUTES_FILE% 
REM You may need to get rid of windows new lines. We use cygwin's tool
C:\cygwin64\bin\dos2unix %ATTRIBUTES_FILE%

Ensuite, nous avons notre enveloppe de sauvegarde script, qui sera appelée régulièrement par Windows Scheduler :

gbackup.vbs :

' A simple vbs wrapper to run your bat file in the background
Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c C:\opt\gbackup\gbackup.bat"
oShell.Run strArgs, 0, false

Ensuite, nous avons la sauvegarde script elle-même que le wrapper appelle :

gbackup.bat :

    @echo off

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror
REM the user which runs the scheduler
SET GBKUP_RUN_AS_USER=yourWindowsUserName
REM exclude file
SET GBKUP_EXCLUDE_FILE=/cygdrive/c/opt/gbackup/exclude-from.txt

SET GBKUP_TMP_GIT_DIR_NAME=git-renamed
for /f "delims=" %%i in ('C:\cygwin64\bin\cygpath %GBKUP_LOCAL_MIRROR_HOME%') do set GBKUP_LOCAL_MIRROR_CYGWIN=%%i

REM rename any .git directories as they were (see below command)
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (%GBKUP_TMP_GIT_DIR_NAME%) do ren "%%i" ".git" 2> nul

SET RSYNC_CMD_BASE=C:\cygwin64\bin\rsync -ahv --progress --delete --exclude-from %GBKUP_EXCLUDE_FILE%

REM rsync all needed directories to local mirror
%RSYNC_CMD_BASE% /cygdrive/c/dev %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/asmith %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/bsmith %GBKUP_LOCAL_MIRROR_CYGWIN%

cacls %GBKUP_LOCAL_MIRROR_HOME% /t /e /p  %GBKUP_RUN_AS_USER%:f

REM rename any .git directories as git will ignore the entire directory, except the main one
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (.git) do ren "%%i" "%GBKUP_TMP_GIT_DIR_NAME%" 2> nul
ren %GBKUP_LOCAL_MIRROR_HOME%\%GBKUP_TMP_GIT_DIR_NAME% .git

REM finally commit to git
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
SET BKUP_LOG_FILE=%TMP%\git-backup.log
SET TO_LOG=1^>^> %BKUP_LOG_FILE% 2^>^&1
echo ===========================BACKUP START=========================== %TO_LOG%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime% %TO_LOG%
echo updating git index, committing, and then pushing to remote %TO_LOG%
REM Caution: The --ignore-errors directive tells git to continue even if it can't access a file.
git %GIT_PARAMS% add -Av --ignore-errors %TO_LOG%
git %GIT_PARAMS% commit -m "backup" %TO_LOG%
git %GIT_PARAMS% push -vv --progress origin master %TO_LOG%
echo ===========================BACKUP END=========================== %TO_LOG%

Nous avons un fichier exclude-from.txt, où nous mettons tous les fichiers à ignorer :

exclure de.txt :

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*

Vous devrez vous rendre dans tous les dépôts distants et faire un "git init --bare" sur ceux-ci. Vous pouvez tester le script en exécutant le script de sauvegarde. En supposant que tout fonctionne, allez dans Windows Scheduler et pointez une sauvegarde horaire vers le fichier vbs. Après cela, vous aurez un historique git de votre ordinateur pour chaque heure. C'est extrêmement pratique - il vous est déjà arrivé de supprimer accidentellement une section de texte et de la manquer ? Il suffit de vérifier votre dépôt git.

0 votes

Par curiosité, cela fonctionnera-t-il aussi pour les lecteurs réseau lents ou non standard, comme ceux émulés par NetDrive ou Expandrive ? Je trouve que la plupart des logiciels de sauvegarde échouent avec ces lecteurs réseau. De plus, les choses deviennent terriblement lentes et tendent à s'arrêter, si je veux lister tous les fichiers de la sauvegarde et extraire des fichiers individuels. Git est-il capable de résoudre ces problèmes ?

0 votes

@JustAMartin Je ne l'ai jamais testé sur des lecteurs réseau, donc je ne peux pas me prononcer. Une fois que vous obtenez les fichiers DANS un repo git, git est très efficace.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X