Woher wissen, was von dm-cache zwischengespeichert wird?

10

Ich benutze dm-cache jetzt schon eine ganze Weile erfolgreich. Jetzt möchte ich wissen, welche Dateien sich gerade im Cache befinden. Ich verstehe, dass dm-cache mit Blöcken funktioniert, nicht mit Dateien, aber da es ein Dateisystem darüber gibt, sollte es theoretisch möglich sein, dies in (Teile von) Dateien zu übersetzen, die zwischengespeichert werden.

Natürlich interessiert mich eine praktische Lösung: Wie kann ich auflisten, was sich aktuell im dm-Cache befindet?

Fabian
quelle

Antworten:

1

Nach Kernel - Dokumentation , dm-cachehat Metadaten, die eine Familie mit Thin-Provisioning - Metadaten ist:

Das Ziel verwendet die in der Thin-Provisioning-Bibliothek verwendete Metadatenbibliothek erneut.

Somit können Sie das thin-provisioning-toolsPaket verwenden, das bereitstellt cache_dump.

Die Verwendung dieses Tools ist jedoch nicht sehr einfach. Die README-Datei schlägt vor, dass Sie zuerst einen Schnappschuss des Geräts erstellen müssen , aber trotzdem konnte ich es überhaupt nicht zum Laufen bringen.

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

Also habe ich stattdessen etwas Seltsames gemacht:

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

Ergebnis:

<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"/>

Also, was haben wir hier. Eine Blockgröße von "128" (Sektoren) und der erste Block ("0") im Cache-Gerät sollen mit dem Block "163832" des Ursprungsgeräts identisch sein. Lassen Sie uns prüfen, ob es überhaupt Sinn macht.

Für <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

Für <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

Sieht gut für mich aus. Alles andere ist das gleiche alte "Finde heraus, welche Datei wo ist". Es kann mit getan werden filefrag, hdparm --fibmapoder Dateisystem-spezifische Tools wie debugfs icheck. Gleich alt heißt leider nicht einfach ...

Dies ist der sehr dumme, sehr manuelle Ansatz:

# 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

265120ist drin 163856..311703also das ist die datei! Oder ist es?

# 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

Die DNA stimmt überein, das Timing funktioniert, alles überprüft.

Natürlich interessiert mich eine praktische Lösung: Wie kann ich auflisten, was sich aktuell im dm-Cache befindet?

Leider ist dies nicht sehr praktisch, bis Sie es in jedem Schritt des Weges skripten. Ich konnte kein gebrauchsfertiges Skript dafür finden. Alles, was ich Ihnen an dieser Stelle anbieten kann, sind die notwendigen Zutaten. Es tut uns leid :-)

Frostschutz
quelle