Hai thành phần chính là hdparm --fibmap file
, cho bạn biết tập tin nằm ở đâu trong LV và lvs -o +seg_pe_ranges,vg_extent_size
cho bạn biết LV nằm ở đâu trên thiết bị của bạn.
Phần còn lại là toán học.
Ví dụ:
# hdparm --fibmap linux-3.8.tar.bz2
linux-3.8.tar.bz2:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 288776 298511 9736
4984832 298520 298623 104
5038080 298640 298695 56
5066752 298736 298799 64
5099520 298824 298895 72
[...]
Tôi không biết tại sao điều này quá phân mảnh - được tải xuống với wget. Có thể là một ví dụ tốt bởi vì như bạn thấy, bạn bị đau đầu mà không có kịch bản này bằng cách nào đó, ít nhất là cho các tệp bị phân mảnh. Tôi sẽ chỉ lấy đoạn đầu tiên 288776-298511 (9736 ngành). Số lượng là sai vì nó không phải là 512 byte, nhưng dù sao đi nữa.
Trước tiên hãy kiểm tra xem dữ liệu này có thực sự chính xác không:
# dd if=linux-3.8.tar.bz2 bs=512 skip=0 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0506548 s, 98.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
# dd if=/dev/lvm/src bs=512 skip=288776 count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.123292 s, 40.4 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Wheeee.Đó giống hệt nhau nên chúng tôi đang đọc LV-src ở đúng nơi. Bây giờ nguồn LV nằm ở đâu?
# lvs -o +seg_pe_ranges,vg_extent_size
LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert PE Ranges Ext
[...]
src lvm -wi-ao--- 4.00g /dev/dm-1:5920-6047 32.00m
[...]
Bây giờ thật nhàm chán, LV này không bị phân mảnh. Không đau đầu ở đây. Dù sao.
Nó nói src là trên / dev / dm-1 và bắt đầu ở PE 5920 và kết thúc ở PE 6047. Và kích thước PE là 32 MiB.
Vì vậy, hãy xem liệu chúng ta có thể đọc điều tương tự từ / dev / dm-1 không. Về mặt toán học, đây là một chút rắc rối vì chúng tôi đã sử dụng kích thước khối 512 byte trước đó ...: - / nhưng tôi lười nên tôi chỉ tính MiB và sau đó chia cho 512! Hà! : -D
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0884709 s, 56.3 MB/s
3858a4cd75b1cf6f52ae2d403b94a685 -
Boo Boo. Đây không phải là những gì chúng ta đang tìm kiếm. Có chuyện gì? Ah! Chúng tôi đã quên thêm phần bù mà LVM đã sử dụng vào đầu PV để lưu trữ siêu dữ liệu và crap LVM. Thông thường đây là liên kết MiB, vì vậy chỉ cần thêm một MiB khác:
# dd if=/dev/dm-1 bs=512 skip=$((1024*1024/512 * 32 * 5920 + 288776 + 1024*1024/512)) count=9736 | md5sum
9736+0 records in
9736+0 records out
4984832 bytes (5.0 MB) copied, 0.0107592 s, 463 MB/s
7ac1bb05a8c95d10b97982b07aceafa3 -
Có bạn có nó.