มีวิธีง่าย ๆ ในการย้าย / คัดลอกโลจิคัลวอลุ่มจากกลุ่มวอลุ่มหนึ่งไปยังอีกกลุ่มหนึ่งหรือไม่? (LVM2)


15

ฉันกำลังจัดเรียงดิสก์จำนวนมากบนเซิร์ฟเวอร์ที่บ้านและพบว่าตัวเองอยู่ในตำแหน่งที่ต้องการย้ายโลจิคัลวอลุ่ม LVM จำนวนมากไปยังกลุ่มวอลุ่มอื่น มีวิธีง่าย ๆ ในการทำเช่นนี้? ฉันเห็นการกล่าวถึงcplvคำสั่ง แต่ดูเหมือนว่าจะเก่าหรือไม่ใช่สิ่งที่เคยมีสำหรับ Linux

คำตอบ:


20

หากคุณสามารถจัดเรียงโลจิคัลวอลุ่มให้อยู่ในเซ็ตย่อยแยกต่างหากของฟิสิคัลวอลุ่มจากส่วนที่เหลือของกลุ่มวอลุ่มต้นทาง ( lvconvert sourcevg/sourcelv /dev/pv1 ...อาจช่วยได้) คุณสามารถใช้vgsplitเพื่อแยก lv ออกเป็น vg ใหม่และvgmergeรวม vg ใหม่เข้ากับ เป้าหมาย vg

แม้ว่า LVM มีคุณลักษณะมิเรอร์ที่คุณไม่สามารถ (sanely) ใช้ในการทำสำเนาระหว่างกลุ่มปริมาณเพราะขาทั้งสองข้างของกระจกจะต้องอาศัยอยู่บน VG เดียวกันและสมาคมไม่สามารถหัก

คุณสามารถคัดลอกปริมาณ LVM ไปอีกวิธีหนึ่งที่คุณต้องการคัดลอกปริมาณการใด ๆ ไปยังอีก: สร้าง LV dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4Mเป้าหมายของขนาดที่เหมาะสมแล้วคัดลอกเนื้อหาที่มี หากปริมาณที่ใช้งานอยู่คุณสามารถใช้ประโยชน์จาก LVM เพื่อทำสำเนาที่สอดคล้องกันก่อน: ถ่ายภาพสแน็ปช็อตของแหล่งที่มา lv lvcreate -sก่อนจากนั้นจึงคัดลอกภาพรวม


1
Brilliant Gilles .... vgsplit / vgmerge อาจจะใช้ได้: ฉันสามารถใช้ pvmove หลังจากนั้นเพื่อย้ายส่วนขยายทางกายภาพไปยังดิสก์ใหม่แล้วลบไดรฟ์ข้อมูลเก่าออกจาก VG
— jkp

ความอัปยศนี้ไม่ได้ผลสำหรับฉันในท้ายที่สุดเนื่องจากขนาดขอบเขตที่แตกต่างกัน หากนั่นไม่ใช่ปัญหาสำหรับคุณแม้ว่าฉันจะแนะนำวิธีนี้จะง่ายที่สุด
— jkp

หลังจากdd(ถ้าคุณไม่รีบเร่งที่จะกำจัดวอลลุ่มเก่า) อย่าลืมเปลี่ยน UUID ของระบบไฟล์ใหม่: tune2fs -U random / dev / targetvg / targetlv
— midenok

2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove สามารถย้ายข้อมูลระหว่างฟิสิคัลวอลุ่ม: คู่มือผู้ดูแลระบบ LVM


10
แต่ไม่ใช่ระหว่างกลุ่มวอลุ่ม
— MattBianco

ฉันพูดซ้ำ: วิธีนี้ใช้ไม่ได้กับกลุ่มวอลุ่มสองกลุ่ม
— kissgyorgy

