Bagaimana cara mengetahui apa yang di-cache oleh dm-cache?

10

Saya menggunakan dm-cache berhasil cukup lama sekarang. Sekarang saya ingin tahu file mana yang sedang dalam cache. Saya mengerti bahwa dm-cache berfungsi dengan blok, bukan file, tetapi karena ada sistem file di atas, secara teori dimungkinkan untuk menerjemahkan ini ke (bagian) file yang di-cache.

Tentu saja saya peduli dengan solusi praktis: Bagaimana saya bisa mendaftar apa yang saat ini ada dalam dm-cache?

Fabian
sumber

Jawaban:

1

Menurut dokumentasi kernel , dm-cachememiliki metadata, yang merupakan satu keluarga dengan metadata tipis:

Target menggunakan kembali pustaka metadata yang digunakan dalam pustaka penyediaan-tipis.

Dengan demikian Anda dapat menggunakan thin-provisioning-toolspaket yang menyediakan cache_dump.

Namun, penggunaan alat ini tidak mudah. README menyarankan Anda harus memotret perangkat terlebih dahulu , tetapi meskipun demikian, saya tidak bisa berfungsi sama sekali.

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

Jadi saya malah melakukan sesuatu yang aneh:

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

Hasil:

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

Jadi, apa yang kita miliki di sini. Ukuran blok "128" (sektor), dan blok pertama ("0") di perangkat cache seharusnya identik dengan blok "163832" dari perangkat asal. Mari kita periksa apakah itu masuk akal sama sekali.

Untuk <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

Untuk <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

Terlihat bagus untukku. Yang lainnya adalah "mencari tahu file mana yang sama". Itu bisa dilakukan dengan filefrag, hdparm --fibmapatau alat khusus seperti sistem berkas debugfs icheck. Lama yang sama sayangnya tidak berarti sederhana ...

Ini adalah pendekatan yang sangat bodoh, sangat 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

265120ada di dalam 163856..311703jadi ini file! Atau itu?

# 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

DNA cocok, waktunya bekerja, semuanya memeriksa.

Tentu saja saya peduli dengan solusi praktis: Bagaimana saya bisa mendaftar apa yang saat ini ada dalam dm-cache?

Sayangnya, ini tidak terlalu praktis sampai Anda menuliskannya di setiap langkah. Saya belum dapat menemukan skrip yang siap digunakan untuk itu. Jadi yang bisa saya tawarkan kepada Anda pada saat ini adalah bahan-bahan yang diperlukan. Maaf :-)

frostschutz
sumber