Menentukan jumlah LVM Extent untuk file yang diberikan

9

Saya saat ini terlibat dalam latihan pekerjaan rumah yang tidak terkait Saya memiliki sistem file ext4 dengan volume logis. Saya menguji berbagai strategi penyesuaian kinerja dan ide ini muncul di benak saya. Karena pvmove dapat memindahkan individual dan rentang luasan, apakah ada cara untuk memetakan luasan fisik apa yang menyimpan file tertentu (secara teori dapat mem-backup file untuk database, atau file share besar yang biasa diakses) dan memindahkannya ke file tertentu perangkat penyimpanan (misalnya saya memiliki HDD biasa dan drive SSD di Grup Volume LVM yang sama)?

Saya berpikir untuk menggunakan "filefrag" tetapi kemudian terpikir oleh saya bahwa saya tidak 100% pada apakah jumlah angka tentu akan digunakan dalam urutan berurutan (jadi mengetahui berapa banyak sektor dalam ext4 melihat file tidak selalu akan membiarkan saya mencari tahu sejauh mana angka / volume file secara fisik duduk.

Ada ide?

Bratchley
sumber

Jawaban:

13

Dua bahan utama adalah hdparm --fibmap file, yang memberi tahu Anda di mana file secara fisik berada di dalam LV, dan lvs -o +seg_pe_ranges,vg_extent_sizeyang memberi tahu Anda di mana LV secara fisik berada di perangkat Anda.

Sisanya adalah matematika.

Jadi, misalnya:

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

Saya tidak tahu mengapa ini sangat terfragmentasi - diunduh dengan wget. Mungkin menjadi contoh yang baik karena seperti yang Anda lihat, Anda mendapatkan sakit kepala tanpa membuat skrip ini, setidaknya untuk file yang terfragmentasi. Saya hanya akan mengambil segmen pertama 288776-298511 (9736 sektor). Hitungannya salah karena bukan sektor 512 byte, tetapi bagaimanapun juga.

Pertama-tama periksa apakah data ini benar:

# 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. Itu identik jadi kami membaca LV-src di tempat yang tepat. Sekarang di mana sumber-LV berada?

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

Nah, itu membosankan, LV ini tidak terfragmentasi. Tidak sakit kepala di sini. Bagaimanapun.

Dikatakan src ada di / dev / dm-1 dan dimulai pada PE 5920 dan berakhir pada PE 6047. Dan ukuran PE adalah 32 MiB.

Jadi mari kita lihat apakah kita dapat membaca hal yang sama dari / dev / dm-1 secara langsung. Secara matematis, ini sedikit lebih buruk karena kami menggunakan blocksize 512 byte sebelumnya ...: - / tapi saya malas jadi saya hanya akan menghitung MiB dan kemudian membaginya dengan 512! Ha! :-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. Ini bukan yang kita cari. Apa yang salah? Ah! Kami lupa menambahkan offset yang ditempati oleh LVM di awal PV untuk menyimpan metadata dan omong kosong LVM. Biasanya ini adalah MiB-sejajar, jadi tambahkan saja MiB lain:

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

Itu dia.

frostschutz
sumber
3
Suatu hari mereka akan membangun patung untuk menghormati Anda.
Bratchley
Namun satu hal, ada ide mengapa doa hdparm saya segfaulting ?
Bratchley
Sebenarnya, lakukan itu, sepertinya saya perlu memperbaiki google-fu saya . Ini adalah bug RHEL baru yang berkaitan dengan SSD dan LVM. Saya akan menganggap ini file yang sudah ada di SSD. Ha
Bratchley
Apakah ada utilitas lain untuk menentukan posisi file di LV sampai mereka memperbaikinya?
Bratchley
Anda sudah menyebutkannya - filefrag. Kalau tidak, google jika ada alat lain yang melakukan fibmap atau fiemap.
frostschutz