Jean-Pierre Ribeauville
2015-Aug-27 13:48 UTC
[libvirt-users] Using unix-type channel ....
Hi, I'm trying to use unix-type channel to send/receive datas between host and guest . Here are the steps I follow : 1) Adding these lines to expose a channel unix type to my guest <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> <alias name='channel0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> 2) the VM_Orion-1 Guest, exposing a channel "unix" omnivision_1.agent is started, then netstat shows these new things : netstat -apn | grep qemu unix 2 [ ACC ] STREAM LISTENING 37214 19124/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 37219 19124/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 37242 19124/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 37240 19124/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor 3) I start , on the host , a simple test in order to send datas to the guest: ..... sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); return(1); } server.sun_family = AF_UNIX; strcpy(server.sun_path, argv[1]); printf("connecting to socket number : %d \n",sock); fflush(stdout); if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { close(sock); perror("connecting stream socket"); return(1); } printf("writing data on stream socket"); if (write(sock, DATA, sizeof(DATA)) < 0) perror("writing on stream socket"); close(sock); ..... 4) invoking > test "/var/lib/libvirt/qemu/omnivision_1.agent" then I got : connecting to socket number : 3 writing data on stream socket and following netstat result : netstat -apn | grep qemu unix 2 [ ACC ] STREAM LISTENING 39348 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 39353 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39375 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39373 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor 5) if I try to re-invoke test "/var/lib/libvirt/qemu/omnivision_1.agent" then : netstat -apn | grep qemu tcp 0 0 127.0.0.1:5902 0.0.0.0:* LISTEN 20587/qemu-kvm tcp 0 0 127.0.0.1:5902 127.0.0.1:57772 ESTABLISHED 20587/qemu-kvm unix 2 [ ACC ] STREAM LISTENING 39348 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor unix 2 [ ACC ] STREAM LISTENING 39353 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 2 [ ] STREAM CONNECTING 0 - /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39375 20587/qemu-kvm /var/lib/libvirt/qemu/omnivision_1.agent unix 3 [ ] STREAM CONNECTED 39373 20587/qemu-kvm /var/lib/libvirt/qemu/VM_Orion-1.monitor on the guest side , I try to retrieve datas sent by host , by using this kind of thing : ... int fd = open("/dev/virtio-ports/org.qemu.guest_agent.0", O_RDWR | O_NONBLOCK); ssize_t size = read(fd, &buffer, 100); ... As you can imagine , I never receive any data from the host . Is it the right way to use this "unix-type" channel ? Thx for your patience. Regards, J.P. Ribeauville P: +33.(0).1.47.17.27.87 Puteaux 3 Etage 5 Bureau 4 jpribeauville@axway.com<mailto:jpribeauville@axway.com> http://www.axway.com<http://www.axway.com/> P Pensez à l'environnement avant d'imprimer.
On 27.08.2015 15:48, Jean-Pierre Ribeauville wrote:> Hi, > > I'm trying to use unix-type channel to send/receive datas between host and guest . > > Here are the steps I follow : > > 1) Adding these lines to expose a channel unix type to my guest > <channel type='unix'> > <source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/> > <target type='virtio' name='org.qemu.guest_agent.0'/> > <alias name='channel0'/> > <address type='virtio-serial' controller='0' bus='0' port='2'/> > </channel> >This won't fly. A channel with that name is special. It's guest agent socket that libvirt automatically connects to once domain is starting up. You need to provide a different name and everything should just work. Michal
On 28.08.2015 08:34, Jean-Pierre Ribeauville wrote:> HI, > > > > Thx for your hint. > > > > I've tried this instead : > > > > <channel type='unix'> > > <source mode='bind' path='/opt/omnivision_1.agent'/> > > <target type='virtio' name='omnivision_1.agent'/> > > <address type='virtio-serial' controller='0' bus='0' port='2'/> > > </channel> > > > > Then, when starting the Guest I get this error message :[It's better to send just text via e-mail] So, the error message is telling you, that qemu process does not have enough permissions to bind to the unix socket under the given path. Either you should level up qemu permissions (e.g. run it as root), or use path that qemu will have access to. Or set correct permissions on the socket target. Michal
Jean-Pierre Ribeauville
2015-Aug-28 06:45 UTC
Re: [libvirt-users] Using unix-type channel ....
Hi, Thx for your hint. I've tried this instead : <channel type='unix'> <source mode='bind' path='/opt/omnivision_1.agent'/> <target type='virtio' name='omnivision_1.agent'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> Then, when starting the Guest I get a pop up window showing this error message : Error starting domain : internal error : process exited while connecting to monitor Quemu-kvm -chardev socket id=channel1,path=/opt/omnivision_1_agent,server,nowait Failed to bind socket : Permission denied Did I miss something ? Regards, J.P. -----Message d'origine----- De : Michal Privoznik [mailto:mprivozn@redhat.com] Envoyé : vendredi 28 août 2015 06:28 À : Jean-Pierre Ribeauville; libvirt-users@redhat.com<mailto:libvirt-users@redhat.com> Objet : Re: [libvirt-users] Using unix-type channel .... On 27.08.2015 15:48, Jean-Pierre Ribeauville wrote:> Hi,>> I'm trying to use unix-type channel to send/receive datas between host and guest .>> Here are the steps I follow :>> 1) Adding these lines to expose a channel unix type to my guest> <channel type='unix'>> <source mode='bind' path='/var/lib/libvirt/qemu/omnivision_1.agent'/>> <target type='virtio' name='org.qemu.guest_agent.0'/>> <alias name='channel0'/>> <address type='virtio-serial' controller='0' bus='0' port='2'/>> </channel>>This won't fly. A channel with that name is special. It's guest agent socket that libvirt automatically connects to once domain is starting up. You need to provide a different name and everything should just work. Michal
Jean-Pierre Ribeauville
2015-Aug-28 07:57 UTC
Re: [libvirt-users] Using unix-type channel ....
Hi, By using an "qemu" accessible path , bi -directional exchanges are working fine. Thx for help. J.P. -----Message d'origine----- De : Michal Privoznik [mailto:mprivozn@redhat.com] Envoyé : vendredi 28 août 2015 08:41 À : Jean-Pierre Ribeauville; libvirt-users@redhat.com Objet : Re: [libvirt-users] Using unix-type channel .... On 28.08.2015 08:34, Jean-Pierre Ribeauville wrote:> HI, > > > > Thx for your hint. > > > > I've tried this instead : > > > > <channel type='unix'> > > <source mode='bind' path='/opt/omnivision_1.agent'/> > > <target type='virtio' name='omnivision_1.agent'/> > > <address type='virtio-serial' controller='0' bus='0' port='2'/> > > </channel> > > > > Then, when starting the Guest I get this error message :[It's better to send just text via e-mail] So, the error message is telling you, that qemu process does not have enough permissions to bind to the unix socket under the given path. Either you should level up qemu permissions (e.g. run it as root), or use path that qemu will have access to. Or set correct permissions on the socket target. Michal