¿Cómo saber qué almacena en caché dm-cache?

10

Estoy usando dm-cache con éxito desde hace bastante tiempo. Ahora me gustaría saber qué archivos se encuentran actualmente en el caché. Entiendo que dm-cache funciona con bloques, no con archivos, pero dado que hay un sistema de archivos arriba, en teoría debería ser posible traducir esto a (partes de) los archivos que se almacenan en caché.

Por supuesto, me importa una solución práctica: ¿cómo puedo enumerar lo que está actualmente en dm-cache?

Fabian
fuente

Respuestas:

1

Según la documentación del kernel , dm-cachetiene metadatos, que es una familia con metadatos de aprovisionamiento delgado:

El destino reutiliza la biblioteca de metadatos utilizada en la biblioteca de aprovisionamiento delgado.

Por lo tanto, puede usar el thin-provisioning-toolspaquete, que proporciona cache_dump.

Sin embargo, el uso de esta herramienta no es muy sencillo. README sugiere que primero debe tomar una instantánea del dispositivo , pero aun así, no pude hacerlo funcionar en absoluto.

# cache_dump /dev/mapper/foo-bar_cmeta
syscall 'open' failed: Device or resource busy
Note: you cannot run this tool with these options on live metadata.

Así que terminé haciendo algo extraño en su lugar:

# cp /dev/mapper/foo-bar_cmeta /dev/shm
# losetup --find --show /dev/shm/foo-bar_cmeta
/dev/loop1
# cache_dump /dev/loop1

Resultado:

<superblock uuid="" block_size="128" nr_cache_blocks="16384" policy="smq" hint_width="4">
  <mappings>
    <mapping cache_block="0" origin_block="163832" dirty="false"/>
    <mapping cache_block="1" origin_block="163833" dirty="false"/>
    <mapping cache_block="2" origin_block="163834" dirty="false"/>
    ...
    <mapping cache_block="5295" origin_block="16568" dirty="false"/>
    <mapping cache_block="5296" origin_block="16569" dirty="false"/>
    <mapping cache_block="5297" origin_block="16570" dirty="false"/>

Entonces que tenemos aqui. Se supone que un tamaño de bloque de "128" (sectores) y el primer bloque ("0") en el dispositivo de caché son idénticos al bloque "163832" del dispositivo de origen. Vamos a ver si tiene algún sentido.

Para <mapping cache_block="0" origin_block="163832" dirty="false"/>:

# hexdump -C --skip $((512*128*0)) -n 32 /dev/mapper/foo-bar_cdata 
00000000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
00000010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
00000020
# hexdump -C --skip $((512*128*163832)) -n 32 /dev/mapper/foo-bar_corig 
27ff80000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
27ff80010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
27ff80020

Para <mapping cache_block="5297" origin_block="16570" dirty="false"/>:

# hexdump -C --skip $((512*128*5297)) -n 32 /dev/mapper/foo-bar_cdata 
14b10000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
14b10010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
14b10020
# hexdump -C --skip $((512*128*16570)) -n 32 /dev/mapper/foo-bar_corig 
40ba0000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
40ba0010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
40ba0020

Me parece bien. Todo lo demás es el mismo viejo "averiguar qué archivo es dónde". Se puede hacer con filefrag, hdparm --fibmapo herramientas de sistema de archivos específicos como debugfs icheck. La misma edad desafortunadamente no significa simple ...

Este es el enfoque muy estúpido y muy manual:

# echo $((512*128*16570/4096))
265120
# filefrag -v -e *
[...]
File size of firefox-network.log-main.2270 is 605582660 (147848 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..  147847:     163856..    311703: 147848:             last,eof

265120está dentro 163856..311703así que este es el archivo! ¿O es eso?

# hexdump -C --skip $((512*128*16570-163856*4096)) -n 32 firefox-network.log-main.2270 
18b90000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
18b90010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
18b90020

El ADN coincide, el tiempo funciona, todo se verifica.

Por supuesto, me importa una solución práctica: ¿cómo puedo enumerar lo que está actualmente en dm-cache?

Desafortunadamente, esto no es muy práctico hasta que lo escriba en cada paso del camino. No he podido encontrar un script listo para usar. Entonces, todo lo que puedo ofrecerle en este momento son los ingredientes necesarios. Lo siento :-)

Frostschutz
fuente