단일 드라이브 LVM 볼륨을 3개 드라이브에 걸쳐 있는 스트라이프 볼륨으로 변환

단일 드라이브 LVM 볼륨을 3개 드라이브에 걸쳐 있는 스트라이프 볼륨으로 변환

LVM을 사용하는 서버에는 단일 드라이브(PV)에 간단한 선형 LV가 있습니다. 이제 서버에 (동일한 크기) 드라이브(PV) 2개를 더 추가했습니다.

가능하다면 온라인에서 3개 드라이브에 걸쳐 기존 선형 LV를 스트라이프 LV(예: RAID0)로 변환하고 싶습니다. 이렇게 하면 스트라이핑으로 인해 성능이 향상될 수 있습니다. 나도 알아요이론적으로가능한.

나는 LV를 기반으로 줄무늬 거울을 만드는 것과 같은 많은 것을 시도했습니다.이 웹사이트 기술, 하지만 제 경우에는 원래 드라이브를 계속 사용하고 싶기 때문에 상황이 더 복잡합니다(웹사이트에서는 단일 드라이브 LV에서 3으로 마이그레이션한다고 나와 있습니다).다른운전사).

및 기타 LVM 도구에 익숙해졌지만 성공하지 pvmove못했습니다 . lvconvert도와주세요. :)

필요한 경우 다른 드라이브에 추가 공간이 거의 없습니다(원래 LV 크기의 약 5%).

lvdisplay -m것은 다음과 같습니다 :

--- Logical volume ---
LV Path                /dev/vg_space/vol_space
LV Name                vol_space
VG Name                vg_space
LV Status              available
# open                 1
LV Size                260.75 GiB
Current LE             66752
Segments               1
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           253:0

--- Segments ---
Logical extent 0 to 66751:
  Type                linear       
  Physical volume     /dev/sda5
  Physical extents    0 to 66751

답변1

마침내 트릭 을 찾았습니다 .

설정: 원래 드라이브가 /dev/sda(PV는 /dev/sda1)이고 두 개의 새 드라이브는 /dev/sdb및 이라고 가정합니다 /dev/sdc. 모든 드라이브의 크기는 100MB입니다.

아이디어: 모든 데이터가 드라이브의 절반에 들어갈 수 있으므로 sdb드라이브 sdc의 나머지 3개 절반에 LV의 스트라이프 미러를 생성하는 동안 임시로 데이터를 거기에 넣을 수 있습니다. 그런 다음 (임시) 거울의 원래 면을 제거하고 스트라이프 LV를 전체 크기로 확장합니다.

이 훌륭한 예술 작품은 더 나은 설명이 필요합니다.

original state:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
|       | |       | |       |
|lv_orig| | empty | | empty |
|       | |       | |       |
|       | |       | |       |
|       | |       | |       |
|       | |       | |       |
|_______| |_______| |_______|


partition sdb & sdc, pvmove, then partition sda:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
| sda1  | | sdb1  | | sdc1  |
| empty | | empty | | empty |
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | |lv_orig| |lv_orig| <= linear on 2 drives
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|


add sda{1,2,3} to vg, mirror the LV on this in striped mode:

   sda       sdb       sdc
 _______   _______   _______
|lv_orig| |lv_orig| |lv_orig|
|mirror | |mirror | |mirror |  <= striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | |lv_orig| |lv_orig|
| empty | |half 1 | |half 2 |
|_______| |_______| |_______|



get rid of the sd{b,c}2 side of the mirror:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
|lv_orig| |lv_orig| |lv_orig|  <= still striped!
|stripe1| |stripe2| |stripe3|
|_______| |_______| |_______|
|       | |       | |       |
| sda2  | | sdb2  | | sdc2  |
| empty | | empty | | empty |
|_______| |_______| |_______|


delete sd{a,b,c}2 partitions to extend sd{a,b,c}1 on the whole disk,
finally, extend the lv:

   sda       sdb       sdc
 _______   _______   _______
