Question 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 sur un lecteur réseau (SAN, NFS, Samba ou autre) ou un autre disque. Utilisez un travail cron toutes les heures / tous les jours, etc. pour mettre à jour les modifications. Le répertoire .git contiendrait une copie versionnée de tous les fichiers du serveur (à l’exception des fichiers inutiles / compliqués comme / proc, / dev, etc.)

Pour un serveur de développement non important pour lequel je ne veux pas avoir la peine de le configurer sur un système de sauvegarde approprié, et où les sauvegardes ne seraient que par commodité avoir besoin sauvegarder ce serveur, mais cela permettrait de gagner du temps en cas de problème), cette solution de sauvegarde est-elle valide ou va-t-elle tomber dans un gros tas de caca?


88
2017-12-15 12:10


origine


ne scintille pas en utilisant une idée similaire? - B14D3
@ B14D3 Je pense que sparkleshare est plus une sorte de chose de type dropbox, mais je vais regarder dans - Smudge
vous avez raison, mais il utilise git pour créer une sorte de problème (copier sur plusieurs ordinateurs et contrôler les versions de fichiers);) - B14D3
Le gros problème avec cela est qu’il n’ya pas de contrôle central - vous devez avoir un accès direct (ssh) à la machine pour effectuer toute forme de validation de maintenance ou de sauvegarde. Je trouve toujours d'installer une application sur les boîtes à sauvegarder, puis de les administrer à partir d'un emplacement central est un gain beaucoup plus important. - hafichuk
@hafichuk Avec des outils comme Puppet / Chef, ce n'est pas un gros problème, mais je vois ce que vous voulez dire. - Smudge


Réponses:


Vous n'êtes pas une personne stupide. En utilisant git en tant que 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. Lis cette page du livre Git pour plus d'informations sur ce sujet. Fondamentalement, depuis git n'utilise pas de mécanisme de stockage delta, il s'en fiche quoi vos fichiers ressemblent (mais l’utilité de git diff est assez faible pour les fichiers binaires avec une configuration stock).

Le plus gros problème avec l'utilisation git pour la sauvegarde est qu'il ne conserve 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
  • autorisations de fichiers (autre que "est-ce l'exécutable")
  • attributs étendus

Vous pouvez résoudre ce problème en écrivant des outils pour enregistrer ces informations de manière explicite dans votre référentiel, mais il peut être délicat de les obtenir correctement.

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

etckeeper a été développé pour la sauvegarde /etc et résout beaucoup de ces problèmes.


78
2017-12-15 17:25



+1 pour mentionner les ACL / permissions - Larry Silverman
Git ne stocke pas non plus les répertoires vides. - Flimm
et ça craint aussi pour le suivi du déplacement / renommage de fichiers, à travers l’historique. - cregox
Puisque git ne traite pas très bien les fichiers binaires, vous pouvez également vous pencher sur annexe git, ce qui aide à mieux le faire. Cela change cependant l'idée de ce que c'est génial. - Wouter Verhelst
Mon avis est que vous pouvez utiliser Git pour sauvegarder des données mais pas des serveurs entiers. - EKanadily


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


20
2017-12-15 13:27



Jamais vu bup avant, semble intéressant - Smudge
J'ai récemment commencé à utiliser bup, quelques jours seulement avant que mon disque dur ne tombe en panne;) La restauration s'est bien passée, je le recommande donc! - André Paramés
@ AndréParamés donc ce que vous dites, c'est juste après l'installation de votre disque dur que bup s'est écrasé ... mmmmhh ... :) je plaisante - hofnarwillie


Ce peut être une solution de sauvegarde valide, etckeeper est basé sur cette idée. Mais gardez un oeil sur le .git autorisations de répertoire autrement poussant /etc/shadow peut être lisible dans le .git annuaire.


12
2017-12-15 12:18





Bien que techniquement, vous puissiez le faire, je mettrais deux réserves à son encontre:

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 ne disposez pas d'un processus (documentation ou automatisé) pour la construction d'une nouvelle machine. Et si vous deviez acheter un bus, qui saurait quoi faire et ce qui était important?

La reprise après sinistre est importante, mais il est préférable d’automatiser (par script) la configuration d’une nouvelle boîte de développement plutôt que de tout sauvegarder. Utilisez sûrement git pour votre script / documentation, mais pas pour tous les fichiers sur un ordinateur.


