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


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
| improve this answer | |
  • 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
  • 1
    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
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

| improve this answer | |

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.

| improve this answer | |
  • +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. – Paused until further notice. Oct 26 '16 at 18:36
  • in other words, you also have to 1) rename /var/lib/libvirt/images/oldname.qcow2 in /var/lib/libvirt/images/newname.qcow2 ; and 2) edit /etc/libvirt/qemu/newname.xml to set the correct source file balise <source file='/var/lib/libvirt/images/newname.qcow2' – MaxiReglisse Jun 28 '19 at 13:44
  • but only if you need the filenames to match the domainnames (which I admit, is convenient) - this avoids a destroy/create cycle, though still requires a stop (and no snapshots) – reedstrm Jul 1 '19 at 20:24

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
| improve this answer | |

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

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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