วิธีเปลี่ยนชื่อ VM โดยใช้ libvirt + KVM


24

ฉันจะเปลี่ยนชื่อ VM บน KVM + libvirt ได้อย่างไร

ฉันต้องการเปลี่ยนชื่อใน 'สินค้าคงคลัง' รวมถึงเปลี่ยนชื่อของที่เก็บข้อมูลเป็นต้น


3
หลังจากที่ฉันถามคำถามนี้คนดีในโครงการ libvirt ได้เพิ่มคำสั่ง 'virsh edit my-vm-name'
Arthur Ulfeldt

คำตอบ:


18

วิ่ง

virsh dumpxml name_of_vm > name_of_vm.xml

ยกเลิกการกำหนด vm เก่าเพื่อป้องกันข้อผิดพลาดเนื่องจาก UUID ซ้ำกัน

virsh undefine name-of-vm

แก้ไขไฟล์ xml จากนั้นนำเข้า

virsh define name_of_vm.xml

แน่นอนคุณจะต้องหยุดและเริ่ม vm เพื่อให้การเปลี่ยนแปลงมีผล

virsh destroy name_of_vm
virsh start name_of_vm

5
จำเป็นต้องเพิ่มหนึ่งขั้นตอน: (ก่อนที่จะกำหนด vm ด้วยชื่อใหม่) "virsh undefine name-of-vm" มิฉะนั้นจะบ่นเกี่ยวกับ UUID ที่ซ้ำกัน
Arthur Ulfeldt

1
ฉันยังต้องเปลี่ยนชื่อไฟล์ hd.img และแก้ไขบรรทัดในไฟล์ xml
Arthur Ulfeldt

คำสั่งที่ถูกต้องอยู่ในคำตอบอื่น ๆ คุณไม่ต้องเปลี่ยนชื่อ img หากคุณไม่ได้ใช้เครื่องเก่า
Nux

1
คำตอบนี้ล้าสมัยแล้ว ดูคำตอบของฉันด้านล่าง TLDR; ตอนนี้ virsh มีโดม
reedstrm


13

virshดำเนินการdomrenameในรุ่น 1.2.19: 02 ก.ย. 2015 ดังนั้นแนวปฏิบัติที่ดีที่สุดในปัจจุบันจึงเป็นเพียง

 virsh domrename oldname newname

อย่างที่คุณคาดไว้โดเมนต้องหยุดทำงาน แต่จะต้องไม่มีสแนปชอตใด ๆ


+1 - คุณสามารถvirsh edit newnameและเปลี่ยนเส้นทางของไฟล์และmv oldname newnameเปลี่ยนชื่อไดเรกทอรีหากคุณต้องการให้ทุกอย่างตรงกัน
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

กล่าวอีกนัยหนึ่งคุณต้องเปลี่ยน 1) /var/lib/libvirt/images/oldname.qcow2 ใน /var/lib/libvirt/images/newname.qcow2; และ 2) แก้ไข /etc/libvirt/qemu/newname.xml เพื่อตั้งค่า balise ซอร์สไฟล์ที่ถูกต้อง <source file = '/ var / lib / libvirt / images / newname.qcow2'
MaxiReglisse

แต่ถ้าคุณต้องการชื่อไฟล์เพื่อให้ตรงกับชื่อโดเมน (ที่ฉันยอมรับสะดวก) - นี่เป็นการหลีกเลี่ยงรอบการทำลาย / สร้าง แต่ก็ยังต้องหยุด (และไม่มีสแนปชอต)
reedstrm

5

หากต้องการเปลี่ยนเครื่องจักรจำนวนมากคุณสามารถใช้สิ่งนี้:

virsh shutdown old-name

รอข้างบนเพื่อเสร็จสิ้นและเรียกใช้:

virsh dumpxml old-name > old-name.xml
virsh undefine old-name

รอข้างบนเพื่อเสร็จสิ้นและเรียกใช้:

sed -i 's/<name>old-name<\/name>/<name>new-name<\/name>/g' old-name.xml
virsh define old-name.xml

เรียกใช้หนึ่งต่อหนึ่งสำหรับแต่ละเครื่อง คุณสามารถใช้ RegExp นี้หากคุณมีรายการที่มีold-name new-name:

([^\r\n]+?)[ \t]+([^\r\n]+)
virsh shutdown $1\n#WAIT!\nvirsh dumpxml $1 > $1.xml\nvirsh undefine $1\n\#WAIT!\nsed -i 's/<name>$1<\\/name>/<name>$2<\\/name>/g' $1.xml\nvirsh define $1.xml\n

0

ฉันทำมันแตกต่างกันเล็กน้อยและอาจเป็นวิธีที่ไม่แนะนำ (ไม่แน่ใจ)

virsh destroy old-vm virsh edit old-vm

ในการเปลี่ยนแปลง XML

  1. ชื่อโดเมน old-vm ถึง new-vm
  2. เปลี่ยนถ่าน / หลักใน UUID บันทึกและออก

virsh list --all

1 old-vm shut-off

2 vm ใหม่ปิด

ตอนนี้ยกเลิกการกำหนดค่า vm เก่า

virsh undefine old-vm

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