11
2017-12-15 13:45



Les boîtes de développement proviennent toutes de fichiers KickStart et durent en moyenne deux ou trois mois avant d'être reconstruites. Mais les gens changent de configuration et font des choses, nous reconstruisons les boîtes et les gens disent: "Hé, je sais que je ne l’ai pas mis sous contrôle de code source, mais j’avais de la merde sur cette boîte" et je me moque de leur stupidité. Tout autour, bons moments. Les données binaires seraient une chienne, c'est quelque chose que j'ai totalement négligé sous la douche. - Smudge
J'applaudis votre attitude envers ceux qui ne parviennent pas à suivre les principes de base. Personnellement, je suis dans une situation similaire à votre situation, mais j’ai un référentiel git qui relie dans tous les fichiers de configuration ce qui pourrait être important plutôt que de tout attraper. Plus un doc txt avec les étapes d'installation. - Phil Hannent
Je pense que git fonctionne assez bien pour les fichiers binaires, car la partie en vrac de Google Android du référentiel est constituée de référentiels git contenant des exécutables prédéfinis. - user377178


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

  1. Contrairement aux solutions commerciales qui utilisent souvent leur propre format propriétaire, votre sauvegarde est dans un format open source largement pris en charge et très bien documenté. Cela vous donne le contrôle total de vos données. Il est très facile de voir quels fichiers ont changé et quand. Si vous souhaitez tronquer votre historique, vous pouvez également le faire. Voulez-vous effacer quelque chose de votre histoire? Aucun problème. Obtenir 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 obtiendrez votre miroir local, libéré du trafic Internet lent, ce qui vous donne (1) la possibilité d'effectuer 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 avantage considérable, car je trouve que plus le temps que je perds un document est dû à une erreur de l'utilisateur. Par exemple, votre enfant écrase accidentellement un document sur lequel il travaille depuis 5 heures.) Mais vous obtiendrez votre miroir distant, qui offre l'avantage de la protection des données en cas de sinistre local ou de vol. Et supposez que vous souhaitiez que votre miroir distant se sauvegarde à un moment personnalisé pour économiser votre bande passante Internet? Aucun problème.

En bout de ligne: une sauvegarde git vous donne une quantité incroyable de puissance pour contrôler le déroulement de vos sauvegardes.

