주어진 파일에 대한 LVM 범위 번호 결정


9

저는 현재 업무와 관련이없는 숙제를하고 있습니다. 논리 볼륨에 ext4 파일 시스템이 있습니다. 다른 성능 조정 전략을 테스트 중이며이 아이디어가 나에게 일어났습니다. pvmove는 개별 범위와 범위의 범위를 이동할 수 있기 때문에 특정 파일을 보유하는 물리적 범위가 무엇인지 (이론적으로 데이터베이스의 파일을 백업하거나 일반적으로 액세스하는 큰 파일 공유 일 수 있음) 매핑하고이를 특정 범위로 이동할 수있는 방법이 있습니까? 스토리지 장치 (예 : 동일한 LVM 볼륨 그룹에 일반 HDD 및 SSD 드라이브가 있음)?

나는 "filefrag"를 사용하려고 생각했지만 익스텐트 번호가 반드시 순차적으로 사용되는지 100 %가 아닌 것으로 나타났습니다 (ext4의 얼마나 많은 섹터가 파일을 볼 수 있는지 아는 것은 아닙니다. 파일이 실제로 어느 정도의 숫자 / 볼륨에 있는지 파악합니다.

어떤 아이디어?

답변:


13

두 가지 주요 구성 요소는 hdparm --fibmap file파일이 LV 내에서 실제로 lvs -o +seg_pe_ranges,vg_extent_size어디에 있는지, LV가 장치에서 실제로 어디에 있는지를 알려줍니다.

나머지는 수학입니다.

예를 들어,

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

왜 이것이 그렇게 조각 난지 모르겠습니다-wget으로 다운로드했습니다. 보시다시피 적어도 조각난 파일의 경우이 스크립트를 작성하지 않고도 두통이 발생하기 때문에 좋은 예가 될 수 있습니다. 첫 번째 세그먼트 288776-298511 (9736 섹터)을 사용하겠습니다. 512 바이트 섹터가 아니기 때문에 카운트가 잘못되었습니다.

먼저이 데이터가 실제로 올바른지 확인하십시오.

# 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. 그것은 동일하므로 우리는 올바른 장소에서 LV-src를 읽고 있습니다. 이제 소스 LV는 어디에 있습니까?

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

이제 지루합니다.이 LV는 조각화되지 않았습니다. 두통이 없습니다. 어쨌든.

src는 / dev / dm-1에 있고 PE 5920에서 시작하여 PE 6047에서 끝납니다. PE 크기는 32MiB입니다.

따라서 / dev / dm-1에서 같은 내용을 직접 읽을 수 있는지 살펴 보겠습니다. 수학적으로, 512 바이트 블록 크기를 이전에 사용했기 때문에 이것은 약간 번쩍입니다 ... :-/ 그러나 게 으르므로 MiB를 계산 한 다음 512로 나눕니다! 하아! :-디

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

부 부. 이것은 우리가 찾고있는 것이 아닙니다. 무엇이 잘못 되었나요? 아! LVM 메타 데이터 및 크랩을 저장하기 위해 PV 시작시 LVM이 차지하는 오프셋을 추가하는 것을 잊었습니다. 일반적으로 이것은 MiB 정렬이므로 다른 MiB를 추가하십시오.

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

거기 있어요


3
언젠가 그들은 당신의 명예를 위해 조각상을 만들 것입니다.
Bratchley

한 가지, 내 hdparm 호출이 segfaulting 인 이유 무엇입니까?
Bratchley

사실, 파업하면 Google-fu에서 개선 해야하는 것처럼 보입니다 . SSD 및 LVM과 관련된 새로운 RHEL 버그입니다. 파일이 이미 SSD에 있다는 것을 의미합니다. 하
Bratchley

이 문제를 해결할 때까지 LV에서 파일 위치를 결정하는 다른 유틸리티가 있습니까?
Bratchley

당신은 이미 그것을 언급했다 filefrag. 그렇지 않으면 다른 도구가 fibmap 또는 fiemap을 수행하는 경우 Google.
frostschutz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.