dm-cache 캐시가 무엇인지 어떻게 알 수 있나요?

dm-cache 캐시가 무엇인지 어떻게 알 수 있나요?

나는 한동안 dm-cache를 성공적으로 사용해 왔습니다. 이제 현재 캐시에 어떤 파일이 있는지 알고 싶습니다. 나는 dm-cache가 파일이 아닌 블록과 함께 작동한다는 것을 알고 있지만, 맨 위에 파일 시스템이 있으므로 이론적으로 이를 캐시되는 파일(일부)로 변환하는 것이 가능해야 합니다.

물론 저는 실용적인 해결책인 dm-cache의 현재 내용을 나열하는 방법에 관심이 있습니다.

답변1

커널 문서에 따르면, dm-cache메타데이터가 있는 경우 씬 프로비저닝 메타데이터가 포함된 제품군입니다.

대상은 씬 프로비저닝 저장소에 사용된 메타베이스를 재사용합니다.

thin-provisioning-tools따라서 를 제공하는 이 패키지를 사용할 수 있습니다 cache_dump.

그러나 이 도구를 사용하는 것은 그리 간단하지 않습니다. Readme에서는 다음을 수행해야 한다고 권장합니다.먼저 장치의 스냅샷을 찍습니다., 그러나 그럼에도 불구하고 나는 그것을 작동시킬 수 없습니다.

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

그래서 나는 이상한 일을 하게 되었습니다.

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

결과:

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

그래서 우리는 여기에 무엇을 가지고 있습니까? 블록 크기는 '128'(섹터)이며 캐시 장치의 첫 번째 블록('0')은 소스 장치의 블록 '163832'와 동일해야 합니다. 말이 되는지 확인해 보겠습니다.

을 위한 <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

을 위한 <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

나는 그것이 좋다고 생각한다. 다른 모든 것은 "어떤 파일이 어디에 있는지 알아내는" 것과 동일합니다. 이는 .NET Framework와 같은 파일 시스템 관련 도구를 사용하여 수행할 수 있습니다 filefrag. hdparm --fibmap불행하게도 debugfs icheck진부하다는 것은 단순한 것을 의미하지 않습니다…

이것은 매우 어리석고 수동적인 접근 방식입니다.

# 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

265120거기에 있으니 163856..311703그게 파일이군요! 아니면 그럴까요?

# 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가 일치했고 타이밍이 정확했으며 모든 것이 확인되었습니다.

물론 저는 실용적인 해결책인 dm-cache의 현재 내용을 나열하는 방법에 관심이 있습니다.

불행하게도 모든 단계를 스크립트로 작성하지 않는 한 이는 그다지 실용적이지 않습니다. 아직 준비된 스크립트를 찾지 못했습니다. 그래서 지금 제가 드릴 수 있는 것은 필요한 재료들뿐입니다. 죄송합니다:-)

관련 정보