Làm thế nào để biết những gì được lưu trữ bởi dm-cache?


10

Tôi đang sử dụng dm-cache thành công khá lâu. Bây giờ tôi muốn biết tập tin nào đang được lưu trong bộ đệm. Tôi hiểu rằng dm-cache hoạt động với các khối, không phải các tệp, nhưng vì có một hệ thống tệp ở trên nên theo lý thuyết nên có thể dịch tệp này sang (các phần của) tệp được lưu trữ.

Tất nhiên tôi quan tâm đến một giải pháp thực tế: Làm thế nào tôi có thể liệt kê những gì hiện có trong dm-cache?

Câu trả lời:


1

Theo tài liệu kernel , dm-cachecó siêu dữ liệu, là một họ với siêu dữ liệu được cung cấp mỏng:

Mục tiêu sử dụng lại thư viện siêu dữ liệu được sử dụng trong thư viện cung cấp mỏng.

Vì vậy, bạn có thể sử dụng các thin-provisioning-toolsgói, cung cấp cache_dump.

Tuy nhiên, việc sử dụng công cụ này không đơn giản lắm. README đề nghị bạn phải chụp nhanh thiết bị trước , nhưng ngay cả như vậy, tôi không thể làm cho thiết bị hoạt động được.

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

Vì vậy, cuối cùng tôi đã làm một cái gì đó kỳ lạ:

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

Kết quả:

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

Vậy chúng ta có gì ở đây nào. Kích thước khối "128" (cung) và khối đầu tiên ("0") trong thiết bị bộ đệm được cho là giống hệt với khối "163832" của thiết bị gốc. Hãy kiểm tra xem nó có ý nghĩa gì không.

Dành cho <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

Dành cho <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

Co vẻ tôt vơi tôi. Mọi thứ khác đều giống nhau "tìm ra tập tin nào ở đâu". Nó có thể được thực hiện với filefrag, hdparm --fibmaphoặc các công cụ dành riêng cho hệ thống tập tin như debugfs icheck. Không may là cũ không có nghĩa là đơn giản ...

Đây là cách tiếp cận rất ngu ngốc, rất thủ công:

# 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

265120nằm trong 163856..311703vì vậy đây là các tập tin! Hoặc là nó?

# 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 phù hợp, thời gian hoạt động, mọi thứ kiểm tra.

Tất nhiên tôi quan tâm đến một giải pháp thực tế: Làm thế nào tôi có thể liệt kê những gì hiện có trong dm-cache?

Thật không may, điều này không thực tế cho đến khi bạn viết kịch bản cho từng bước. Tôi đã không thể tìm thấy một kịch bản sẵn sàng để sử dụng cho nó. Vì vậy, tất cả những gì tôi có thể cung cấp cho bạn tại thời điểm này là các thành phần cần thiết. Lấy làm tiếc :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.