Os dois principais ingredientes são hdparm --fibmap file
, que informa onde o arquivo está fisicamente localizado no LV e lvs -o +seg_pe_ranges,vg_extent_size
, que informa onde o LV está fisicamente localizado em seu (s) dispositivo (s).
O resto é matemática.
Então, por exemplo:
# hdparm --fibmap linux-3.8.tar.bz2
linux-3.8.tar.bz2:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 288776 298511 9736
4984832 298520 298623 104
5038080 298640 298695 56
5066752 298736 298799 64
5099520 298824 298895 72
[...]
Eu não sei porque isso é tão fragmentado - baixado com o wget. Pode ser um bom exemplo, porque, como você vê, você fica com dor de cabeça sem criar scripts de alguma forma, pelo menos para arquivos fragmentados. Vou pegar o primeiro segmento 288776-298511 (9736 setores). A contagem está errada, já que não são setores de 512 bytes, mas de qualquer forma.
Primeiro verifique se esses dados estão corretos:
# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Wheeee.Isso é idêntico, então estamos lendo o LV-src no lugar certo. Agora, onde está a fonte-LV localizada?
# lvs -o +seg_pe_ranges,vg_extent_size
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert PE Ranges Ext
[...]
src lvm -wi-ao--- 4.00g /dev/dm-1:5920-6047 32.00m
[...]
Agora isso é chato, esse LV não é fragmentado. Nenhuma dor de cabeça aqui. Enfim.
Ele diz que o src está no / dev / dm-1 e inicia no PE 5920 e termina no PE 6047. E o tamanho do PE é de 32 MiB.
Então vamos ver se podemos ler a mesma coisa de / dev / dm-1 diretamente. Em termos matemáticos, isso é um pouco incômodo já que usamos blocos de 512 bytes antes ...: - / mas eu sou preguiçoso, então vou calcular o MiB e depois dividir por 512! Ha! :-D
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685 -
Boo-boo. Não é isso que estamos procurando. O que deu errado? Ah! Esquecemos de adicionar o offset que é ocupado pelo LVM no início de um PV para armazenar metadados e lixo do LVM. Geralmente isso é alinhado ao MiB, então adicione outro MiB:
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Lá você tem isso.