จะย้าย / คัดลอกโลจิคัลวอลุ่ม (lv) ไปยังกลุ่มวอลุ่มอื่น (vg) ได้อย่างไร?


17

โดยทั่วไปฉันต้องการย้าย / คัดลอกโลจิคัลวอลุ่ม (lv) ลงในกลุ่มวอลุ่มใหม่ (vg) กลุ่มวอลุ่มใหม่ตั้งอยู่บนฟิสิคัลวอลุ่มชุดใหม่ ไม่มีใครรู้วิธีการทำอย่างปลอดภัยโดยไม่ทำลายข้อมูลภายในปริมาณตรรกะเหล่านั้นหรือไม่


คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่? คุณรู้วิธีสร้าง VG และ LV ใหม่หรือไม่? คุณกำลังย้ายพาร์ติชันข้อมูลหรือพาร์ติชันรากของคุณหรือไม่
Panther

@ bodhi.zazen: อันที่จริงฉันพยายามย้ายพาร์ติชั่นข้อมูล สิ่งที่ฉันหมายถึง "ชนิด" คือโลจิคัลวอลุ่มเหล่านั้นเป็นเครื่องเสมือน (นั่นคือโลจิคัลวอลุ่มเหล่านั้นจะปรากฏต่อเครื่องเสมือนเป็นอุปกรณ์บล็อก) อย่างไรก็ตามฉันสามารถจัดการกับสถานการณ์ด้วยวิธีของฉันเอง ขั้นตอนที่ได้รับในคำตอบของฉัน อย่างไรก็ตามคุณและทุกท่านสามารถแสดงความคิดเห็นเกี่ยวกับวิธีการของฉัน หากมี / เป็นวิธีที่ดีกว่าในการทำสิ่งนี้โปรดแบ่งปันให้มากพอ :)
ไม่มีใคร

ฉันจะสร้าง PV / LV ใหม่ก่อนปิด VM จากนั้นคัดลอกข้อมูลด้วย dd บูต VM ใหม่และยืนยันการทำงาน
Panther

คำตอบ:


12

vgmergeให้คุณรวมVGสองตัวเข้าด้วยกัน คุณยังสามารถใช้pvmoveเพื่อย้ายข้อมูลภายใน VG และvgsplitหากคุณต้องการกลับไปใช้ VG หลายตัว


หนึ่งบันทึก ในการทำเช่นนั้นคุณจะต้องมีอุปกรณ์ชั่วคราวที่ใช้สำหรับการถ่ายโอน LV ออนไลน์ไปยัง VG อื่น แน่นอนหลังจากโอนคุณควรอัปเดต / etc / fstab และการกำหนดค่าอื่น ๆ ที่ได้รับผลกระทบและวางแผนเวลาออฟไลน์สำหรับการรีบูตและในที่สุดก็ทำการอัปเดตการกำหนดค่า หากคุณดำเนินการบางอย่างกับ rootfs หรือ bootfs คุณควรมี linux live distro สำหรับการกู้คืนระบบหลัก
Znik

10

ไม่มีเหตุผลที่จะคัดลอกไปยังไฟล์. img ก่อนทำ lvcreate ก่อนจากนั้นคัดลอกโดยตรงไปที่:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume

2
สั้นเกินไป ไม่ได้บอกว่าขนาดที่ระบุมีอะไรบ้างตัวอย่างเช่น <ขนาด> อาจมีขนาดเล็กมากเนื่องจากเป็นเพียงความแตกต่างของสแนปชอตเท่านั้น
สาบาน

1
@ รับจุดที่ถูกต้อง แต่เขาตอบกลับไปยังคำตอบของไม่มีใครด้านล่างซึ่งเป็นครั้งแรกในเวลา อ่านว่าสำหรับบริบทเพิ่มเติม
โทเบียสเจ

7

โอเคฉันสามารถรับมือกับสถานการณ์ด้วยวิธีของฉันเอง นี่คือขั้นตอนที่ฉันทำ:

1) ถ่ายภาพของโลจิคัลวอลุ่มการกำหนดเป้าหมาย

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

หมายเหตุ: ขนาดของสแนปชอตอาจใหญ่หรือเล็กตามที่คุณต้องการ สิ่งสำคัญคือมีพื้นที่เพียงพอที่จะจับการเปลี่ยนแปลงในช่วงเวลาถ่าย

2) สร้างสำเนารูปภาพของเนื้อหาสแนปชอตโดยใช้ dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) สร้างโลจิคัลวอลุ่มใหม่ที่มีขนาดเพียงพอในกลุ่มเป้าหมาย (ใหม่)

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) เขียนข้อมูลลงในโลจิคัลวอลุ่มใหม่จากการสำรองข้อมูลอิมเมจโดยใช้ dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) ลบภาพรวมและการสำรองข้อมูลภาพโดยใช้lvremoveและrmตามลำดับ

นั่นคือคนทั้งหมด ... หวังว่าจะช่วยให้ใครบางคน :)


หากใครบางคนมีตัวเลือก / วิธีที่ดีกว่าให้ฉันรู้ด้วย :-)
ไม่มีใคร

ising backup.img สำหรับการสำรองข้อมูลที่เก็บชั่วคราวไม่สมบูรณ์ คุณสามารถ dd โดยตรงจาก snapshot ของแหล่งที่มาไปยังปลายทาง LV ที่ไม่มีสถานะเมานต์
Znik

3

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

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

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

สรุป: เราสร้างกลุ่มวอลุ่ม vg1 พร้อมกับโลจิคัลวอลุ่ม lv1 และ vg2 กับ lv2 และสร้างสำเนาของ lv1 ใน vg2

สร้างไฟล์

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

สร้างระบบไฟล์ ext4 บน lv1 และ lv2

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

