Determinación de los numbers de extensión de LVM para un file dado

Actualmente estoy involucrado en un ejercicio de tareas no relacionado con el trabajo. Tengo un sistema de files ext4 sentado en un volumen lógico. Estoy probando diferentes estrategias de ajuste del performance y se me ocurrió esta idea. Dado que pvmove puede mover extensiones individuales y ranges, ¿hay alguna forma de determinar qué extensiones físicas contienen un file en particular (en teoría puede respaldar files de una database, o una gran cantidad de files accedidos comúnmente) y moverlos a un file en particular? dispositivo de almacenamiento (por ejemplo, tengo una unidad de disco duro normal y una unidad de disco SSD en el mismo grupo de volúmenes LVM)?

Pensé en usar "filefrag" pero luego se me ocurrió que no estaba al 100% sobre si los numbers de extensión se usarían necesariamente en order secuencial (por lo que saber cuántos sectores en ext4 ve un file no necesariamente va a dejar Me pregunto en qué extensión están los numbers / volúmenes en los que está físicamente sentado el file.

¿Algunas ideas?

Solutions Collecting From Web of "Determinación de los numbers de extensión de LVM para un file dado"

Los dos ingnetworkingientes principales son hdparm --fibmap file , que le dice dónde se encuentra físicamente el file dentro del LV, y lvs -o +seg_pe_ranges,vg_extent_size que le indica dónde se encuentra el LV físicamente en su dispositivo (s).

El rest es matemática.

Así por ejemplo:

 # 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 [...] 

No sé por qué esto está tan fragmentado, descargado con wget. Puede ser un buen ejemplo porque, como ve, le da un dolor de cabeza sin que esto ocurra de alguna manera, al less para los files fragmentados. Tomaré el primer segmento 288776-298511 (9736 sectores). El recuento es incorrecto ya que no se trata de sectores de 512 bytes, pero de todos modos.

Primero compruebe que esta información sea realmente correcta:

 # 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. Eso es idéntico, así que estamos leyendo el LV-src en el lugar correcto. Ahora, ¿dónde está el origen-LV?

 # 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 [...] 

Ahora que es aburrido, este LV no está fragmentado. Sin dolor de cabeza aquí. De todas forms.

Dice que src está en / dev / dm-1 y comienza en PE 5920 y termina en PE 6047. Y el tamaño de PE es 32 MiB.

Así que veamos si podemos leer lo mismo desde / dev / dm-1 directamente. Matemáticamente, esto es un poco malo ya que usamos bloques de 512 bytes antes …: – / pero soy flojo, así que solo calcularé el MiB y luego lo dividiré por 512! ¡Decir ah! :-RE

 # 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. Esto no es lo que estamos buscando. ¿Qué salió mal? Ah! Olvidamos agregar el desplazamiento ocupado por LVM al comienzo de un PV para almacenar metadatos LVM y basura. Por lo general, esto está alineado con MiB, así que solo agrega otro 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 - 

Ahí tienes.