Isso pode soar como uma solução "pesada", mas eu recomendaria o mdadm para isso. O mdadm tem um recurso chamado "bitmaps de intenção de gravação". Para simplificar, você pode pensar nisso como uma matriz de uns e zeros, onde cada número representa uma determinada quantidade de dados em seu disco. A quantidade de dados que ela representa depende do tamanho do seu bitmap.
Então, digamos que você tenha 20 GB de dados e tenha um bitmap de 20 bits, cada bit representa um GB de dados. Toda vez que uma gravação é feita em seu RAID mdadm, o bit correspondente da seção GB é comutado para um.
O que eu sugeriria agora é que você crie um "falso RAID 1" com um mapa de bits com intenção de gravação, e de vez em quando você quer "sincronizar" sua imagem, basta "conectar" a imagem ao ataque mdadm. O mdadm irá então certificar-se de que todas as seções onde o bitmap de intenção de gravação é 1 e diz "esta seção está suja", ele irá sincronizar automaticamente os dados para a sua imagem.
Eu criei um pequeno script bash como exemplo para você:
# 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
então chamar "cat / proc / mdstat" deve retornar algo como:
md121 : active raid1 loop1[0]
1047552 blocks super 1.2 [2/1] [U_]
bitmap: 4/4 pages [16KB], 128KB chunk
O [U_] significa que o primeiro dispositivo (loop1) é "U" p e o segundo está ausente (_). Com --bitmap-chunk = você pode determinar quão grandes são os fragmentos de dados por bit. Valores menores oferecem melhor velocidade / granularidade de reconstrução, os valores de lager proporcionam menos impacto na velocidade de gravação para manter o bitmap em sincronia.
Se você deseja sincronizar sua imagem, basta criar um dispositivo de loop e adicioná-lo ao raid:
losetup /dev/loop2 loop2.img
mdadm --add /dev/md/bitmap /dev/loop2
/ proc / mdstat diz que está recuperando sua imagem, que na primeira vez é uma cópia completa:
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
Você pode deixar sua imagem no RAID1 o tempo todo para mantê-la em sincronia ou removê-la após a sincronização ser concluída. Se você quiser fazer o script, você pode achar útil verificar / sys / block / md121 / md / sync_action para "ocioso". Isso significa que a recuperação está completa.
Agora você pode remover a imagem:
mdadm --fail /dev/md/bitmap /dev/loop2
mdadm --remove /dev/md/bitmap /dev/loop2
Depois de alterar alguns bytes:
dd if=/dev/urandom of=/dev/md/bitmap bs=4k count=1k seek=1000
Você vê que há bits sujos no bitmap:
md121 : active raid1 loop1[0]
1047552 blocks super 1.2 [2/1] [U_]
bitmap: **1/4 pages** [4KB], 128KB chunk
Adicionar novamente a imagem recuperará a imagem e apenas sincronizar as seções sujas não é hora ...
mdadm --re-add /dev/md/bitmap /dev/loop2
sync
O resultado deve ser:
md121 : active raid1 loop2[2] loop1[0]
1047552 blocks super 1.2 [2/2] [UU]
bitmap: **0/4 pages** [0KB], 128KB chunk
Espero que isso ajude.