[libvirt] [PATCH] RFC: experimental libvirtd upstart job

From: Alan Pevec <apevec@redhat.com> To install it, disable libvirtd sysv initscript: chkconfig libvirtd off service libvirtd stop and enable libvirtd upstart job: cp /usr/share/doc/libvirt-*/libvirtd.upstart \ /etc/init/libvirtd.conf initctl reload-configuration initctl start libvirtd Test: initctl status libvirtd libvirtd start/running, process 3929 killall -9 libvirtd initctl status libvirtd libvirtd start/running, process 4047 --- daemon/Makefile.am | 1 + daemon/libvirtd.upstart | 47 +++++++++++++++++++++++++++++++++++++++++++++++ libvirt.spec.in | 1 + 3 files changed, 49 insertions(+), 0 deletions(-) create mode 100644 daemon/libvirtd.upstart diff --git a/daemon/Makefile.am b/daemon/Makefile.am index cdf0f75..a4ebcf8 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -27,6 +27,7 @@ EXTRA_DIST = \ remote_generate_stubs.pl \ libvirtd.conf \ libvirtd.init.in \ + libvirtd.upstart \ libvirtd.policy-0 \ libvirtd.policy-1 \ libvirtd.sasl \ diff --git a/daemon/libvirtd.upstart b/daemon/libvirtd.upstart new file mode 100644 index 0000000..40d5fa3 --- /dev/null +++ b/daemon/libvirtd.upstart @@ -0,0 +1,47 @@ +# libvirtd upstart job +# +# XXX wait for rc to get all dependent initscripts started +# from sysv libvirtd initscript: Required-Start: $network messagebus +start on stopped rc RUNLEVEL=[345] +stop on runlevel [016] +respawn +# default rate limit is 10x/5s +#respawn limit 10 5 + +# DAEMON_COREFILE_LIMIT in /etc/sysconfig/libvirtd doesn't have effect +# must set resource limits here +#limit core unlimited unlimited + +# documented http://upstart.ubuntu.com/wiki/Stanzas#pid +# but not accepted by upstart-0.6.5 +#pid file /var/run/libvirtd.pid + +env PIDFILE=/var/run/libvirtd.pid + +script + LIBVIRTD_CONFIG= + LIBVIRTD_ARGS= + KRB5_KTNAME=/etc/libvirt/krb5.tab + + test -f /etc/sysconfig/libvirtd && . /etc/sysconfig/libvirtd + + export QEMU_AUDIO_DRV + export SDL_AUDIODRIVER + + LIBVIRTD_CONFIG_ARGS= + if [ -n "$LIBVIRTD_CONFIG" ] + then + LIBVIRTD_CONFIG_ARGS="--config $LIBVIRTD_CONFIG" + else + true + fi + + mkdir -p /var/cache/libvirt + rm -rf /var/cache/libvirt/* + KRB5_KTNAME=$KRB5_KTNAME /usr/sbin/libvirtd $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS +end script + +post-stop script + rm -f $PIDFILE + rm -rf /var/cache/libvirt/* +end script diff --git a/libvirt.spec.in b/libvirt.spec.in index a29693a..365000c 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -854,6 +854,7 @@ fi %{_sysconfdir}/libvirt/nwfilter/*.xml %{_sysconfdir}/rc.d/init.d/libvirtd +%doc daemon/libvirtd.upstart %config(noreplace) %{_sysconfdir}/sysconfig/libvirtd %config(noreplace) %{_sysconfdir}/libvirt/libvirtd.conf %if %{with_dtrace} -- 1.7.3.4

