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.