diff --git a/docs/hooks.html.in b/docs/hooks.html.in index 2afdecfe14..411f2ec9bf 100644 --- a/docs/hooks.html.in +++ b/docs/hooks.html.in @@ -2,69 +2,184 @@
Libvirt includes synchronous hooks, starting from version 0.8.0, as a - way to tie in specific tailored system actions at a specific time. - If these scripts are present on the host where the hypervisor - is running, then they are called when the libvirt daemon is doingi - some significant action.
-The scripts are expected to execute quickly, return a zero exit - status if all conditions are set for the daemon to continue the - action (non zero will be considered a failure which may - be ignored but in general will stop the ongoing operation). - The script also should not call back into libvirt as the daemon - is waiting for the script exit and deadlock is likely to occur.
-The scripts are stored in the directory /etc/libvirt/hooks/
- when using a standard installation path
- ($SYSCONF_DIR/libvirt/hooks/
in general).
Each script is given the following command line arguments:
-There are currently scripts for 3 domains of operation: + +
Beginning with libvirt 0.8.0, specific events on a host system will + trigger custom scripts.
+These custom hook scripts are executed when any of the following + actions occur:
/etc/libvirt/hooks/daemon
script if
- present is called at 3 points in time:
at daemon startup, typically started with the following - arguments:
-/etc/libvirt/hooks/daemon - start - start-
at daemon shutdown when it is about to exit, with the following - arguments:
-/etc/libvirt/hooks/daemon - shutdown - shutdown-
When the daemon is asked to reload its driver state when - receiving the SIGHUP signal, arguments are:
-/etc/libvirt/hooks/daemon - reload begin SIGHUP-
/etc/libvirt/hooks/qemu
script and
- /etc/libvirt/hooks/lxc
associate hooks for domain
- operation on the respective QEmu/KVM and LXC drivers.
The domain related hooks also receive the full XML description - for the concerned domain on their stdin, which allows them to get - all the information from the domain, including UUID or storage - if that is needed for the script operation.
- Currently only domain startup and domain end operations
- involve the hook, the first one just before the domain gets
- created.
- For example if starting a QEmu domain named test
- the following script will get called:
/etc/libvirt/hooks/qemu test start begin --
note that a non-zero return value from the script will abort the - domain startup operation, and if an error string is passed on - stderr by the hook script, it will be provided back to the user - at the libvirt API level.
-For domain shutdown, the script will be called just after the - domain has finished execution, and the script will get:
-/etc/libvirt/hooks/qemu test stopped end --
It is expected that other operations will be associated to hooks - but at the time of 0.8.0 only those 2 are associated to the - domains life cycle
-The libvirt hook scripts are located in the directory
+ $SYSCONF_DIR/libvirt/hooks/
.
/etc/libvirt/hooks/
. Other Linux distributions may do
+ this differently./usr/local/etc/libvirt/hooks/
.To use hook scripts, you will need to create this hooks
+ directory manually, place the desired hook scripts inside, then make
+ them executable.
At present, there are three hook scripts that can be called:
+/etc/libvirt/hooks/daemon
/etc/libvirt/hooks/qemu
/etc/libvirt/hooks/lxc
The hook scripts are executed using standard Linux process creation + functions. Therefore, they must begin with the declaration of the + command interpreter to use.
+For example:
+#!/bin/bash+
or:
+#!/usr/bin/python+
Other command interpreters are equally valid, as is any executable + binary, so you are welcome to use your favourite languages.
+The hook scripts are called with specific command line arguments, + depending upon the script, and the operation being performed.
+The guest hook scripts, qemu and lxc, are also given the full + XML description for the domain on their stdin. This includes items + such the UUID of the domain and its storage information, and is + intended to provide all the libvirt information the script needs.
+ +The command line arguments take this approach:
+This translates to the following specifics for each hook script:
+ +/etc/libvirt/hooks/daemon - start - start
/etc/libvirt/hooks/daemon - shutdown - shutdown
/etc/libvirt/hooks/daemon - reload begin SIGHUP
Please note that when the libvirt daemon is restarted, the qemu + hook script is called once with the "shutdown" operation, and then once + with the "start" operation. There is no specific operation to indicate + a "restart" is occurring.
+ +/etc/libvirt/hooks/qemu guest_name start begin -
/etc/libvirt/hooks/qemu guest_name stopped end -
/etc/libvirt/hooks/lxc guest_name start begin -
/etc/libvirt/hooks/lxc guest_name stopped end -
Migration of a QEMU guest involves running hook scripts on both the + source and destination hosts:
+DO NOT DO THIS!
+A hook script must not call back into libvirt, as the libvirt daemon + is already waiting for the script to exit.
+A deadlock is likely to occur.
+If a hook script returns with an exit code of 0, the libvirt daemon + regards this as successful and performs no logging of it.
+However, if a hook script returns with a non zero exit code, the libvirt + daemon regards this as a failure, logs it with return code 256, and + additionally logs anything on stderr the hook script returns.
+For example, a hook script might use this code to indicate failure, + and send a text string to stderr:
+echo "Could not find required XYZZY" >&2 +exit 1+
The resulting entry in the libvirt log will appear as:
+20:02:40.297: error : virHookCall:416 : Hook script execution failed: Hook script /etc/libvirt/hooks/qemu qemu failed with error code 256:Could not find required XYZZY