Quoting apevec@gmail.com (apevec@gmail.com):
From: Alan Pevec <apevec@redhat.com>
To install it, disable libvirtd sysv initscript: chkconfig libvirtd off service libvirtd stop
and enable libvirtd upstart job: cp /usr/share/doc/libvirt-*/libvirtd.upstart \ /etc/init/libvirtd.conf initctl reload-configuration initctl start libvirtd
Test: initctl status libvirtd libvirtd start/running, process 3929 killall -9 libvirtd initctl status libvirtd libvirtd start/running, process 4047 --- daemon/Makefile.am | 1 + daemon/libvirtd.upstart | 47 +++++++++++++++++++++++++++++++++++++++++++++++ libvirt.spec.in | 1 + 3 files changed, 49 insertions(+), 0 deletions(-) create mode 100644 daemon/libvirtd.upstart
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index cdf0f75..a4ebcf8 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -27,6 +27,7 @@ EXTRA_DIST = \ remote_generate_stubs.pl \ libvirtd.conf \ libvirtd.init.in \ + libvirtd.upstart \ libvirtd.policy-0 \ libvirtd.policy-1 \ libvirtd.sasl \ diff --git a/daemon/libvirtd.upstart b/daemon/libvirtd.upstart new file mode 100644 index 0000000..40d5fa3 --- /dev/null +++ b/daemon/libvirtd.upstart @@ -0,0 +1,47 @@ +# libvirtd upstart job +# +# XXX wait for rc to get all dependent initscripts started +# from sysv libvirtd initscript: Required-Start: $network messagebus +start on stopped rc RUNLEVEL=[345] +stop on runlevel [016] +respawn +# default rate limit is 10x/5s +#respawn limit 10 5 + +# DAEMON_COREFILE_LIMIT in /etc/sysconfig/libvirtd doesn't have effect +# must set resource limits here +#limit core unlimited unlimited + +# documented http://upstart.ubuntu.com/wiki/Stanzas#pid +# but not accepted by upstart-0.6.5 +#pid file /var/run/libvirtd.pid + +env PIDFILE=/var/run/libvirtd.pid + +script + LIBVIRTD_CONFIG= + LIBVIRTD_ARGS= + KRB5_KTNAME=/etc/libvirt/krb5.tab + + test -f /etc/sysconfig/libvirtd && . /etc/sysconfig/libvirtd + + export QEMU_AUDIO_DRV + export SDL_AUDIODRIVER + + LIBVIRTD_CONFIG_ARGS= + if [ -n "$LIBVIRTD_CONFIG" ] + then + LIBVIRTD_CONFIG_ARGS="--config $LIBVIRTD_CONFIG" + else + true + fi + + mkdir -p /var/cache/libvirt + rm -rf /var/cache/libvirt/* + KRB5_KTNAME=$KRB5_KTNAME /usr/sbin/libvirtd $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS +end script + +post-stop script + rm -f $PIDFILE + rm -rf /var/cache/libvirt/* +end script
Hi, If you're using upstart, then why use your own pidfile? FWIW, attached is the upstart script used in Ubuntu: ============================================= description "libvirt daemon" author "Dustin Kirkland <kirkland@canonical.com>" start on runlevel [2345] stop on runlevel [!2345] expect daemon respawn env libvirtd_opts="-d" env start_libvirtd="yes" pre-start script [ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin [ ! "x$start_libvirtd" = "xyes" ] && { stop; exit 0; } mkdir -p /var/run/libvirt # Clean up a pidfile that might be left around rm -f /var/run/libvirtd.pid end script # If you used to set $libvirtd_opts in /etc/default/libvirt-bin, # change the 'exec' line here instead. exec /usr/sbin/libvirtd $libvirtd_opts ============================================= In order to play nicely with libcgroup, we're also testing the following job to ship with libcgroup: ============================================= # libvirt-cgred-wait start on starting libvirt-bin stop on started cgred or stopped cgred task normal exit 2 script status cgred | grep -q "start/running" && exit 0 start cgred || true sleep 3600 end script ============================================= thanks, -serge

