Boa descoberta, já que também consegui reproduzir esse efeito no meu sistema. No meu site isso acontece em / dev / hda, então não é um problema SCSI.
# uname -a
Linux X.X.X 2.6.26-2-686 #1 SMP Tue Mar 9 17:35:51 UTC 2010 i686 GNU/Linux
Acho que whitequark
está certo de que é um problema de cache. Aqui está a minha interpretação do que aconteceu no seu site ( note que não tenho certeza se minha explicação está correta, embora ):
/ dev / sda1 está em uso. Então, "sync" atualiza o superbloco toda vez que o diário é liberado (ou similar). Então o disco / dev / sda1 é alterado.
No entanto, o kernel não usa um cache combinado para / dev / sda e / dev / sda1, em vez disso, ambos os "arquivos" são cache por conta própria. A atualização de / dev / sda1 (sync) não invalida o cache de / dev / sda. Portanto, a leitura de / dev / sda mostra o valor do cache antigo (portanto, o cache está fora de sincronia com o disco rígido), enquanto / dev / sda1 mostra os valores corretos (novos).
Aqui está a situação vista do meu lado. Eu vim aqui tendo feito alguns dumps antes em / dev / hda, então já havia armazenado alguns dados antigos:
# od -tx1z -N 10k /dev/hda2 > NOW1
# dd ibs=512 skip=1975995 if=/dev/hda | od -tx1z -N 10k > MAIN1
# diff NOW1 MAIN1
3,4c3,4
< 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 be 1a 39 00 >..1.W.a..}....9.<
< 0002020 4e ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >N.!.............<
---
> 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 4e 1b 39 00 >..1.W.a..}..N.9.<
> 0002020 52 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >R.!.............<
# od -tx1z -N 10k /dev/hda2 > NOW1
# diff NOW1 MAIN1
3,4c3,4
< 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 be 1a 39 00 >..1.W.a..}....9.<
< 0002020 4e ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >N.!.............<
---
> 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 4e 1b 39 00 >..1.W.a..}..N.9.<
> 0002020 52 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >R.!.............<
# od -tx1z -N 10k /dev/hda2 > NOW2
# dd ibs=512 skip=1975995 if=/dev/hda | od -tx1z -N 10k > MAIN2
# diff MAIN1 MAIN2
# diff NOW2 MAIN2
3,4c3,4
< 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 f0 19 39 00 >..1.W.a..}....9.<
< 0002020 41 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >A.!.............<
---
> 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 4e 1b 39 00 >..1.W.a..}..N.9.<
> 0002020 52 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >R.!.............<
106c106
< 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 01 00 >................<
---
> 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 00 00 >................<
334c334
< 0021540 00 80 4d 00 01 80 4d 00 02 80 4d 00 02 00 63 3e >..M...M...M...c><
---
> 0021540 00 80 4d 00 01 80 4d 00 02 80 4d 00 02 00 64 3e >..M...M...M...d><
Embora / dev / hda não mostre nenhuma atualização, o / dev / hda2 mostra algumas mudanças. Mas quando eu libero os caches e tento novamente, tudo parece ser o mesmo:
# hdparm -f /dev/hda
/dev/hda:
# dd ibs=512 skip=1975995 if=/dev/hda | od -tx1z -N 10k > MAIN2
# diff MAIN1 MAIN2
3,4c3,4
< 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 4e 1b 39 00 >..1.W.a..}..N.9.<
< 0002020 52 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >R.!.............<
---
> 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 dc 1a 39 00 >..1.W.a..}....9.<
> 0002020 96 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >..!.............<
36,37c36,37
< 0010300 00 00 03 00 01 00 03 00 02 00 03 00 00 00 bb 3b >...............;<
< 0010320 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
---
> 0010300 00 00 03 00 01 00 03 00 02 00 03 00 00 00 bc 3b >...............;<
> 0010320 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
48c48
< 0010600 00 00 06 00 01 00 06 00 02 00 06 00 03 00 18 3f >...............?<
---
> 0010600 00 00 06 00 01 00 06 00 02 00 06 00 04 00 18 3f >...............?<
106c106
< 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 00 00 >................<
---
> 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 01 00 >................<
# od -tx1z -N 10k /dev/hda2 > NOW2
# diff NOW2 MAIN2
# diff MAIN1 MAIN2
3,4c3,4
< 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 4e 1b 39 00 >..1.W.a..}..N.9.<
< 0002020 52 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >R.!.............<
---
> 0002000 00 00 31 01 57 c4 61 02 04 7d 1e 00 dc 1a 39 00 >..1.W.a..}....9.<
> 0002020 96 ea 21 01 00 00 00 00 02 00 00 00 02 00 00 00 >..!.............<
36,37c36,37
< 0010300 00 00 03 00 01 00 03 00 02 00 03 00 00 00 bb 3b >...............;<
< 0010320 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
---
> 0010300 00 00 03 00 01 00 03 00 02 00 03 00 00 00 bc 3b >...............;<
> 0010320 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<
48c48
< 0010600 00 00 06 00 01 00 06 00 02 00 06 00 03 00 18 3f >...............?<
---
> 0010600 00 00 06 00 01 00 06 00 02 00 06 00 04 00 18 3f >...............?<
106c106
< 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 00 00 >................<
---
> 0012440 00 80 14 00 01 80 14 00 02 80 14 00 00 00 01 00 >................<
Nota breve sobre como reproduzir:
- Certifique-se de que seu sistema esteja ocioso e tenha bastante memória RAM para armazenamento em cache.
- execute
fdisk -u -l
para descobrir onde a partição é iniciada. Ao meu lado é 1975995 - Escolha uma partição montada e a unidade completa.
- Depois faça os dois dumps (NOW1, MAIN1) e compare-os. Eles devem comparar iguais.
- Altere um pouco na partição, sincronize.
- Deixe mais tempo.
- Mude um pouco e sincronize novamente.
- Faça o dump NOW2, ele deve ser diferente de NOW1
- Fazer um dump MAIN2, não deve não diferir de MAIN1!
- Execute a linha
hdparm
da sua unidade - Faça o dump MAIN2 novamente, agora ele será diferente do MAIN1.
- Se você for rápido o suficiente, o NOW2 e o MAIN2 serão iguais.