Restaurar Partiton somente em mudança

0

Eu escrevi um script que restaura uma partição de um dd dump feito anteriormente. Basicamente chama esta linha:

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

A restauração para isso leva cerca de 5 minutos (20 GB de dados) e seria ótimo restaurar a imagem somente se nenhuma alteração for feita. Claro que eu posso verificar agora toda a partição com um hash e compará-la com a anterior, mas a geração de hash é tão rápida quanto eu posso ler no dispositivo, então md5sum /dev/sdb1 também precisa de cerca de 5 minutos para calcular. .

A questão é agora: existe alguma maneira de detectar mudanças no disco muito rapidamente? (como menos de meio minuto) Não há necessidade de ter 100% de certeza, mas pelo menos 90% de precisão deve ser suficiente.

    
por reox 19.05.2014 / 11:28

1 resposta

1

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.

    
por 19.05.2014 / 12:11