On Fri, Feb 18, 2011 at 03:48:29PM -0600, Serge E. Hallyn wrote:
Quoting apevec@gmail.com (apevec@gmail.com):
From: Alan Pevec <apevec@redhat.com>
To install it, disable libvirtd sysv initscript: chkconfig libvirtd off service libvirtd stop
and enable libvirtd upstart job: cp /usr/share/doc/libvirt-*/libvirtd.upstart \ /etc/init/libvirtd.conf initctl reload-configuration initctl start libvirtd
Test: initctl status libvirtd libvirtd start/running, process 3929 killall -9 libvirtd initctl status libvirtd libvirtd start/running, process 4047 --- daemon/Makefile.am | 1 + daemon/libvirtd.upstart | 47 +++++++++++++++++++++++++++++++++++++++++++++++ libvirt.spec.in | 1 + 3 files changed, 49 insertions(+), 0 deletions(-) create mode 100644 daemon/libvirtd.upstart
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index cdf0f75..a4ebcf8 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -27,6 +27,7 @@ EXTRA_DIST = \ remote_generate_stubs.pl \ libvirtd.conf \ libvirtd.init.in \ + libvirtd.upstart \ libvirtd.policy-0 \ libvirtd.policy-1 \ libvirtd.sasl \ diff --git a/daemon/libvirtd.upstart b/daemon/libvirtd.upstart new file mode 100644 index 0000000..40d5fa3 --- /dev/null +++ b/daemon/libvirtd.upstart @@ -0,0 +1,47 @@ +# libvirtd upstart job +# +# XXX wait for rc to get all dependent initscripts started +# from sysv libvirtd initscript: Required-Start: $network messagebus +start on stopped rc RUNLEVEL=[345] +stop on runlevel [016] +respawn +# default rate limit is 10x/5s +#respawn limit 10 5 + +# DAEMON_COREFILE_LIMIT in /etc/sysconfig/libvirtd doesn't have effect +# must set resource limits here +#limit core unlimited unlimited + +# documented http://upstart.ubuntu.com/wiki/Stanzas#pid +# but not accepted by upstart-0.6.5 +#pid file /var/run/libvirtd.pid + +env PIDFILE=/var/run/libvirtd.pid + +script + LIBVIRTD_CONFIG= + LIBVIRTD_ARGS= + KRB5_KTNAME=/etc/libvirt/krb5.tab + + test -f /etc/sysconfig/libvirtd && . /etc/sysconfig/libvirtd + + export QEMU_AUDIO_DRV + export SDL_AUDIODRIVER + + LIBVIRTD_CONFIG_ARGS= + if [ -n "$LIBVIRTD_CONFIG" ] + then + LIBVIRTD_CONFIG_ARGS="--config $LIBVIRTD_CONFIG" + else + true + fi + + mkdir -p /var/cache/libvirt + rm -rf /var/cache/libvirt/* + KRB5_KTNAME=$KRB5_KTNAME /usr/sbin/libvirtd $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS +end script + +post-stop script + rm -f $PIDFILE + rm -rf /var/cache/libvirt/* +end script
Hi,
If you're using upstart, then why use your own pidfile? FWIW, attached is the upstart script used in Ubuntu:
============================================= description "libvirt daemon" author "Dustin Kirkland <kirkland@canonical.com>"
start on runlevel [2345] stop on runlevel [!2345]
expect daemon respawn
env libvirtd_opts="-d" env start_libvirtd="yes" pre-start script [ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin [ ! "x$start_libvirtd" = "xyes" ] && { stop; exit 0; } mkdir -p /var/run/libvirt # Clean up a pidfile that might be left around rm -f /var/run/libvirtd.pid end script
# If you used to set $libvirtd_opts in /etc/default/libvirt-bin, # change the 'exec' line here instead. exec /usr/sbin/libvirtd $libvirtd_opts =============================================
In order to play nicely with libcgroup, we're also testing the following job to ship with libcgroup:
============================================= # libvirt-cgred-wait start on starting libvirt-bin stop on started cgred or stopped cgred
task normal exit 2 script status cgred | grep -q "start/running" && exit 0 start cgred || true sleep 3600 end script =============================================
FYI, libvirt has no need for the cgred to be present / running, and indeed if you're not careful with the rules you create for cgred it could really mess things up by moving VM proceses to a different cgroup behind libvirt's back. For cgroups integration, libvirt merely requires that something has mounted the various cgroups controllers. The can be mounted in any location, and with any combination of controllers. libvirtd will detect what cgroups it is located in at startup, and create its own cgroups below these points in the hierarchy. On Fedora we do this with the 'cgconfig' init script which more or less just runs 'cgconfigparse -l /etc/cgconfig.conf' to mount the bits Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Quoting Daniel P. Berrange (berrange@redhat.com):
On Fri, Feb 18, 2011 at 03:48:29PM -0600, Serge E. Hallyn wrote:
Quoting apevec@gmail.com (apevec@gmail.com):
From: Alan Pevec <apevec@redhat.com> ============================================= # libvirt-cgred-wait start on starting libvirt-bin stop on started cgred or stopped cgred
task normal exit 2 script status cgred | grep -q "start/running" && exit 0 start cgred || true sleep 3600 end script =============================================
FYI, libvirt has no need for the cgred to be present / running, and
Absolutely. And so the above job ships with the libcgroup package, not with libvirt.
indeed if you're not careful with the rules you create for cgred it could really mess things up by moving VM proceses to a different cgroup behind libvirt's back.
Yes. And with the default rules, if libcgroup is installed *and* if libvirt does not wait until libcgroup is configured at boot, then VMs won't start up. So when just libvirt is installed, the above job is not needed (and not installed on the machine). When just libcgroup is installed, the above job will be installed, but since it starts on 'starting libvirt', it won't ever run if libvirt is not installed.
For cgroups integration, libvirt merely requires that something has mounted the various cgroups controllers. The can be mounted in any location, and with any combination of controllers. libvirtd will detect what cgroups it is located in at startup, and create its own cgroups below these points in the hierarchy.
Yup, I definately don't want to suggest that there is anything wrong with what libvirt does.
On Fedora we do this with the 'cgconfig' init script which more or less just runs 'cgconfigparse -l /etc/cgconfig.conf' to mount the bits
Right, and the above job just makes sure that the above has finished before libvirt starts. thanks, -serge
participants (3)
-
apevec@gmail.com
-
Daniel P. Berrange
-
Serge E. Hallyn