โดยทั่วไปฉันต้องการย้าย / คัดลอกโลจิคัลวอลุ่ม (lv) ลงในกลุ่มวอลุ่มใหม่ (vg) กลุ่มวอลุ่มใหม่ตั้งอยู่บนฟิสิคัลวอลุ่มชุดใหม่ ไม่มีใครรู้วิธีการทำอย่างปลอดภัยโดยไม่ทำลายข้อมูลภายในปริมาณตรรกะเหล่านั้นหรือไม่
โดยทั่วไปฉันต้องการย้าย / คัดลอกโลจิคัลวอลุ่ม (lv) ลงในกลุ่มวอลุ่มใหม่ (vg) กลุ่มวอลุ่มใหม่ตั้งอยู่บนฟิสิคัลวอลุ่มชุดใหม่ ไม่มีใครรู้วิธีการทำอย่างปลอดภัยโดยไม่ทำลายข้อมูลภายในปริมาณตรรกะเหล่านั้นหรือไม่
คำตอบ:
vgmergeให้คุณรวมVGสองตัวเข้าด้วยกัน คุณยังสามารถใช้pvmoveเพื่อย้ายข้อมูลภายใน VG และvgsplitหากคุณต้องการกลับไปใช้ VG หลายตัว
ไม่มีเหตุผลที่จะคัดลอกไปยังไฟล์. 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
โอเคฉันสามารถรับมือกับสถานการณ์ด้วยวิธีของฉันเอง นี่คือขั้นตอนที่ฉันทำ:
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
ตามลำดับ
นั่นคือคนทั้งหมด ... หวังว่าจะช่วยให้ใครบางคน :)
ในฐานะของ 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.
คำตอบ 4 ข้อที่ทุกคนคิดถึงว่าขนาดที่แท้จริงของปริมาตรมักจะไม่เป็นที่รู้จัก lvdisplay
แสดงเฉพาะค่าที่ปัดเศษเป็นทศนิยม 2 ตำแหน่งและman lvdisplay
ชี้ไปที่คำสั่งอื่นสำหรับตัวเลือกที่มี ข้อมูลต่อไปนี้เลือก MiB ซึ่งมีความแม่นยำเพียงพอกับขนาดบล็อกเริ่มต้นของ LVM ที่ 4 MiB:
lvdisplay --units m
เอ็มไอยังเป็นหน่วยเริ่มต้นสำหรับการ--size
lvcreate
หากมีข้อสงสัยให้ตรวจสอบขนาดที่ถูกต้องอีกครั้งlvdisplay
หลังจากสร้างปริมาณเป้าหมาย จากนั้นไปข้างหน้าเหมือนในคำตอบอื่น ๆ เพื่อทำสำเนา นอกจากนี้ผมอยากแนะนำให้ไปตรวจสอบการคัดลอกcmp
ตัวอย่างเช่นกับ
เหตุใดจึงใช้สแน็ปช็อตและสิ่งที่ปกป้องและไม่ป้องกัน:
สแน็ปช็อตถูกสร้างขึ้นเพื่อให้คัดลอกข้อมูลทั้งหมดเหมือนเดิมในเวลาที่สแน็ปช็อตถูกสร้างขึ้น กิจกรรมบนไดรฟ์ข้อมูลต้นฉบับในระหว่างกระบวนการคัดลอกจะไม่ปรากฏในสำเนา
สแน็ปช็อตยังป้องกันโวลุ่มต้นฉบับจากข้อผิดพลาดของมนุษย์ในdd
บรรทัดคำสั่ง หากคุณเขียนไปยังสแนปชอตโดยไม่ตั้งใจข้อมูลของสแน็ปช็อตเท่านั้นที่จะเสียหายและคุณสามารถลบสแน็ปช็อตแล้วเริ่มใหม่
ปริมาณเป้าหมายไม่ได้รับการป้องกันในระหว่างกระบวนการคัดลอก หากผู้ดูแลระบบรายอื่น (หรือกระบวนการอัตโนมัติเช่น os-prober ของdracut
) เมานต์โวลุ่มที่ไม่สมบูรณ์เมานต์อาจทำให้สกรูขึ้น (แม้การเมาต์แบบอ่านอย่างเดียวอาจยังคงเขียนรายการบันทึกลงในไดรฟ์ข้อมูลได้)
ฉันจะเสนอตัวเอง:
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
หากคุณต้องการที่จะคัดลอกปริมาณตรรกะจาก VG A ไป B อีก VG partclone
ผมพบว่าตัวแปรที่น่าสนใจโดยใช้ สแนปชอตจากนั้นคัดลอกด้วย dd เป็นวิธีการที่ดี แต่อาจช้าถ้าระบบไฟล์ของคุณไม่เต็ม วิธีนี้เร็วมากเพราะคัดลอกเฉพาะบล็อคที่ใช้
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup
--size
นี่คือวิธีการเขียนมากสามารถเกิดขึ้นก่อนที่ภาพรวมจะเป็นคนพิการ
lvcreate --size <new_lv_size> /dev/destvg --name newlv
new_lv_size
อย่างน้อยต้องมีขนาดของแหล่งข้อมูล LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv
fs_type
สามารถext4
, fat32
, btrfs
, xfs
... FS ใด ๆ ที่ได้รับการสนับสนุนโดย partclone
lvremove /dev/sourcevg/lv-backup