24

How can I rename a VM on KVM+libvirt?

I would like it to change the name in the 'inventory' as well as change the name of the storage etc.

  • 3
    after I asked this question the fine folks on the libvirt project have added the 'virsh edit my-vm-name' command. – Arthur Ulfeldt Nov 29 '11 at 7:37
18

run

virsh dumpxml name_of_vm > name_of_vm.xml

Undefine the old vm to prevent an error because of an duplicate UUID.

virsh undefine name-of-vm

Edit the xml file then import it.

virsh define name_of_vm.xml

Of course you will have to stop and start the vm for the changes to take effect

virsh destroy name_of_vm
virsh start name_of_vm
  • 5
    need to add one step: (before defining the vm with the new name) "virsh undefine name-of-vm" otherwise it complains about duplicate UUID. – Arthur Ulfeldt Nov 18 '10 at 17:12
  • i also had to rename the hd.img file and edit the line in the xml file – Arthur Ulfeldt Nov 18 '10 at 18:45
  • Correct order is in the other answer. You don't have to rename img if you don't use the old machine. – Nux Oct 8 '12 at 9:28
  • 1
    This answer is now out of date. See my answer below. tldr; virsh now has domrename. – reedstrm Sep 2 '16 at 16:06
15
virsh dumpxml myvm > foo.xml
<edit foo.xml, change the name, move storage>
virsh undefine myvm
virsh define foo.xml

Source: https://www.redhat.com/archives/libvirt-users/2010-October/msg00072.html

10

virsh implemented domrename in release 1.2.19: Sep 02 2015. So the current best practice is just:

 virsh domrename oldname newname

As you might expect, thedomain must be stopped, but also it cannot have any snapshots.

  • +1 - you can virsh edit newname and change the file path and mv oldname newname to rename the directory if you want everything to match. – Dennis Williamson Oct 26 '16 at 18:36
5

To change many machines you can use this:

virsh shutdown old-name

Wait for above to finish and run:

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

Wait for above to finish and run:

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

Run this one-by-one for each machine. You can use this RegExp if you have a list containing 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

I do it little differently and may be un-recommended method (not sure).

virsh destroy old-vm virsh edit old-vm

In the XML change

  1. domain name old-vm to new-vm
  2. change a char/digit in UUID save and exit.

virsh list --all

1 old-vm shut-off

2 new-vm shut-off

Now undefine the old-vm

virsh undefine old-vm

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.