Após mais testes, parece que há um problema com o LVM e seu relacionamento com o kernel do Linux. Eu estou supondo que isso envolve o cache de disco, mas eu não tenho 100% de certeza. Aqui está o que eu encontrei:
Primeiro eu escrevi alguns dados inúteis para o meu volume LVM:
# dd if=/dev/urandom of=/dev/vg0/volume_b bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.600447 s, 1.7 MB/s
Depois, eu leio de volta o volume do LVM. Aqui está um trecho do lixo que foi escrito:
# hexdump /dev/vg0/volume_b -n 0x20
0000000 2358 898b a13b 8d94 39a1 bff6 8b38 79ec
0000010 9155 1202 ce46 938f 49dc 7687 f804 bf13
0000020
Mas, verificando o dispositivo de bloco em si, nada se alinhava.
# hexdump /dev/mmcblk0p2 -s 200M
c800000 0000 0000 0000 0000 0000 0000 0000 0000
*
c900000 2dee 8ea4 2116 1981 252f d113 afc1 3182
c900010 e6fc 7d1b d173 3cab 4399 8715 bcdf 2272
Houve 1 MiB de zeros seguido por algum lixo que não se alinha com o que acabou de ser escrito no volume do LVM. Mas só por diversão, eu tentei reiniciar o sistema e checar novamente.
# hexdump /dev/mmcblk0p2 -s 200M
c800000 0000 0000 0000 0000 0000 0000 0000 0000
*
c900000 2358 898b a13b 8d94 39a1 bff6 8b38 79ec
c900010 9155 1202 ce46 938f 49dc 7687 f804 bf13
Existem os dados! Ainda há uma seção de 1MiB de zeros (presumivelmente um cabeçalho?), Mas os dados que foram gravados em /dev/vg0/volume_b
estão lá em /dev/mmcblk0p2
.
Eu não posso explicar isso. Meu palpite é que pode haver um problema com o link entre o LVM e o driver do kernel, ou, mais especificamente, como o kernel lida com o cache de disco. Se eu gravar em um disco físico por meio de um LV para uma área que está atualmente em cache, é possível que o cache não seja atualizado ou marcado como sujo?
Este é um sistema embarcado, então eu tentei reiniciar meu sistema removendo e reaplicando energia. O comportamento é exatamente o mesmo. Até a perda de energia, hexdump
no dispositivo físico mostra os dados obsoletos e depois de reiniciar as atualizações para os dados recém-gravados. Isso sugere que as gravações são liberadas para o disco à medida que são concluídas e não fazem parte do processo de desligamento do Linux.
Vou deixar isso em aberto por um tempo, pois ainda não sei qual é a causa disso, mas pelo menos eu sei que o problema não é realmente um problema.
[edit] Definitivamente, parece que o cache é o culpado. A execução de echo 3 > /proc/sys/vm/drop_caches
após a gravação faz com que o readback seja atualizado imediatamente. Welp