Je l'ai configuré sur mon système Windows. La première étape consiste à créer le référentiel git local sur lequel vous allez valider toutes vos données locales. Je recommande d'utiliser un deuxième disque dur local, mais utiliser le même disque dur fonctionnera correctement (mais on s'attend à ce que vous le poussiez quelque part à distance, ou sinon votre vissé si le disque dur meurt.)

Vous devez d’abord installer cygwin (avec rsync), ainsi que git pour Windows: http://git-scm.com/download/win

Ensuite, créez votre référentiel git local (exécuté 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 wrapper de script de sauvegarde, qui sera appelé régulièrement par le planificateur Windows:

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 le script de sauvegarde lui-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 le fichier exclude-from.txt, où nous mettons tous les fichiers à ignorer:

exclude-from.txt:

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

Vous devrez aller dans n'importe quel dépôt distant et faire un 'git init --bare' dessus. Vous pouvez tester le script en exécutant le script de sauvegarde. En supposant que tout fonctionne, accédez au planificateur Windows 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 - chaque fois accidentellement supprimer une section de texte et le manquer? Il suffit de vérifier votre référentiel git.


6
2018-03-21 17:10



Juste curieux - 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 péniblement lentes et ont tendance à s’arrêter, si je veux lister tous les fichiers de la sauvegarde et extraire des fichiers individuels. Est-ce que git est capable de résoudre ces problèmes? - JustAMartin
@ JustAMartin Je ne l'ai jamais testé sur des lecteurs réseau, je ne peux donc pas le dire. Une fois que vous avez récupéré les fichiers dans un dépôt git, git est très efficace. - user64141


Ce n’est pas une mauvaise idée, mais je pense qu’il faut lever deux drapeaux rouges:

  • Si le disque dur échoue, vous perdrez tout si vous ne poussez pas votre validation sur un autre serveur / lecteur. (Événement si vous avez un plan pour cela, je préfère mentionner.)

... mais cela peut quand même être une bonne sauvegarde pour les problèmes liés à la corruption. Ou, comme vous l'avez dit, si le dossier .git / est ailleurs.

  • Cette sauvegarde augmentera toujours en taille. Il n'y a pas d'élagage ou de rotation ou quoi que ce soit par défaut.

... Vous devrez donc peut-être demander à votre cronjob d'ajouter des balises, puis assurez-vous que les commits qui ne sont pas étiquetés seront nettoyés.


4
2017-12-15 13:40



Nous monterions probablement le répertoire .git sur un serveur distant, bien que le classique rm -Rf / nous causerait des problèmes. Notre système de sauvegarde actuel conserve les éléments pendant 2 ans ou 50 versions (selon la dernière éventualité), de sorte que notre sauvegarde augmente constamment. Mais j'aime bien l'idée d'ajouter des tags, nous pourrions avoir des tags "daily", "daily", etc. - Smudge
+1 pour des besoins d'espace sans cesse croissants - hafichuk
@sam git est en croissance constante. Vous ne pouvez pas élaguer l’histoire de plus de N ans. Je suppose que votre système actuel le fait. - rds
En ce qui concerne l'augmentation de la taille, veuillez "git gc" régulièrement ou avant de transmettre à un autre serveur (central). Sans cela, le dépôt git peut devenir beaucoup plus gros qu'il ne le devrait. Auparavant, j’avais un rapport de 346 Mo avec git pouvant se réduire à 16 Mo. - Hendy Irawan


Je ne l'ai pas essayé avec un système complet, mais je l'utilise pour mes sauvegardes MySQL (avec l'option --skip-extended-insert) et cela a vraiment bien fonctionné pour moi.

Vous allez avoir un problème avec les fichiers de données binaires (leur contenu entier pourrait et va changer) et vous pourriez avoir des problèmes avec le .git dossier devenant vraiment gros. Je recommanderais la mise en place d'un .gitignore fichier et ne sauvegardant que les fichiers texte dont vous savez vraiment ce dont vous avez besoin.


3
2017-12-15 13:23



Je l'utilise aussi pour les sauvegardes MySQL, avec --extended-insert = false. Assurez-vous de "git gc" régulièrement ou juste après le commit. - Hendy Irawan
Voir Sauvegarder une base de données MySQL dans Git est-il une bonne idée? - Michael Hampton♦


Une fois, j'ai développé une solution de sauvegarde basée sur la subversion. Bien que cela fonctionne assez bien (et que ça devrait fonctionner encore mieux), je pense qu'il existe de meilleures solutions ici.

Je considère rsnapshot être l'un des meilleurs - sinon la meilleur. Grâce à une bonne utilisation du lien physique, j’ai un serveur de fichiers de 300 Go (avec un demi-million de fichiers) avec une sauvegarde quotidienne, hebdomadaire et mensuelle pouvant aller jusqu’à un an. L’espace disque total utilisé ne représente qu’une copie complète + la partie incrémentielle de chaque sauvegarde, mais grâce aux liens fixes, j’ai Achevée structure de répertoire "live" dans chacune des sauvegardes. En d'autres termes, les fichiers sont directement accessibles non seulement sous daily.0 (la sauvegarde la plus récente), mais même dans daily.1 (yestarday) ou hebdomadairement.2 (il y a deux semaines), etc.

En partageant le dossier de sauvegarde avec Samba, mes utilisateurs peuvent extraire le fichier des sauvegardes simplement en pointant leur PC vers le serveur de sauvegarde.

Une autre très bonne option est rdiff-backup, mais comme j’aime avoir des fichiers toujours accessibles en sélectionnant simplement Explorateur sous \\ nom_serveur, rsnapshot était une meilleure solution pour moi.


3
2018-03-21 20:01



La dernière version de rdiff-backup date de 2009. Est-il extrêmement bien conçu et ne nécessite aucune mise à jour ou s'agit-il simplement d'un projet abandonné? - Mateusz Konieczny
Je ne sais pas si c'est maintenu, mais c'est fondamentalement "fait". - shodanshok
De regarder savannah.nongnu.org/bugs/… il semble qu'il y ait eu une activité jusqu'en 2015 mais de nombreux rapports de bogues sont ignorés. Je pense que je vais le classer comme un abandonné. - Mateusz Konieczny