จากนั้นก็แยกกระจก LV ใหม่ตอนนี้คือ 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.

1
มันไร้จุดหมาย คุณต้องยกเลิกการต่อเชื่อมระบบไฟล์ปิดการใช้งานไดรฟ์ ฯลฯ คุณสามารถยกเลิกการต่อเชื่อม dir และคัดลอกข้อมูลได้เช่นกัน
user189142

ครั้งแรกในฐานะผู้ใช้ 18,9142 กล่าวว่ามันไม่มีจุดหมาย ประการที่สองมันจะใช้กับสถานการณ์เมื่อเราสามารถหยุดการบริการโดยใช้ปริมาณการย้าย นี่เป็นปัญหาของบริการที่เปิดตลอด 24 ชั่วโมงทุกวันและปริมาณมีขนาดใหญ่มากเมื่อนับข้อมูลด้วยเทราไบต์ สาเหตุนี้ขั้นตอนนี้ต้องใช้เวลานานมาก สาเหตุนี้ง่ายกว่ามากคือการสร้างวอลลุ่มใหม่ rsync ออนไลน์และออฟไลน์สั้น ๆ rsync สำหรับการอัปเดตใหม่และระบบกลับสู่สถานะออนไลน์ แน่นอนความคิดที่ดีมากคือกำจัดข้อมูลที่ไม่จำเป็นออกจากโวลุ่มแหล่งข้อมูล บางทีย้ายมันไปที่อื่นชั่วคราว
Znik

3

คำตอบ 4 ข้อที่ทุกคนคิดถึงว่าขนาดที่แท้จริงของปริมาตรมักจะไม่เป็นที่รู้จัก lvdisplayแสดงเฉพาะค่าที่ปัดเศษเป็นทศนิยม 2 ตำแหน่งและman lvdisplayชี้ไปที่คำสั่งอื่นสำหรับตัวเลือกที่มี ข้อมูลต่อไปนี้เลือก MiB ซึ่งมีความแม่นยำเพียงพอกับขนาดบล็อกเริ่มต้นของ LVM ที่ 4 MiB:

lvdisplay --units m

เอ็มไอยังเป็นหน่วยเริ่มต้นสำหรับการ--size lvcreateหากมีข้อสงสัยให้ตรวจสอบขนาดที่ถูกต้องอีกครั้งlvdisplayหลังจากสร้างปริมาณเป้าหมาย จากนั้นไปข้างหน้าเหมือนในคำตอบอื่น ๆ เพื่อทำสำเนา นอกจากนี้ผมอยากแนะนำให้ไปตรวจสอบการคัดลอกcmpตัวอย่างเช่นกับ

เหตุใดจึงใช้สแน็ปช็อตและสิ่งที่ปกป้องและไม่ป้องกัน:

  • สแน็ปช็อตถูกสร้างขึ้นเพื่อให้คัดลอกข้อมูลทั้งหมดเหมือนเดิมในเวลาที่สแน็ปช็อตถูกสร้างขึ้น กิจกรรมบนไดรฟ์ข้อมูลต้นฉบับในระหว่างกระบวนการคัดลอกจะไม่ปรากฏในสำเนา

  • สแน็ปช็อตยังป้องกันโวลุ่มต้นฉบับจากข้อผิดพลาดของมนุษย์ในddบรรทัดคำสั่ง หากคุณเขียนไปยังสแนปชอตโดยไม่ตั้งใจข้อมูลของสแน็ปช็อตเท่านั้นที่จะเสียหายและคุณสามารถลบสแน็ปช็อตแล้วเริ่มใหม่

  • ปริมาณเป้าหมายไม่ได้รับการป้องกันในระหว่างกระบวนการคัดลอก หากผู้ดูแลระบบรายอื่น (หรือกระบวนการอัตโนมัติเช่น os-prober ของdracut) เมานต์โวลุ่มที่ไม่สมบูรณ์เมานต์อาจทำให้สกรูขึ้น (แม้การเมาต์แบบอ่านอย่างเดียวอาจยังคงเขียนรายการบันทึกลงในไดรฟ์ข้อมูลได้)


2

ฉันจะเสนอตัวเอง:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

หากทุกอย่างดีเอาแหล่งที่มา

lvremove vgsource/lv0

เกิดอะไรขึ้นถ้าไดรฟ์ข้อมูลต้นฉบับมีขนาดใหญ่มากและบริการหรือระบบไม่ควรหยุดทำงาน
Znik

0

หากคุณต้องการที่จะคัดลอกปริมาณตรรกะจาก VG A ไป B อีก VG partcloneผมพบว่าตัวแปรที่น่าสนใจโดยใช้ สแนปชอตจากนั้นคัดลอกด้วย dd เป็นวิธีการที่ดี แต่อาจช้าถ้าระบบไฟล์ของคุณไม่เต็ม วิธีนี้เร็วมากเพราะคัดลอกเฉพาะบล็อคที่ใช้

  1. ขั้นแรกให้สร้างสแน็ปช็อตของ LV ต้นทาง
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

--sizeนี่คือวิธีการเขียนมากสามารถเกิดขึ้นก่อนที่ภาพรวมจะเป็นคนพิการ

  1. สร้าง LV ปลายทางใน VG ปลายทาง
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size อย่างน้อยต้องมีขนาดของแหล่งข้อมูล LV

  1. คัดลอกระบบไฟล์จากการสำรองข้อมูล lv ต้นทางไปยัง LV ปลายทาง
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typeสามารถext4, fat32, btrfs, xfs... FS ใด ๆ ที่ได้รับการสนับสนุนโดย partclone

  1. ลบสแนปชอต
lvremove /dev/sourcevg/lv-backup
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.