On Tue, Jul 30, 2019 at 12:13:30PM +0200, Christophe de Dinechin wrote: > > > > On 30 Jul 2019, at 11:38, Daniel P. Berrangé <berrange@xxxxxxxxxx> wrote: > > > > On Tue, Jul 30, 2019 at 11:05:25AM +0200, Christophe de Dinechin wrote: > >> > >> Daniel P. Berrangé writes: > >> > >>> This is what all the driver refactoring I've done has been about > >>> enabling. > >>> > >>> We gain new daemons for each driver, for the primary virt drivers: > >>> > >>> virtlibxld > >> > >> virtxend? > >> > >>> virtlxcd > >>> virtqemud > >>> virtvboxd > >>> virtvzd > >>> > >>> And again for the secondary drivers > >>> > >>> virtinterfaced > >>> virtnetworkd > >>> virtnodedevd > >>> virtnwfilterd > >>> virtsecretd > >>> virtstoraged > >>> > >>> Finally to support IP connectivity, and also the legacy lbivirtd UNIX > >>> domain socket (for the old libvirt remote driver SSH tunnelling): > >>> > >>> virtproxyd > >>> > >>> The the sake of facilitating upgrades, the existing libvirtd still > >>> exists and works the same way it always has. > >>> > >>> You either run libvirtd, or you run the per-driver daemons, never both. > >> > >> What happens if you run both? > >> (I'll try to figure out by reviewing the rest of the code and/or testing) > > > > The drivers acquire an exclusive lock, causing the 2nd daemon to fail > > to startup > > > > $ ./src/libvirtd & > > > > $ ./src/virtqemud > > 2019-07-30 09:36:34.339+0000: 22809: info : libvirt version: 5.6.0 > > 2019-07-30 09:36:34.339+0000: 22809: info : hostname: dhcp-16-132.lcy.redhat.com > > 2019-07-30 09:36:34.339+0000: 22809: error : virPidFileAcquirePath:376 : Failed to acquire pid file '/run/user/501/libvirt/qemu/run/driver.pid': Resource temporarily unavailable > > 2019-07-30 09:36:34.339+0000: 22809: error : virStateInitialize:688 : Initialisation of QEMU state driver failed: Failed to acquire pid file '/run/user/501/libvirt/qemu/run/driver.pid': Resource temporarily unavailable > > 2019-07-30 09:36:34.339+0000: 22809: error : daemonRunStateInit:821 : Driver state initialisation failed > > > > > > The same works the other way around too > > > > $ ./src/virtqemud & > > > > $ ./src/libvirtd > > 2019-07-30 09:37:45.398+0000: 23109: info : libvirt version: 5.6.0 > > 2019-07-30 09:37:45.398+0000: 23109: info : hostname: dhcp-16-132.lcy.redhat.com > > 2019-07-30 09:37:45.398+0000: 23109: error : virPidFileAcquirePath:376 : Failed to acquire pid file '/run/user/501/libvirt/qemu/run/driver.pid': Resource temporarily unavailable > > 2019-07-30 09:37:45.398+0000: 23109: error : virStateInitialize:688 : Initialisation of QEMU state driver failed: Failed to acquire pid file '/run/user/501/libvirt/qemu/run/driver.pid': Resource temporarily unavailable > > 2019-07-30 09:37:45.398+0000: 23109: error : daemonRunStateInit:821 : Driver state initialisation failed > > > > > > > > the systemd unit files also have Conflicts rules which should prevent > > even getting that far > > Thanks for testing. But that can only work for one deamon which shares the lock file > name with libvirtd. What about the other drivers? I guess they can’t all share the > same lock file, or I missed something big in the design. Libvirt has many drivers (qemu, lxc, bhyve, libxl, storage, network). Each one of these acquires its own lock file under its own private directory - either /var/run/libvirt/$DRIVERNAME/driver.pid (as root) or /run/user/$UID/libvirt/$DRIVERNAME/run/driver.pid (as non-root). Libvirtd loads all the drivers, so will end up holding a lock for every driver it has loaded. Each new driver only loads a single driver and so will hold a single lock. The daemons themselves also hold their own locks to prevent the same daemon being started twice. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list