Shawn Anastasio
2019-Mar-01 01:31 UTC
[libvirt-users] Obtaining the PID of a domain's QEMU process from C
Hello all, I'm currently writing a C program that uses the libvirt API and I need a way to obtain the pid of a given domain's QEMU process. Specifically, I'm writing an ivshmem server that uses SO_PEERCRED to get the pid of clients that connect to it, and I would like to use that pid to look up the domain in libvirt to determine the proper domain ID to return to the client. As far as I can tell, libvirt doesn't expose this information in an easy to access manner. Of course it is possible to call `ps` and grep for the information I'm looking for, but I was hoping for a cleaner solution. If anybody knows how to do this, advice would be greatly appreciated. Thanks in advance, Shawn
Cole Robinson
2019-Mar-08 19:00 UTC
Re: [libvirt-users] Obtaining the PID of a domain's QEMU process from C
On 2/28/19 8:31 PM, Shawn Anastasio wrote:> Hello all, > > I'm currently writing a C program that uses the libvirt API and I need a > way to obtain the pid of a given domain's QEMU process. > > Specifically, I'm writing an ivshmem server that uses SO_PEERCRED to get > the pid of clients that connect to it, and I would like to use that pid > to look up the domain in libvirt to determine the proper domain ID to > return to the client. > > As far as I can tell, libvirt doesn't expose this information in an easy > to access manner. Of course it is possible to call `ps` and grep for the > information I'm looking for, but I was hoping for a cleaner solution. > > If anybody knows how to do this, advice would be greatly appreciated. > > Thanks in advance,There isn't any libvirt API for getting the qemu pid, so I think going outside libvirt is your only option - Cole
Michal Prívozník
2019-Mar-09 15:32 UTC
Re: [libvirt-users] Obtaining the PID of a domain's QEMU process from C
On 3/1/19 2:31 AM, Shawn Anastasio wrote:> Hello all, > > I'm currently writing a C program that uses the libvirt API and I need a > way to obtain the pid of a given domain's QEMU process. > > Specifically, I'm writing an ivshmem server that uses SO_PEERCRED to get > the pid of clients that connect to it, and I would like to use that pid > to look up the domain in libvirt to determine the proper domain ID to > return to the client. > > As far as I can tell, libvirt doesn't expose this information in an easy > to access manner. Of course it is possible to call `ps` and grep for the > information I'm looking for, but I was hoping for a cleaner solution. > > If anybody knows how to do this, advice would be greatly appreciated.There isn't an API for that as we don't want users to fiddle with qemu behid its back. Anyway, apart from ps there might be a solution. Libvirt of course know the PID and stores it - in the status XML. This is a file that libvirt uses to store runtime information for the domain in case the daemon restarts. It's located under /var/run/libvirt/qemu/$domain.xml. But you'll need root priviledges to read it. Also, it is very wise to follow the comment at the beginning of the file and not modify it ;-) And just like with any libvirt internals, we make no guarantees they won't change in the long run. Michal
Shawn Anastasio
2019-Mar-09 17:26 UTC
Re: [libvirt-users] Obtaining the PID of a domain's QEMU process from C
Thanks for the response. /var/run/libvirt/qemu/ seems to be exactly what I'm looking for. It would, however, be nice to be able to access this file without root privileges. Is there any way to access the file using the credentials from a connected virConnectPtr? If not, I can stick to my current workaround of walking /proc and scanning each PID's cmdline for the VM's UUID string. Thanks, Shawn On 3/9/19 9:32 AM, Michal Prívozník wrote:> On 3/1/19 2:31 AM, Shawn Anastasio wrote: >> Hello all, >> >> I'm currently writing a C program that uses the libvirt API and I need a >> way to obtain the pid of a given domain's QEMU process. >> >> Specifically, I'm writing an ivshmem server that uses SO_PEERCRED to get >> the pid of clients that connect to it, and I would like to use that pid >> to look up the domain in libvirt to determine the proper domain ID to >> return to the client. >> >> As far as I can tell, libvirt doesn't expose this information in an easy >> to access manner. Of course it is possible to call `ps` and grep for the >> information I'm looking for, but I was hoping for a cleaner solution. >> >> If anybody knows how to do this, advice would be greatly appreciated. > > There isn't an API for that as we don't want users to fiddle with qemu > behid its back. Anyway, apart from ps there might be a solution. Libvirt > of course know the PID and stores it - in the status XML. This is a file > that libvirt uses to store runtime information for the domain in case > the daemon restarts. It's located under > /var/run/libvirt/qemu/$domain.xml. But you'll need root priviledges to > read it. > > Also, it is very wise to follow the comment at the beginning of the file > and not modify it ;-) And just like with any libvirt internals, we make > no guarantees they won't change in the long run. > > Michal >
Erik Skultety
2019-Mar-11 08:02 UTC
Re: [libvirt-users] Obtaining the PID of a domain's QEMU process from C
On Sat, Mar 09, 2019 at 04:32:00PM +0100, Michal Prívozník wrote:> On 3/1/19 2:31 AM, Shawn Anastasio wrote: > > Hello all, > > > > I'm currently writing a C program that uses the libvirt API and I need a > > way to obtain the pid of a given domain's QEMU process. > > > > Specifically, I'm writing an ivshmem server that uses SO_PEERCRED to get > > the pid of clients that connect to it, and I would like to use that pid > > to look up the domain in libvirt to determine the proper domain ID to > > return to the client. > > > > As far as I can tell, libvirt doesn't expose this information in an easy > > to access manner. Of course it is possible to call `ps` and grep for the > > information I'm looking for, but I was hoping for a cleaner solution. > > > > If anybody knows how to do this, advice would be greatly appreciated. > > There isn't an API for that as we don't want users to fiddle with qemuThat's right, and it should stay that way. On the other hand, the same way we can't prevent anyone from editing /etc/libvirt/qemu/<domain>.xml or /var/run/libvirt/qemu/<domain>.xml or run the 'ps' command or whatever we might as well report the PID as part of virConnectListAllDomains data. I don't have a problem with reporting PIDs in principle, provided it's used for informatory purposes. Having said that, there's the question of why libvirt should report something that it doesn't need to consume, IOW we report machine ID which we can use to control the machine, we also report UUID which we can consume, but we'd do absolutely nothing with the PID besides reporting it. Another thing is that reporting PIDs of machines running on a remote host is quite useless for locally running clients. Erik> behid its back. Anyway, apart from ps there might be a solution. Libvirt > of course know the PID and stores it - in the status XML. This is a file > that libvirt uses to store runtime information for the domain in case > the daemon restarts. It's located under > /var/run/libvirt/qemu/$domain.xml. But you'll need root priviledges to > read it. > > Also, it is very wise to follow the comment at the beginning of the file > and not modify it ;-) And just like with any libvirt internals, we make > no guarantees they won't change in the long run. > > Michal > > _______________________________________________ > libvirt-users mailing list > libvirt-users@redhat.com > https://www.redhat.com/mailman/listinfo/libvirt-users
Apparently Analagous Threads
- Re: Obtaining the PID of a domain's QEMU process from C
- Obtaining the PID of a domain's QEMU process from C
- Re: Obtaining the PID of a domain's QEMU process from C
- Re: Obtaining the PID of a domain's QEMU process from C
- Re: Obtaining the PID of a domain's QEMU process from C