vgextendvg1 แรกกับ pv ใหม่จากนั้นpvmovelv ของคุณไปยัง pv ใหม่vgsplitvg ชั่วคราวที่คุณvgmergeอยู่ใน vg2 จากนั้นpvmoveให้ lv to vg2 ดั้งเดิม pv อีกครั้งvgreducevg2 เพื่ออ่าน pv กลาง หรือเพื่อหลีกเลี่ยงการคัดลอกกลางคุณสามารถรวม vg1 ใน vg2, pvmovelv1 และvgsplitvg1 อีกครั้งจาก vg2 อีกครั้ง คำตอบนี้ควรจะตอบโจทย์ของ @ MattBianco และ @kissgyorgy และเทียบเท่ากับวิธีแก้ปัญหาของ @Gilles แต่แทนที่สแน็ปช็อตและddระดับpvmove
— ล่าง

1

ในฐานะของ LVM ใน Debian ยืด (9.0) คือ 2.02.168-2 มันเป็นไปได้ที่จะทำสำเนาของปริมาณตรรกะข้ามกลุ่มปริมาณการใช้การรวมกันของvgmerge, และlvconvert vgsplitเนื่องจากการย้ายเป็นการรวมกันของการคัดลอกและการลบการทำเช่นนี้จึงเหมาะสำหรับการย้าย

หรือคุณสามารถใช้pvmoveเพื่อย้ายระดับเสียง

เซสชันตัวอย่างแบบสมบูรณ์ในตัวเองโดยใช้อุปกรณ์วนรอบและ lvconvertตามมา

สรุป: เราสร้างกลุ่มปริมาณvg1ที่มีปริมาณตรรกะlv1และvg2ด้วยlv2และทำสำเนาของในlv1vg2

สร้างไฟล์

truncate pv1 --size 100MB
truncate pv2 --size 100MB

ตั้งค่าอุปกรณ์วนรอบในไฟล์

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

สร้างฟิสิคัลวอลุ่มบนอุปกรณ์ลูป (เตรียมข้อมูลเบื้องต้นอุปกรณ์ลูปสำหรับใช้โดย LVM)

pvcreate /dev/loop1 /dev/loop2

สร้างกลุ่มวอลุ่มvg1และvg2เปิด/dev/loop1และ/dev/loop2 ตามลำดับ

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

สร้างโลจิคัลวอลุ่มlv1และlv2เปิดvg1และvg2ตามลำดับ

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

สร้าง filesystems ext4 บนและlv1lv2

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

เลือกเขียนบางอย่างlv1เพื่อให้คุณสามารถตรวจสอบภายหลังว่าสำเนาถูกสร้างขึ้นอย่างถูกต้อง ทำให้vg1ไม่ใช้งาน

vgchange -a n vg1

เรียกใช้คำสั่งผสานในโหมดทดสอบ สิ่งนี้ผสานlv1เข้าlv2กับ

vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1

และสำหรับของจริง

vgmerge -A y -l -v vg2 vg1

แล้วสร้างกระจกคู่ RAID 1 จากการใช้lv1 lvconvertก <> อาร์กิวเมนต์บอกlvconvertทำสำเนากระจก บนlv1_copy/dev/loop2

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

จากนั้นก็แยกกระจก lv1_copyเลเวลใหม่อยู่ในขณะนี้

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

ทำให้vg2ไม่ใช้งาน

vgchange -a n vg2

จากนั้น (โหมดทดสอบ)

vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1

สำหรับของจริง

vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1

ผลลัพธ์ที่ได้:

lvs
[...]
lv1        vg1       -wi-a-----  12.00m
lv1_copy   vg2       -wi-a-----  12.00m
lv2        vg2       -wi-a-----  12.00m

หมายเหตุ:

1) คำสั่งเหล่านี้ส่วนใหญ่จะต้องถูกเรียกใช้ในฐานะรูท

2) หากมีการทำซ้ำชื่อของโลจิคัลวอลุ่มในกลุ่มวอลุ่มสองกลุ่มvgmergeจะปฏิเสธที่จะดำเนินการต่อ

3) เมื่อรวม:

Logical volumes in `vg1` must be inactive

และแยก:

Logical volume `vg2/lv1` must be inactive.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.