[libvirt-users] Detach disk from VM - virsh (working) vs. PHP (not working)

Michal Privoznik mprivozn at redhat.com
Fri Aug 2 12:15:43 UTC 2019


On 8/1/19 10:12 AM, Jan Horak wrote:
> Hi all,
> 
> i created a script in PHP for create a virtual server with two QCOW2 discs … one is our system for installation and second is target system.
> 
> After successfully instalation (create a blank Debian system, prepare all files and grub partitions) i need a restart virtual without a installation disk.
> 
> If i use Virsh:
> 
> detach-disk --domain debian-test2 --persistent --target vda
> reset debian-test2
> 
> everything works well.
> 
> If i use a PHP, there is „complicated“ way and „simple“ way:
> 
> 1, complicated:
> 
> libvirt_domain_destroy($domain);
> libvirt_domain_undefine($domain);
> 
> $xml = domain_create_xml($name,$uuid,$memory,$cpu,$vnc,$mac);
> $domain = libvirt_domain_define_xml($server->conn, $xml);
> libvirt_domain_disk_add($domain, "/users/".$name.".img", "vdb", "virtio", "qcow2", NULL);
> libvirt_domain_create($domain);
> 
> (or instead libvirt_domain_disk_add i can define disk directly in XML)
> 
> But in this case, the server will not boot (GRUB error)

Question is, how GRUB refers to the disk where kernel is to be found. 
Also, I suspect it is not GRUB that is complaining, but SeaBIOS which 
hasn't found any bootable device. It's only an assumption becasue I 
don't know how domain_create_xml() works - it's not a libvirt-php 
function. There are two possibilities here:

1) make sure domain_create_xml() sets boot devices
2) construct disk XML yourself, and put "<boot order='N'/>" into it

> 
> 2, simple:
> 
> libvirt_domain_disk_remove($domain,“vda“);
> libvirt_domain_reboot($domain);
> 
> The problem of this solution is thats not working. The remove disk is failing with error „Unable attach disk“ - i looks to source code, and yes, there is a mystake with „attach“/„detach“, but main problem i see in log from libvirt:

Oh, that's only typo in the error message. In fact the detach API is 
called. And it fails.

> 
> Aug  1 02:57:05 ry libvirtd[19051]: missing source information for device vda
> 
> I try to put source detail to xml in source of PHP module
> 
> libvirt-domain.c:
> 
>    822	    if (asprintf(&newXml,
>    823	                 "    <disk type='file' device='disk'>\n"
>    824	                 "      <target dev='%s'/>\n"
>    825	                 "    </disk>", dev) < 0) {
>    826	        set_error("Out of memory" TSRMLS_CC);
>    827	        goto error;
>    828	    }
> 
> but my attempts was unsuccesfull (i’m not C programmer).

Yes, this minimalistic XML is not good as detach API requires full 
device XML. I'll fix this soon.

> 
> Questions:
> 
> A, why complicated way is not working and system dont want boot (GRUB error) if virsh works fine
> B, why libvirt_domain_disk_remove is not work ? I use libvirt and libvirt-php latest from git.

I've pushed fixes here:


Please give it a try.

Michal




More information about the libvirt-users mailing list