|       | |       | |       |
| sda1  | | sdb1  | | sdc1  |
|       | |       | |       |
|lv_orig| |lv_orig| |lv_orig|  <= definitely striped!
|       | |       | |       |
|bigger&| |bigger&| |bigger&|
|striped| |striped| |striped|
|_______| |_______| |_______|

수행 방법은 다음과 같습니다.

면책조항: 저는 주로 기억을 토대로 글을 쓰고 있습니다. 명령을 다시 확인하세요. (그리고 필요한 경우 게시물을 편집하세요!)

  • 각각 42MB와 58MB의 파티션 sdb1과 을 생성합니다.sdb2
  • 에 대해서도 마찬가지입니다 sdc.
  • pvcreate /dev/sd{b,c}{1,2},
  • vgextend vg_orig /dev/sdb2 /dev/sdc2,
  • pvmove /dev/sda1sdb2모든 LV 데이터를 및 로 이동합니다 sdc2.
  • vgreduce vg_orig /dev/sda1pvremove /dev/sda1LVM을 완전히 사용하지 않도록 설정합니다 sda.
  • 42MB 파티션을 생성하고 ( /dev/sda1필요한 경우 이전 파티션 삭제), pvcreate /dev/sda1,vgextend vg_orig dev/sd{a,b,c}1
  • lvconvert --type mirror --mirrors 1 --stripes 3 vg_orig/lv_orig /dev/sd{a,b,c}1원래 LV 볼륨(우리가 찾고 있는 것!)의 스트립된 미러가 생성되고 다음을 사용하여 세부 정보를 볼 수 있습니다 lvdisplay -am.
  • LV의 총 확장 수가 3의 배수가 아닌 경우 이전 명령이 실패할 수 있습니다. 이 경우 다음과 같이 LV에 1개 또는 2개의 확장을 간단히 추가할 수 있습니다 lvextend -l +1 vg_orig/lv_orig.
  • sdb2이 명령을 사용하면 및 에 있는 데이터의 임시 미러 복사본을 삭제합니다 sdc2.lvconvert --type mirror --mirrors 0 vg_orig/lv_orig /dev/sd{b,c}2
  • 더 이상 필요하지 않은 sdX2 파티션 삭제: vgreduce vg_orig /dev/sd{b,c}2, pvremove /dev/sd{b,c}2,
  • 이제 원본 데이터의 스트라이프 버전이 있으므로 파티션을 더 크게 만들어야 하므로 및 파티션을 sd{a,b,c}1삭제 하고 , 및 , 파티션을 다시 생성하여 동일한 섹터 번호로 시작하지만 더 높은 섹터 번호로 끝나도록 합니다( 두려워하지 마세요 :)),sdb2sdc2sda1sdb1sdc1
  • partprobe /dev/sd{a,b,c}1커널 파티션 테이블을 플러시합니다.
  • pvresize /dev/sd{a,b,c}1LVM이 PV가 더 크다는 것을 인식하게 하고,
  • lvextend -l 100%VG vg_orig/lv_orig이제 LV를 더 크게 만들어 보겠습니다.
  • resize2fs vg_orig/lv_orig온라인으로 확장하려는 외부 파일 시스템이 있는 경우.

여기요!

이런 종류의 작업을 위해 설계된 것으로 추정되는 LVM과 같은 도구가 하나 또는 두 개의 명령으로 이 작업을 쉽게 수행할 수 없다는 것이 나에게는 매우 혼란스럽습니다.

답변2

내 솔루션은 @Totor의 다이어그램을 기반으로 하지만 새 lvm raid0(sdb 및 sdc)에 새 파일 시스템을 생성하여 두 번째 단계를 변경하겠습니다. 그런 다음 rsync -avP. 그런 다음 3개의 줄무늬(sda1, sdb1, sdc1)가 있는 새 raid0을 만듭니다. 그런 다음 2개 스트라이프에서 3개 스트라이프로 rsync하고 lvresize/extend를 수행합니다. 2번만 복사하세요.

관련 정보