Dm-cache tarafından neyin önbelleğe alındığını nasıl bilebilirim?


10

Bir süredir dm-cache'yi başarıyla kullanıyorum. Şimdi hangi dosyaların şu anda önbellekte olduğunu bilmek istiyorum. Dm-cache'nin dosyalarla değil bloklarla çalıştığını anlıyorum, ancak yukarıda bir dosya sistemi olduğu için teoride bunu önbelleğe alınan dosyaların (parçalarının) haline çevirmek mümkün olmalıdır.

Tabii ki pratik bir çözümü önemsiyorum: Şu anda dm-cache'de olanları nasıl listeleyebilirim?

Yanıtlar:


1

Çekirdek belgelere göre , dm-cacheince provizyon meta verilerle bir ailedir meta veriler bulunur:

Hedef, ince temel hazırlık kitaplığında kullanılan meta veri kitaplığını yeniden kullanır.

Böylece sağlayan thin-provisioning-toolspaketi kullanabilirsiniz cache_dump.

Ancak bu aracın kullanımı çok basit değildir. README, önce cihazın anlık görüntüsünü almanızı önerir , ancak öyle olsa bile, hiç çalışamadım.

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

Bunun yerine garip bir şey yaptım:

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

Sonuç:

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

Peki burada neyimiz var. Bir blok boyutu "128" (sektörler) ve önbellek cihazındaki ilk blok ("0"), başlangıç ​​cihazının "163832" bloğu ile aynı olmalıdır. Herhangi bir anlam ifade edip etmediğini kontrol edelim.

Şunun için <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

Şunun için <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

Bana iyi görünüyor. Diğer her şey aynı eski "hangi dosyanın nerede olduğunu anlamaya". Bu ile yapılabilir filefrag, hdparm --fibmapveya dosya sistemi özgü araçları gibi debugfs icheck. Aynı eski maalesef basit anlamına gelmez ...

Bu çok aptalca, çok manuel bir yaklaşımdır:

# 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

265120içinde 163856..311703dosya bu yüzden! Yoksa öyle mi?

# 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 eşleşir, zamanlama çalışır, her şey kontrol edilir.

Tabii ki pratik bir çözümü önemsiyorum: Şu anda dm-cache'de olanları nasıl listeleyebilirim?

Ne yazık ki, yolun her adımında komut yazana kadar bu çok pratik değildir. Bunun için kullanıma hazır bir komut dosyası bulamadım. Bu noktada size sunabileceğim tek şey gerekli malzemeler. Afedersiniz :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.