Restaurer Partiton uniquement lors d'un changement

0

J'ai écrit un script qui restaure une partition à partir d'un dddump précédent . Fondamentalement, il appelle cette ligne:

dd if=stored_image.img of=/dev/sdb1 bs=1M

La restauration prend environ 5 minutes (20 Go de données) et il serait bon de ne restaurer l'image qu'en l'absence de modifications. Bien sûr, je peux maintenant vérifier la partition entière avec un hachage et la comparer avec la précédente, mais la génération de hachage n’est aussi rapide que ce que je peux lire à partir de l’appareil. md5sum /dev/sdb1Il faut donc environ 5 minutes pour calculer ...

La question qui se pose maintenant est la suivante: existe-t-il un moyen de détecter très rapidement les modifications sur le disque? (comme moins d'une demi-minute) Il n'est pas nécessaire d'être sûr à 100%, mais une précision d'au moins 90% devrait suffire.

reox
la source

Réponses:

1

Cela peut sembler une solution "lourde" mais je recommanderais mdadm pour cela. mdadm a une fonctionnalité appelée "write-intent bitmaps". Pour simplifier, vous pouvez le considérer comme un tableau de uns et de zéros, où chaque nombre représente une quantité donnée de données sur votre disque. La quantité de données que cela représente dépend de la taille de votre bitmap.

Alors disons que vous avez 20 Go de données et que vous avez un bitmap 20 bits, chaque bit représente un Go de données. Chaque fois qu'une écriture est faite sur votre RAID mdadm, le bit correspondant de la section d'un Go est commuté sur un.

Ce que je suggérerais maintenant, c’est que vous créiez un "faux RAID 1" avec un bitmap en écriture, et que de temps en temps vous vouliez "synchroniser" votre image, vous "connectiez" juste l’image au raid mdadm. mdadm s'assurera ensuite que toutes les sections où le bitmap d'intention d'écriture est égal à 1 et dit "cette section est sale", il synchronisera automatiquement les données sur votre image.

J'ai créé un petit script bash comme exemple pour vous:

# Create 2 images (loop1 could later be your /dev/sdb1)
fallocate -l 1G loop1.img
fallocate -l 1G loop2.img

# Create loop deveices for mdadm
losetup /dev/loop1 loop1.img   #### you don't need this step for /dev/sdb1 of course

# Create a RAID 1 with only loop1 or sdb1, replace /dev/md/<bitmap> with a suiteable name
mdadm --create -l 1 -n 2 --bitmap=internal --bitmap-chunk=128 /dev/md/bitmap /dev/loop1  missing

donc appeler "cat / proc / mdstat" devrait donner quelque chose comme:

md121 : active raid1 loop1[0]
  1047552 blocks super 1.2 [2/1] [U_]
  bitmap: 4/4 pages [16KB], 128KB chunk

[U_] indique que le premier périphérique (loop1) est "U" p et que le second est manquant (_). Avec --bitmap-chunk =, vous pouvez déterminer la taille des blocs de données par bit. Des valeurs plus petites donnent une vitesse / granularité de reconstruction meilleure, tandis que des valeurs plus petites vous permettent de réduire l'impact de la vitesse d'écriture sur la synchronisation du bitmap.

Si vous souhaitez synchroniser votre image, créez simplement un périphérique de boucle et ajoutez-le au raid:

losetup /dev/loop2 loop2.img
mdadm --add /dev/md/bitmap /dev/loop2

/ proc / mdstat dit qu'il récupérera votre image, qui est la première fois une copie complète:

md121 : active raid1 loop2[2] loop1[0]
      1047552 blocks super 1.2 [2/1] [U_]
      [===>.................]  recovery = 18.7% (196608/1047552) finish=0.1min speed=98304K/sec
      bitmap: 0/4 pages [0KB], 128KB chunk

Vous pouvez soit laisser votre image dans le RAID1 tout le temps pour la garder synchronisée, soit vous pouvez la supprimer une fois la synchronisation terminée. Si vous voulez écrire un script, vous trouverez peut-être utile de vérifier / sys / block / md121 / md / sync_action pour "inactif". Cela signifie que la récupération est terminée.

Maintenant, vous pouvez supprimer l'image en:

mdadm --fail /dev/md/bitmap /dev/loop2
mdadm --remove /dev/md/bitmap /dev/loop2

Après avoir changé quelques octets:

dd if=/dev/urandom of=/dev/md/bitmap bs=4k count=1k seek=1000

Vous voyez qu'il y a des bits sales sur le bitmap:

md121 : active raid1 loop1[0]
  1047552 blocks super 1.2 [2/1] [U_]
  bitmap: **1/4 pages** [4KB], 128KB chunk

Ré-ajouter l'image permettra de récupérer l'image et de synchroniser uniquement les sections modifiées, ce n'est pas le moment ...

mdadm --re-add /dev/md/bitmap /dev/loop2
sync

La sortie devrait être:

md121 : active raid1 loop2[2] loop1[0]
  1047552 blocks super 1.2 [2/2] [UU]
  bitmap: **0/4 pages** [0KB], 128KB chunk

J'espère que ça aide.

SaschaZorn
la source
merci pour la réponse, mais malheureusement, je ne peux pas utiliser mdadm ici. mais dans d'autres cas, cela semble vraiment génial! J'aurais dû mentionner que j'ai besoin de cela pour restaurer certains systèmes de test Windows, où la partition système est restaurée dans tous les cas et où certaines partitions de données peuvent avoir changé ou non.
reox
Donc, si vous n'êtes pas en mesure d'utiliser une "couche logicielle" entre les deux, car vous utiliserez ultérieurement un autre système d'exploitation sur cette partition, la seule chose à laquelle je pourrais penser est de générer une liste de fichiers avec les horodatages "en dernier lieu", stockez-le sur le même système de fichiers, puis générez-le ultérieurement et différez-le. Cela ne ferait que vérifier les "métadonnées" sur le système de fichiers, pas toutes les données.
SaschaZorn
Vous pourriez générer une liste avec quelque chose comme 'find -printf "% t% p \ n" | sort'
SaschaZorn
oui, mais bien sûr, la génération de listes est également limitée par la vitesse de lecture du disque ... les horodatages peuvent également être trompeurs, car les fichiers ne sont accessibles que par accès. Je pense qu'une solution appropriée serait d'avoir mdadm sur les fenêtres;)
reox
Limité par la vitesse de lecture? Donc, une liste complète d'une énorme partition avec 90k fichiers prend environ 12Mo. Les disques modernes ont une vitesse de lecture supérieure à 100 Mo / s. Cela prendrait 100 ms à lire ... Je ne pense pas que la vitesse de lecture serait un problème ici. Mais vous pouvez aussi faire 'find -printf "% t% p \ n" | sort | gzip'. Ma liste de fichiers prend alors 2MB. Les fichiers consultés ne sont pas modifiés. Donc je ne vois pas de problème. Chaque écriture met à jour l'horodatage modifié. Cela devrait donc suffire.
SaschaZorn