1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-09-22 13:45:17 +03:00

Compare commits

..

76 Commits

Author SHA1 Message Date
Cole Robinson
687c089380 Prep for release 0.9.6.3 2012-10-07 17:49:56 -04:00
Cole Robinson
f527b94607 Merge branch 'v0.9.6-maint' of git://libvirt.org/libvirt into v0.9.6-maint 2012-10-07 17:48:37 -04:00
Martin Kletzander
96d4cd58f5 security: Fix libvirtd crash possibility
Fix for CVE-2012-4423.

When generating RPC protocol messages, it's strictly needed to have a
continuous line of numbers or RPC messages. However in case anyone
tries backporting some functionality and will skip a number, there is
a possibility to make the daemon segfault with newer virsh (version of
the library, rpc call, etc.) even unintentionally.

The problem is that the skipped numbers will get func filled with
NULLs, but there is no check whether these are set before the daemon
tries to run them. This patch very simply enhances one check and fixes
that.
(cherry picked from commit b7ff9e6960)
2012-10-07 17:30:12 -04:00
Martin Kletzander
c84053c2ab security: Fix libvirtd crash possibility
Fix for CVE-2012-4423.

When generating RPC protocol messages, it's strictly needed to have a
continuous line of numbers or RPC messages. However in case anyone
tries backporting some functionality and will skip a number, there is
a possibility to make the daemon segfault with newer virsh (version of
the library, rpc call, etc.) even unintentionally.

The problem is that the skipped numbers will get func filled with
NULLs, but there is no check whether these are set before the daemon
tries to run them. This patch very simply enhances one check and fixes
that.
(cherry picked from commit b7ff9e6960)
2012-09-19 09:09:14 -06:00
Cole Robinson
a1ceef9b42 Prep for release 0.9.6.2 2012-08-13 18:19:51 -04:00
Eric Blake
6cde2d3965 build: drop check for ANSI compiler
Using automake.git (will become 1.12 someday), I got this error:

configure.ac:90: error: automatic de-ANSI-fication support has been removed
/usr/local/share/aclocal-1.11a/protos.m4:13: AM_C_PROTOTYPES is expanded from...
configure.ac:90: the top level
autom4te: /usr/bin/m4 failed with exit status: 1

In short, pre-C89 compilers are no longer a viable portability
target.  Besides, our code base already requires C99, so worrying
about pre-C89 seems pointless.

* configure.ac (AM_C_PROTOTYPES): Drop, since newer automake no
longer provides it.
(cherry picked from commit 307f363509)
2012-08-12 20:54:05 -04:00
Eric Blake
2f809dba2c tests: avoid seclabeltest crash
Commit a56c347 introduced a use of random numbers into seclabel
handling, but failed to initialize the random number generator
in the testsuite.  Also, fail with usual status, not 255.

* tests/seclabeltest.c (main): Initialize randomness.
(cherry picked from commit a22a36e8fe)

Conflicts:
	tests/seclabeltest.c
2012-08-12 20:16:48 -04:00
Cole Robinson
b50badc5ee Remove unused <dirent.h> imports to appease syntax-check
This is 0.9.6-maint only, but similar changes are upstream
2012-08-12 20:08:53 -04:00
Cole Robinson
85fc04dd1b Appease gnulib sc_makefile_at_at_check
This is for v0.9.6 maint only, though similar changes are upstream.
2012-08-12 20:06:31 -04:00
Laine Stump
06e1daac70 test: fix segfault in networkxml2argvtest
This bug resolves https://bugzilla.redhat.com/show_bug.cgi?id=810100

rpm builds for i686 were failing with a segfault in
networkxml2argvtest. Running under valgrind showed that a region of
memory was being referenced after it had been freed (as the result of
realloc - see the valgrind report in the BZ).

The problem (in replaceTokens() - added in commit 22ec60, meaning this
bug was in 0.9.10 and 0.9.11) was that the pointers token_start and
token_end were being computed based on the value of *buf, then *buf
was being realloc'ed (potentially moving it), then token_start and
token_end were used without recomputing them to account for movement
of *buf.

The solution is to change the code so that token_start and token_end
are offsets into *buf rather than pointers. This way there is only a
single pointer to the buffer, and nothing needs readjusting after a
realloc. (You may note that some uses of token_start/token_end didn't
need to be changed to add in "*buf +" - that's because there ended up
being a +*buf and -*buf which canceled each other out).

DV gets the credit for finding this bug and pointing out the valgrind
report.
(cherry picked from commit bde32b1ada)
2012-08-12 19:52:43 -04:00
Philipp Hahn
fb68e28304 tests: dynamically replace dnsmasq path
The path to the dnsmasq binary can be configured while in the test data
the path is hard-coded to /usr/bin/. This break the test suite if a the
binary is located in a different location, like /usr/local/sbin/.

Replace the hard coded path in the test data by a token, which is
dynamically replaced in networkxml2argvtest with the configured path
after the test data has been loaded.

(Another option would have been to modify configure.ac to generate the
 test data during configure, but I do not know of an easy way do trick
 configure into mass-generate those test files without listing every
 single one, which I consider less flexible.)

- unit-test the unit-test:
  #include <assert.h>
  #define TEST(in,token,rep,out) { char *buf = strdup(in); assert(!replaceTokens(&buf, token, rep) && !strcmp(buf, out)); free(buf); }
  TEST("", "AA", "B", "");
  TEST("A", "AA", "B", "A");
  TEST("AA", "AA", "B", "B");
  TEST("AAA", "AA", "B", "BA");
  TEST("AA", "AA", "BB", "BB");
  TEST("AA", "AA", "BBB", "BBB");
  TEST("<AA", "AA", "B", "<B");
  TEST("<AA", "AA", "BB", "<BB");
  TEST("<AA", "AA", "BBB", "<BBB");
  TEST("AA>", "AA", "B", "B>");
  TEST("AA>", "AA", "BB", "BB>");
  TEST("AA>", "AA", "BBB", "BBB>");
  TEST("<AA>", "AA", "B", "<B>");
  TEST("<AA>", "AA", "BB", "<BB>");
  TEST("<AA>", "AA", "BBB", "<BBB>");
  TEST("<AA|AA>", "AA", "B", "<B|B>");
  TEST("<AA|AA>", "AA", "BB", "<BB|BB>");
  TEST("<AA|AA>", "AA", "BBB", "<BBB|BBB>");
  TEST("<AAAA>", "AA", "B", "<BB>");
  TEST("<AAAA>", "AA", "BB", "<BBBB>");
  TEST("<AAAA>", "AA", "BBB", "<BBBBBB>");
  TEST("AAAA>", "AA", "B", "BB>");
  TEST("AAAA>", "AA", "BB", "BBBB>");
  TEST("AAAA>", "AA", "BBB", "BBBBBB>");
  TEST("<AAAA", "AA", "B", "<BB");
  TEST("<AAAA", "AA", "BB", "<BBBB");
  TEST("<AAAA", "AA", "BBB", "<BBBBBB");
  alarm(1); /* no infinite loop */
  TEST("A", "A", "A", "A");
  TEST("AA", "A", "A", "AA");
  alarm(0);

Signed-off-by: Philipp Hahn <hahn@univention.de>
(cherry picked from commit 22ec60001e)

Conflicts:
	tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
	tests/networkxml2argvdata/nat-network-dns-srv-record.argv
2012-08-12 19:51:53 -04:00
Eric Blake
64b8925c37 daemon: Fix crash in virTypedParameterArrayClear
Daemon uses the following pattern when dispatching APIs with typed
parameters:

    VIR_ALLOC_N(params, nparams);
    virDomain*(dom, params, &nparams, flags);
    virTypedParameterArrayClear(params, nparams);

In case nparams was originally set to 0, virDomain* API would fill it
with the number of typed parameters it can provide and we would use this
number (rather than zero) to clear params. Because VIR_ALLOC* returns
non-NULL pointer even if size is 0, the code would end up walking
through random memory. If we were lucky enough and the memory contained
7 (VIR_TYPED_PARAM_STRING) at the right place, we would try to free a
random pointer and crash.

Let's make sure params stays NULL when nparams is 0.
(cherry picked from commit 6039a2cb49)

Conflicts:

	daemon/remote.c - context differences, and fewer call sites
2012-08-01 16:27:11 -06:00
Eric Blake
fcc2893679 build: update to latest gnulib, for secure tarball
Pick up some build fixes in the latest gnulib.  In particular,
we want to ensure that official tarballs are secure, but don't
want to penalize people who don't run 'make dist', since fixed
automake still hasn't hit common platforms like Fedora 17.

* .gnulib: Update to latest, for Automake CVE-2012-3386 detection.
* bootstrap: Resync from gnulib.
* bootstrap.conf (gnulib_extra_files): Drop missing, since gnulib
has dropped it in favor of Automake's version.
* cfg.mk (local-checks-to-skip): Conditionally skip the security
check in cases where it doesn't matter.
(cherry picked from commit f12e139621)

Conflicts:
	.gnulib - skip all intermediate commits touching this file
	bootstrap - likewise
2012-07-27 10:51:50 -06:00
Eric Blake
b598d0864d build: update to latest gnulib
Gnulib finally relaxed the isatty license, needed as first mentioned here:
https://www.redhat.com/archives/libvir-list/2012-February/msg01022.html

Other improvements include better syntax-check rules (we can delete one
of ours now that it is a duplicate) and better compiler warning usage.

* .gnulib: Update to latest, for isatty.
* cfg.mk (sc_prohibit_strncpy): Drop a now-redundant rule.
* bootstrap.conf (gnulib_modules): Add isatty.
* bootstrap: Resync from gnulib.
(cherry picked from commit e925ea3156)

Conflicts:
	.gnulib - skip all intermediate commits touching this file
	bootstrap - likewise
2012-07-27 10:51:40 -06:00
Eric Blake
2bdc05d1a4 build: update to latest gnulib
Pick up recent gnulib improvements.

* .gnulib: Update to latest.
* bootstrap: Resync.
* bootstrap.conf (gnulib_tool_option_extras): Adjust to bootstrap
changes.
* gnulib/lib/Makefile.am: Likewise.
(cherry picked from commit 29db7a0072)

Conflicts:
	.gnulib - skip all intermediate commits touching this file
	bootstrap.conf - likewise (especially skip commit f7bd00c)
2012-07-27 10:49:47 -06:00
Cole Robinson
da8ab75e90 Stable release 0.9.6.1 2012-06-15 14:59:51 -04:00
Daniel P. Berrange
a822202d6c Pull in GNULIB regex module for benefit of test suite on Win32
(cherry picked from commit f94d9c5793)
2012-06-15 10:58:27 -04:00
Daniel P. Berrange
c12c765f83 Fix typos in API XML file paths
* libvirt.pc.in: Add missing '/api/' in path
* libvirt.spec.in, mingw32-libvirt.spec.in: s/apis/api/
(cherry picked from commit 5452e88c32)
2012-06-15 10:58:27 -04:00
Wen Congyang
aa041fcef0 qemu: avoid closing fd more than once
If we migrate to fd, spec->fwdType is not MIGRATION_FWD_DIRECT,
we will close spec->dest.fd.local in qemuMigrationRun(). So we
should set spec->dest.fd.local to -1 in qemuMigrationRun().

Bug present since 0.9.5 (commit 326176179).
(cherry picked from commit b19c236d69)
2012-06-15 10:58:27 -04:00
Wen Congyang
0e4efa3d53 command: check for fork error before closing fd
We should not set *outfd or *errfd if virExecWithHook() failed
because the caller may close these fds.

Bug present since v0.4.5 (commit 60ed1d2a).
(cherry picked from commit 746ff701e8)
2012-06-15 10:58:27 -04:00
Eric Blake
26ceca4b02 fdstream: avoid double close bug
Wen Congyang reported that we have a double-close bug if we fail
virFDStreamOpenInternal, since childfd duplicated one of the fds[]
array contents.  In truth, since we always transfer both members
of fds to other variables, we should close the fds through those
other names, and just use fds[] for pipe().

Bug present since 0.9.0 (commit e886237a).

* src/fdstream.c (virFDStreamOpenFileInternal): Swap scope of
childfd and fds[], to avoid a double close.
(cherry picked from commit f3cfc7c884)
2012-06-15 10:58:27 -04:00
Eric Blake
1a6bad7108 command: avoid double close bugs
KAMEZAWA Hiroyuki reported a nasty double-free bug when virCommand
is used to convert a string into input to a child command.  The
problem is that the poll() loop of virCommandProcessIO would close()
the write end of the pipe in order to let the child see EOF, then
the caller virCommandRun() would also close the same fd number, with
the second close possibly nuking an fd opened by some other thread
in the meantime.  This in turn can have all sorts of bad effects.

The bug has been present since the introduction of virCommand in
commit f16ad06f.

This is based on his first attempt at a patch, at
https://bugzilla.redhat.com/show_bug.cgi?id=823716

* src/util/command.c (_virCommand): Drop inpipe member.
(virCommandProcessIO): Add argument, to avoid closing caller's fd
without informing caller.
(virCommandRun, virCommandNewArgs): Adjust clients.
(cherry picked from commit da831afcf2)

Conflicts:

	src/util/command.c
2012-06-15 10:58:25 -04:00
Wen Congyang
fcf32fc978 avoid fd leak
virCommandRunAsync() will set errfd if it succeed. We should
close it if virFDStreamOpenInternal() fails.
(cherry picked from commit 655cffa0f2)
2012-06-15 10:58:24 -04:00
Wen Congyang
0bff012ddc avoid closing uninitialized fd
If the system does not support bypass cache, we will close fd,
but it is uninitialized.
(cherry picked from commit 0a045f01cf)
2012-06-15 10:58:24 -04:00
Daniel P. Berrange
d6f20a2dfa Set a sensible default master start port for ehci companion controllers
The uhci1, uhci2, uhci3 companion controllers for ehci1 must
have a master start port set. Since this value is predictable
we should set it automatically if the app does not supply it
(cherry picked from commit 03b804a200)
2012-06-15 10:58:24 -04:00
Daniel P. Berrange
dac6e9a210 Fix logic for assigning PCI addresses to USB2 companion controllers
Currently each USB2 companion controller gets put on a separate
PCI slot. Not only is this wasteful of PCI slots, but it is not
in compliance with the spec for USB2 controllers. The master
echi1 and all companion controllers should be in the same slot,
with echi1 in function 7, and uhci1-3 in functions 0-2 respectively.

* src/qemu/qemu_command.c: Special case handling of USB2 controllers
  to apply correct pci slot assignment
* tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.args,
  tests/qemuxml2argvdata/qemuxml2argv-usb-ich9-ehci-addr.xml: Expand
  test to cover automatic slot assignment
(cherry picked from commit 1ebd52cb87)

Conflicts:

	tests/qemuxml2xmltest.c
2012-06-15 10:58:24 -04:00
Daniel P. Berrange
b4e9a21c3b Fix virDomainDeviceInfoIsSet() to check all struct fields
The virDomainDeviceInfoIsSet API was only checking if an
address or alias was set in the struct. Thus if only a
rom bar setting / filename, boot index, or USB master
value was set, they could be accidentally dropped when
formatting XML
(cherry picked from commit 2c195fdbf3)

Conflicts:

	src/conf/domain_conf.c

(crobinso: some elements aren't in maint branch, drop them)
2012-06-15 10:58:24 -04:00
Serge E. Hallyn
8bd5c79224 lxc: use hand-rolled code in place of unlockpt and grantpt
The glibc ones (intentionally) cannot handle ptys opened in a
devpts not mounted at /dev/pts.

Drop the (un-exported, unused) virFileOpenTtyAt.

Signed-off-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit 80710c69fe)

Conflicts:

	src/lxc/lxc_controller.c
2012-06-15 10:58:24 -04:00
Stefan Bader
b0200c81ec xen: do not use ioemu type for any emulated NIC
When using the xm/xend stack to manage instances there is a bug
that causes the emulated interfaces to be unusable when the vif
config contains type=ioemu.

The current code already has a special quirk to not use this
keyword if no specific model is given for the emulated NIC
(defaulting to rtl8139).
Essentially it works because regardless of the type argument,i
the Xen stack always creates emulated and paravirt interfaces and
lets the guest decide which one to use. So neither xl nor xm stack
actually require the type keyword for emulated NICs.

Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
(cherry picked from commit 10c31135f3)
2012-06-15 10:58:24 -04:00
Stefan Bader
8213166b92 xend_internal: Use domain/status for shutdown check
On newer xend (v3.x and after) there is no state and domid reported
for inactive domains. When initially creating connections this is
handled in various places by assigning domain->id = -1.
But once an instance has been running, the id is set to the current
domain id. And it does not change when the instance is shut down.
So when querying the domain info, the hypervisor driver, which gets
asked first will indicate it cannot find information, then the
xend driver is asked and will set the status to NOSTATE because it
checks for the -1 domain id.
Checking domain/status for 0 seems to be more reliable for that.

One note: I am not sure whether the domain->id also should get set
back to -1 whenever any sub-driver thinks the instance is no longer
running.

BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=746007
BugLink: http://bugs.launchpad.net/bugs/929626

Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
(cherry picked from commit 26e9ef4762)

(crobinso: Add Stefan to AUTHORS. maint only)
2012-06-15 10:58:05 -04:00
Philipp Hahn
3f769afc45 xen-xm: SIGSEGV in xenXMDomainDefineXML: filename
filename is not initialized to NULL while it's unconditionally freed in
the error path.

Signed-off-by: Philipp Hahn <hahn@univention.de>
(cherry picked from commit 360afebfb3)
2012-06-15 10:56:57 -04:00
Philipp Hahn
766be49f17 xen_xm: Fix SIGSEGV in xenXMDomainDefineXML
On CentOS5 with xen-3.0.3:

 Program received signal SIGSEGV, Segmentation fault.
 virFree (ptrptr=0x8) at util/memory.c:310
 310         free(*(void**)ptrptr);
 (gdb) bt
 #0  virFree (ptrptr=0x8) at util/memory.c:310
 #1  0x00002aaaaae167c8 in xenXMDomainDefineXML (conn=0x694e80, xml=0x6b2ce0 "P\fk") at xen/xm_internal.c:1199
 #2  0x00002aaaaae070d7 in xenUnifiedDomainDefineXML (conn=0x8,
     xml=0x6ac040 "<domain type='xen'>\n  <name>pv</name>\n  <uuid>20291bc0-453a-4d6c-c6ac-4e5af63b932c</uuid>\n  <memory>1048576</memory>\n  <currentMemory>1048576</currentMemory>\n  <vcpu>1</vcpu>\n  <os>\n    <type arch='x8"...) at xen/xen_driver.c:1524
 #3  0x00002aaaaada7803 in virDomainDefineXML (conn=0x694e80,
     xml=0x6ac040 "<domain type='xen'>\n  <name>pv</name>\n  <uuid>20291bc0-453a-4d6c-c6ac-4e5af63b932c</uuid>\n  <memory>1048576</memory>\n  <currentMemory>1048576</currentMemory>\n  <vcpu>1</vcpu>\n  <os>\n    <type arch='x8"...) at libvirt.c:7823
 #4  0x0000000000426173 in cmdEdit (ctl=0x7fffffffb8e0, cmd=<value optimized out>) at virsh.c:14882
 #5  0x000000000041c9ce in vshCommandRun (ctl=0x7fffffffb8e0, cmd=0x658c50) at virsh.c:17712
 #6  0x000000000042c3b9 in main (argc=1, argv=<value optimized out>) at virsh.c:19317

Signed-off-by: Philipp Hahn <hahn@univention.de>
(cherry picked from commit 046b0a6972)
2012-06-15 10:56:57 -04:00
Cole Robinson
3d8f56d129 xen: Don't add <console> to xml for dom0
It just doesn't really make sense and confuses virt-manager
(cherry picked from commit efb0839c1d)

Conflicts:

	src/xenxs/xen_sxpr.c
2012-06-15 10:56:57 -04:00
Guido Günther
f20331c810 xen_xs: Guard against set but empty kernel argument
On xen 4.1 I observed configurations that look like:

(image
    (hvm
        (kernel '')
        (loader '/foo/bar')
))

The kernel element is there but unset. This leads to an empty <kernel/>
element in the XML and even worse makes us skip the boot order parsing
and therefore not emit a <boot device='$dev>'/> element which breaks CD
booting.
(cherry picked from commit dca1a6b46f)
2012-06-15 10:56:57 -04:00
Guido Günther
0f1bc306d3 xen: add error handling to UUID parsing
otherwise a missing UUID in a domain config just shows:

error: An error occurred, but the cause is unknown

Now we have:

error: configuration file syntax error: config value uuid was missing
(cherry picked from commit c5d2984c42)
2012-06-15 10:56:57 -04:00
Guido Günther
4f5f16eea9 xenParseXM: don't dereference NULL pointer when script is empty
(cherry picked from commit 6dd8532d96)
2012-06-15 10:56:57 -04:00
Radu Caragea
24c17ed1ec Fix sync issue in virNetClientStreamEventRemoveCallback
The stream lock is unlocked twice instead of being locked and then
unlocked. Probably a typo.
(cherry picked from commit 107f51b69c)

Conflicts:

	AUTHORS
2012-06-15 10:56:52 -04:00
Peter Krempa
abf4ab4827 fdstream: Add internal callback on stream close
This patch adds another callback to a FDstream object. The original
callback is used by the daemon stream driver to handle events.

This callback is called if and only if the stream is about to be closed.
This might be used to handle cleanup steps after a fdstream exits. This
will be used later on in ensuring mutually exclusive access to consoles.

* src/fdstream.c:
        - emit the callback, when stream is being closed
        - add data structures needed to handle the callback
        - add function to register callback
* src/fdstream.h:
        - define function prototypes for the callback
(cherry picked from commit 0c4bfdda42)
2012-06-14 17:35:47 -04:00
Peter Krempa
25eeffcb17 fdstream: Emit stream abort callback even if poll() doesnt.
This patch causes the fdstream driver to call the stream event callback
if virStreamAbort() is called on a stream using this driver.

A remote handler for a stream can only detect changes via stream events,
so this event callback is necessary in order to enable a daemon to abort
a stream in such a way that the client will see the change.

* src/fdstream.c:
        - modify close function to call stream event callback
(cherry picked from commit 95fdc1bc2b)
2012-06-14 17:35:36 -04:00
Daniel P. Berrange
96c3c2752e Don't return a fatal error if receiving unexpected stream data
Due to the asynchronous nature of streams, we might continue to
receive some stream packets from the server even after we have
shutdown the stream on the client side. These should be discarded
silently, rather than raising an error in the RPC layer.

* src/rpc/virnetclient.c: Discard stream data silently
(cherry picked from commit a38710bd65)
2012-06-14 17:32:48 -04:00
Daniel P. Berrange
43b7292293 Fix handling of stream EOF
Very occasionally the sequence of events from poll would result
in getting a HANGUP on its own, instead of a HANGUP+READABLE
at the same time. In the former case we would send back an error
event to the client, but never send the empty packet to indicate
EOF.
(cherry picked from commit 1d46b2e900)
2012-06-14 17:32:37 -04:00
Daniel P. Berrange
abb78d4ec2 If receiving a stream error, mark EOF on the stream
If we receive an error on the stream, set the EOF marker so
that any further (bogus) incoming data is dropped.

* src/rpc/virnetclientstream.c: Set EOF on stream
(cherry picked from commit bc61aa1211)
2012-06-14 17:31:26 -04:00
Marc-André Lureau
49bc39be66 Set to NULL members that have been freed to prevent crashes
Do not crash if virStreamFinish is called after error.

==11000== Invalid read of size 4
==11000==    at 0x373A8099A0: pthread_mutex_lock (pthread_mutex_lock.c:51)
==11000==    by 0x4C7CADE: virMutexLock (threads-pthread.c:85)
==11000==    by 0x4D57C31: virNetClientStreamRaiseError (virnetclientstream.c:203)
==11000==    by 0x4D385E4: remoteStreamFinish (remote_driver.c:3541)
==11000==    by 0x4D182F9: virStreamFinish (libvirt.c:14157)
==11000==    by 0x40FDC4: cmdScreenshot (virsh.c:3075)
==11000==    by 0x42BA40: vshCommandRun (virsh.c:14922)
==11000==    by 0x42ECCA: main (virsh.c:16381)
==11000==  Address 0x59b86c0 is 16 bytes inside a block of size 216 free'd
==11000==    at 0x4A06928: free (vg_replace_malloc.c:427)
==11000==    by 0x4C69E2B: virFree (memory.c:310)
==11000==    by 0x4D57B56: virNetClientStreamFree (virnetclientstream.c:184)
==11000==    by 0x4D3DB7A: remoteDomainScreenshot (remote_client_bodies.h:1812)
==11000==    by 0x4CFD245: virDomainScreenshot (libvirt.c:2903)
==11000==    by 0x40FB73: cmdScreenshot (virsh.c:3029)
==11000==    by 0x42BA40: vshCommandRun (virsh.c:14922)
==11000==    by 0x42ECCA: main (virsh.c:16381)
(cherry picked from commit be5ec76630)
2012-06-14 17:31:16 -04:00
Daniel P. Berrange
208d5836c8 Fix synchronous reading of stream data
commit 984840a2c2 removed the
notification of waiting calls when VIR_NET_CONTINUE messages
arrive. This was to fix the case of a virStreamAbort() call
being prematurely notified of completion.

The problem is that sometimes there are dummy calls from a
virStreamRecv() call waiting that *do* need to be notified.

These dummy calls should have a status VIR_NET_CONTINUE. So
re-add the notification upon VIR_NET_CONTINUE, but only if
the waiter also has a status of VIR_NET_CONTINUE.

* src/rpc/virnetclient.c: Notify waiting call if stream data
  arrives
* src/rpc/virnetclientstream.c:  Mark dummy stream read packet
  with status VIR_NET_CONTINUE
(cherry picked from commit cb61009236)
2012-06-14 17:31:01 -04:00
Eric Blake
5b5b1150cf build: fix stamp file name
Ever since commit c964b6a, make was trying to find the timestamp
of '""./apibuild.py".stamp"', but only touching 'apibuild.py.stamp',
and thus always rebuilding.  Reported by Daniel P. Berrange.

* docs/Makefile.am (APIBUILD, APIBUILD_STAMP): Omit bogus quotes.
(cherry picked from commit c0057d9a49)
2012-05-17 10:48:04 -06:00
Daniel P. Berrange
3cbb1385e9 Install API XML desc to a standard location
Language bindings may well want to use the libvirt-api.xml and
libvirt-qemu-api.xml files to either auto-generate themselves,
or sanity check the manually written bindings for completeness.
Currently these XML files are not installed as standard, merely
ending up as a %doc file in the RPM.

This changes them to be installed into $prefix/share/libvirt/apis/
The *-refs.xml files are not installed, since those are only
useful during generation of the online API doc files.

The pkg-config file is enhanced so that you can query the install
location of the API files. eg

  # pkg-config --variable=libvirt_qemu_api libvirt
  /home/berrange/builder/i686-pc-mingw32/sys-root/mingw/share/libvirt/libvirt-qemu-api.xml

* docs/Makefile.am: Install libvirt-api.xml & libvirt-qemu-api.xml
* libvirt.pc.in: Add vars for querying API install location
* libvirt.spec.in, mingw32-libvirt.spec.in: Include API XML files
(cherry picked from commit c95c90ee4a)
2012-05-17 10:48:04 -06:00
Eric Blake
757316875c tests: work around pdwtags 1.9 failure
On rawhide, gcc is new enough to output new DWARF information that
pdwtags has not yet learned, but the resulting 'make check' output
was rather confusing:

$ make -C src check
...
  GEN    virkeepaliveprotocol-structs
die__process_function: DW_TAG_INVALID (0x4109) @ <0x58c> not handled!
WARNING: your pdwtags program is too old
WARNING: skipping the virkeepaliveprotocol-structs test
WARNING: install dwarves-1.3 or newer
...
$ pdwtags --version
v1.9

I've filed the pdwtags deficiency as
https://bugzilla.redhat.com/show_bug.cgi?id=772358

* src/Makefile.am (PDWTAGS): Don't leave -t file behind on version
mismatch.  Soften warning message, since 1.9 is newer than 1.3.
Don't leak stderr from broken version.
(cherry picked from commit cf6d36257b)
2012-05-17 10:48:04 -06:00
Eric Blake
a261feba42 xenapi: remove unused variable
CC     libvirt_driver_xenapi_la-xenapi_driver.lo
xenapi/xenapi_driver.c: In function 'xenapiDomainGetVcpus':
xenapi/xenapi_driver.c:1209:21: error: variable 'cpus' set but not used [-Werror=unused-but-set-variable]

* src/xenapi/xenapi_driver.c (xenapiDomainGetVcpus): Silence
compiler warning.
(cherry picked from commit 787b0a2238)
2012-05-17 10:48:04 -06:00
Eric Blake
cd921a5572 build: fix 'make distcheck'
I got these distcheck failures with sanlock enabled:

ERROR: files left in build directory after distclean:
./tools/virt-sanlock-cleanup
./src/locking/qemu-sanlock.conf

* src/Makefile.am (DISTCLEANFILES) [HAVE_SANLOCK]: Clean built
file.
* tools/Makefile.am (DISTCLEANFILES): Likewise.
(cherry picked from commit c654ba8893)
plus tweak to DISTCLEANFILES from commit ddf3bd32ce, although that
full commit is too invasive to backport
2012-05-17 10:48:04 -06:00
Eric Blake
505c99f62e build: fix 'make distcheck' with pdwtags installed
I am getting this failure with 'make distcheck':

  GEN    ../../src/remote_protocol-structs
/bin/sh: ../../src/remote_protocol-structs-t: Permission denied
make[4]: *** [../../src/remote_protocol-structs] Error 1

since it attempts a sub-run of a VPATH 'make check' where $(srcdir)
is intentionally read-only.  I'm not sure which commit introduced
the problem, although I suspect it was around 62dee6f when I
refactored protocol struct checking to be more powerful.

$(@F) is required by POSIX, and although it is not yet portable
to all make implementations, we already require GNU make.

* src/Makefile.am (PDWTAGS): Generate temp file into current
directory, since $(srcdir) is read-only during distcheck.
(cherry picked from commit 2d45ae5a01)
2012-05-17 10:48:04 -06:00
Cole Robinson
77874a2791 python: Fix doc directory name for stable releases
We were using the libvirt release version (like 0.9.11) and not
the configure version (which for stable releases is 0.9.11.X)

Most other places got this right so hopefully that's all the fallout
from the version format change :)

Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit 002b18b3fb)
2012-05-17 10:44:10 -06:00
Cole Robinson
7de869fc03 docs: Serialize running apibuild.py
Use a witness file approach like we do for python/generator.py,
as suggested by Eric. Fixes the build issue reported here:

https://www.redhat.com/archives/libvir-list/2012-April/msg01435.html

Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit c964b6aac1)

Conflicts:

	.gitignore - context with other commits not backported
2012-05-17 10:44:10 -06:00
Cole Robinson
4e9e178e3c configure: Use ustar format for dist tarball
Since for stable releases, some test files were over the 99 char
limit for traditional tar filenames.

Suggested by Osier here:
https://www.redhat.com/archives/libvir-list/2012-April/msg01435.html

Signed-off-by: Cole Robinson <crobinso@redhat.com>
(cherry picked from commit ddd6bef4dc)
2012-05-17 10:44:10 -06:00
Daniel P. Berrange
abb78a216c Fix parallel build in docs/ directory
Every now & then, with parallel builds, we get a failure to
validate hvsupport.html.in.  I eventually noticed that this
is because we get 2 instances of the generator running at
once.

We already list hvsupport.html.in in BUILT_SOURCES but this
was not working. It turns out the flaw is that we were
adding deps to the 'all:' target instead of the 'all-am:'
target. BUILT_SOURCES is a dep of 'all', so any custom
targets written in Makefile.am must use 'all-am:' so that
they don't get run until BUILT_SOURCES are completely
generated

* docs/Makefile.am: s/all/all-am/
(cherry picked from commit 4f4b496e78)
(cherry picked from commit 26fdec39b4)
2012-05-17 10:44:10 -06:00
Eric Blake
643ac7203a tests: avoid test failure on rawhide gnutls
I hit a VERY weird testsuite failure on rawhide, which included
_binary_ output to stderr, followed by a hang waiting for me
to type something! (Here, using ^@ for NUL):

$ ./commandtest
TEST: commandtest
      WARNING: gnome-keyring:: couldn't send data: Bad file descriptor
.WARNING: gnome-keyring:: couldn't send data: Bad file descriptor
.WARNING: gnome-keyring:: couldn't send data: Bad file descriptor
WARNING: gnome-keyring:: couldn't send data: Bad file descriptor
.8^@^@^@8^@^@^@^A^@^@^@^Bay^A^@^@^@)PRIVATE-GNOME-KEYRING-PKCS11-PROTOCOL-V-1

I finally traced it to the fact that gnome-keyring, called via
gnutls_global_init which is turn called by virNetTLSInit, opens
an internal fd that it expects to communicate to via a
pthread_atfork handler (never mind that it violates POSIX by
using non-async-signal-safe functions in that handler:
https://bugzilla.redhat.com/show_bug.cgi?id=772320).

Our problem stems from the fact that we pulled the rug out from
under the library's expectations by closing an fd that it had
just opened.  While we aren't responsible for fixing the bugs
in that pthread_atfork handler, we can at least avoid the bugs
by not closing the fd in the first place.

* tests/commandtest.c (mymain): Avoid closing fds that were opened
by virInitialize.
(cherry picked from commit 74ff57506c)
2012-05-17 08:45:26 -06:00
Cole Robinson
e11aa0262b storage: Fix any VolLookupByPath if we have an empty logical pool
On F16 at least, empty volume groups don't have a directory under /dev.
The directory only appears once a logical volume is created.

This tickles some behavior in BackendStablePath which ends with
libvirt sleeping for 5 seconds while waiting for the directory to appear.
This causes all sorts of problems for the virStorageVolLookupByPath API
which virtinst uses, even if trying to resolve a path that is independent
of the logical pool.

In reality we don't even need to do that checking since logical pools
always have a stable target path. Short circuit the polling in that
case.

Fixes bug 782261
(cherry picked from commit 275155f664)
2012-05-17 08:43:31 -06:00
Peter Krempa
4744461619 daemon: Remove deprecated HAL from init script dependencies
The init script for the daemon requests to start HAL although it has
been deprecated long time ago. This patch removes the dependency.
(cherry picked from commit 2dcca3ec0a)
2012-05-17 08:42:59 -06:00
Michal Privoznik
e95df90dbb virCommand: Properly handle POLLHUP
It is a good practise to set revents to zero before doing any poll().
Moreover, we should check if event we waited for really occurred or
if any of fds we were polling on didn't encountered hangup.
(cherry picked from commit 06b9c5b923)
2012-05-17 08:40:52 -06:00
Michal Privoznik
56fb0c0695 qemu: Check for domain being active on successful job acquire
As this is needed. Although some functions check for domain
being active before obtaining job, we need to check it after,
because obtaining job unlocks domain object, during which
a state of domain can be changed.
(cherry picked from commit 9bc9999b6e)
2012-05-17 08:25:51 -06:00
Daniel P. Berrange
5ede14ef8e Avoid crash in shunloadtest
For unknown reasons, the shunloadtest will crash on Fedora 16
inside dlopen()

 (gdb) bt
 #0  0x00000000000050e6 in ?? ()
 #1  0x00007ff61a77b9d5 in floor () from /lib64/libm.so.6
 #2  0x00007ff61e522963 in _dl_relocate_object () from /lib64/ld-linux-x86-64.so.2
 #3  0x00007ff61e5297e6 in dl_open_worker () from /lib64/ld-linux-x86-64.so.2
 #4  0x00007ff61e525006 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
 #5  0x00007ff61e52917a in _dl_open () from /lib64/ld-linux-x86-64.so.2
 #6  0x00007ff61e0f6f26 in dlopen_doit () from /lib64/libdl.so.2
 #7  0x00007ff61e525006 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
 #8  0x00007ff61e0f752f in _dlerror_run () from /lib64/libdl.so.2
 #9  0x00007ff61e0f6fc1 in dlopen@@GLIBC_2.2.5 () from /lib64/libdl.so.2
 #10 0x0000000000400a15 in main (argc=<optimized out>, argv=<optimized out>) at shunloadtest.c:105

Changing from RTLD_NOW to RTLD_LAZY avoids this problem,
but quite possibly does not fix the root cause.

* shunloadtest.c: s/NOW/LAZY/
(cherry picked from commit 24d9792821)
2012-05-17 08:22:59 -06:00
Eric Blake
f0ba1c096a spec: make it easier to autoreconf when building rpm
Over time, Fedora and RHEL RPMs have often backported upstream
patches that touched configure.ac and/or Makefile.am; this
necessitates rerunning the autotools for the patch to be effective.
Making this a one-liner spec tweak will make it easier for future
backports to pull patches without having to find all the places
to touch to properly use the autotools.  Meanwhile, there have been
historical instances where an update in the autotools caused FTBFS
situations, so this is not on by default.

* libvirt.spec.in (enable_autotools): New variable, default off.
(BuildRequires): Conditionally add autotools.
(%build): Conditionally use them before configure.
* mingw32-libvirt.spec.in: Likewise.
(cherry picked from commit 9c417636c4)

Conflicts:

	mingw32-libvirt.spec.in - caused by change in context
2012-05-17 08:22:06 -06:00
Laine Stump
42419b2891 test: replace deprecated "fedora-13" machine with "pc-0.13"
One of the xml tests in the test suite was created using a
now-deprecated qemu machine type ("fedora-13", which was only ever
valid for Fedora builds of qemu). Although strictly speaking it's not
necessary to replace it with an actual supported qemu machine type
(since the xml in question is never actually sent to qemu), this patch
changes it to the actually-supported "pc-0.13" just for general
tidiness. (Also, on some Fedora builds which contain a special patch
to rid the world of "fedora-13", having it mentioned in the test suite
will cause make check to fail.)
(cherry picked from commit 7204a9fd31)
2012-05-16 17:17:12 -06:00
Laine Stump
762801607a network: don't add iptables rules for externally managed networks
This patch addresses https://bugzilla.redhat.com/show_bug.cgi?id=760442

When a network has any forward type other than route, nat or none, the
network configuration should be done completely external to libvirt -
libvirt only uses these types to allow configuring guests in a manner
that isn't tied to a specific host (all the host-specific information,
in particular interface names, port profile data, and bandwidth
configuration is in the network definition, and the guest
configuration only references it).

Due to a bug in the bridge network driver, libvirt was adding iptables
rules for networks with forward type='bridge' etc. any time libvirtd
was restarted while one of these networks was active.

This patch eliminates that error by only "reloading" iptables rules if
forward type is route, nat, or none.
(cherry picked from commit ae1232b298)
2012-05-16 17:13:08 -06:00
Eric Blake
d20a6240b3 spec: fix logic bug in deciding to turn on cgconfig
https://bugzilla.redhat.com/show_bug.cgi?id=738725

Commit ecd8725 tried to silence a spurious warning on the initial
libvirt install, and commit ba6cbb1 tried to fix up the logic to the
correct Fedora version, but the warning was still present due to a
logic bug: since %{fedora} and %{rhel} are never simulatanously
set, then 0%{rhel} <= 6 made the %if always true.  Checking for
minimum versions (via >=) is okay, but checking for maximum versions
(via <=) requires a prerequisite test that the platform being tested
is non-zero.

Also fix a bogus setting of with_libxl (although we previously
hard-code with_libxl to 0 for rhel earlier in the file, so this
was not as severe a bug).

* libvirt.spec.in (with_cgconfig): Don't enable cgconfig on F16.
(cherry picked from commit 3b95f284f1)
2012-05-16 17:12:54 -06:00
Eric Blake
bf887b8bb5 spec: don't use chkconfig --list
https://bugzilla.redhat.com/show_bug.cgi?id=694403 reports that
the specfile is incorrectly checking for a running libvirt-guests
service.  For example,

$ LC_ALL=es_ES chkconfig --list libvirt-guests
libvirt-guests 	  0:desactivado		 1:desactivado	   2:desactivado     3:activo	 4:activo  5:activo	    6:desactivado

will fail to find 5:on, even though it is active.  But chkconfig
already has a mode where you can silently use the exit status to
check for an active service.

* libvirt.spec.in (%post): Use simpler chkconfig options, to avoid
issues with localization.
(cherry picked from commit fea83dde7b)
2012-05-16 17:12:37 -06:00
Eric Blake
bf09c64ada spec: add dmidecode as prereq
https://bugzilla.redhat.com/show_bug.cgi?id=754909 complains that
because libvirt didn't require dmidecode, that the logs are noisy
and virConnectGetSysinfo needlessly fails.  Even 'virt-what' requires
dmidecode, so it's not that onerous of a dependency.  We may be
able to drop this in the future when we move to parsing sysfs data,
but for now, listing the dependency will help matters.

* libvirt.spec.in (Requires): Sort Requires before BuildRequires.
Add dmidecode.
(cherry picked from commit e7dfa468f9)
extra requires for with_systemd removed, since the patch that adds
that hasn't been backported
2012-05-16 17:11:43 -06:00
Daniel P. Berrange
dc738b8395 Fix incorrect symbols for virtime.h module breaking Mingw32
The Mingw32 linker highlighted that the symbols for virtime.h
declared in libvirt_private.syms were incorrect

* src/libvirt_private.syms: Fix virtime.h symbols
(cherry picked from commit b265beda55)
2012-05-16 17:07:31 -06:00
Eric Blake
f2b5c5ff22 spec: mark directories in /var/run as ghosts
We have several directories that are created on the fly, and which
only contain state relevant to a running libvirtd process (all
located in /var/run).  Since the directories are created as needed,
and make no sense without a running libvirtd, we want them deleted
if libvirt is uninstalled.  And in F15 and newer, /var/run is on
tmpfs (forcing us to recreate on the fly); which means that someone
trying to verify a complete rpm will fail if the directory does not
currently exist because libvirtd has not been started since boot.
The solution, then, is to mark the directories as %ghost, so that
rpm knows that we own them and will clean it up if libvirt is
uninstalled, but will no longer create the directory for us at
install, nor complain at verify time if the directory does not exist.

See https://bugzilla.redhat.com/show_bug.cgi?id=656611.

* libvirt.spec.in (%files): Add %ghost to temporary directories
that we don't install, but want cleaned up on libvirt removal.
(cherry picked from commit 764574f7c7)
2012-05-16 17:07:04 -06:00
Daniel P. Berrange
c6ead37ba1 Remove time APIs from src/util/util.h
The virTimestamp and virTimeMs functions in src/util/util.h
duplicate functionality from virtime.h, in a non-async signal
safe manner. Remove them, and convert all code over to the new
APIs.

* src/util/util.c, src/util/util.h: Delete virTimeMs and virTimestamp
* src/lxc/lxc_driver.c, src/qemu/qemu_domain.c,
  src/qemu/qemu_driver.c, src/qemu/qemu_migration.c,
  src/qemu/qemu_process.c, src/util/event_poll.c: Convert to use
  virtime APIs
(cherry picked from commit a8bb75a3e6)

Conflicts:

	src/lxc/lxc_driver.c
	src/qemu/qemu_domain.c
	src/qemu/qemu_driver.c
	 * the patches contained context with extra include files not
	   yet introduced on the branch.
	src/util/event_poll.c
	 * the branch had context with a call to EVENT_DEBUG that
	   was no longer existing in the original patch.
2012-05-16 17:06:04 -06:00
Daniel P. Berrange
472e49f558 Make logging async signal safe wrt time stamp generation
Use the new virTimeStringNowRaw() API for generating log timestamps
in an async signal safe manner

* src/util/logging.c: Use virTimeStringNowRaw
(cherry picked from commit 32d3ec7466)

Conflicts:

	src/util/logging.c
2012-05-16 16:57:36 -06:00
Daniel P. Berrange
2ce01ba20f Add internal APIs for dealing with time
The logging APIs need to be able to generate formatted timestamps
using only async signal safe functions. This rules out using
gmtime/localtime/malloc/gettimeday(!) and much more.

Introduce a new internal API which is async signal safe.

  virTimeMillisNowRaw replacement for gettimeofday. Uses clock_gettime
                      where available, otherwise falls back to the unsafe
                      gettimeofday

  virTimeFieldsNowRaw  replacements for gmtime(), convert a timestamp
  virTimeFieldsThenRaw into a broken out set of fields. No localtime()
                       replacement is provided, because converting to
                       local time is not practical with only async signal
                       safe APIs.

  virTimeStringNowRaw  replacements for strftime() which print a timestamp
  virTimeStringThenRaw into a string, using a pre-determined format, with
                       a fixed size buffer (VIR_TIME_STRING_BUFLEN)

For each of these there is also a version without the Raw postfix
which raises a full libvirt error. These versions are not async
signal safe

* src/Makefile.am, src/util/virtime.c, src/util/virtime.h: New files
* src/libvirt_private.syms: New APis
* configure.ac: Check for clock_gettime in -lrt
* tests/virtimetest.c, tests/Makefile.am: Test new APIs
(cherry picked from commit 3ec1289896)

Conflicts:

	src/Makefile.am
2012-05-16 16:45:51 -06:00
Jiri Denemark
bf540af8b3 logging: Add date to log timestamp
(cherry picked from commit 11c6e094e4)
2012-05-16 16:24:17 -06:00
Jiri Denemark
fc9a66cfb1 logging: Do not log timestamp through syslog
Syslog puts the timestamp to every message anyway so this removes
redundant data.
(cherry picked from commit 2a449549c1)
2012-05-16 16:11:32 -06:00
Laine Stump
776124e6f0 qemu: make PCI multifunction support more manual
When support for was added for PCI multifunction cards (in commit
9f8baf, first included in libvirt 0.9.3), it was done by always
turning on the multifunction bit for all PCI devices. Since that time
it has been realized that this is not an ideal solution, and that the
multifunction bit must be selectively turned on. For example, see

  https://bugzilla.redhat.com/show_bug.cgi?id=728174

and the discussion before and after

  https://www.redhat.com/archives/libvir-list/2011-September/msg01036.html

This patch modifies multifunction support so that the multifunction=on
option is only added to the qemu commandline for a device if its PCI
<address> definition has the attribute "multifunction='on'", e.g.:

  <address type='pci' domain='0x0000' bus='0x00'
           slot='0x04' function='0x0' multifunction='on'/>

In practice, the multifunction bit should only be turned on if
function='0' AND other functions will be used in the same slot - it
usually isn't needed for functions 1-7 (although there are apparently
some exceptions, e.g. the Intel X53 according to the QEMU source
code), and should never be set if only function 0 will be used in the
slot. The test cases have been changed accordingly to illustrate.

With this patch in place, if a user attempts to assign multiple
functions in a slot without setting the multifunction bit for function
0, libvirt will issue an error when the domain is defined, and the
define operation will fail. In the future, we may decide to detect
this situation and automatically add multifunction=on to avoid the
error; even then it will still be useful to have a manual method of
turning on multifunction since, as stated above, there are some
devices that excpect it to be turned on for all functions in a slot.

A side effect of this patch is that attempts to use the same PCI
address for two different devices will now log an error (previously
this would cause the domain define operation to fail, but there would
be no log message generated). Because the function doing this log was
almost completely rewritten, I didn't think it worthwhile to make a
separate patch for that fix (the entire patch would immediately be
obsoleted).
(cherry picked from commit c329db7180)
2012-05-16 16:01:24 -06:00
Laine Stump
d20f5421a9 conf: remove unused VIR_ENUM_DECL
While adding a new enum, I noticed a VIR_ENUM_DECL for a type that
doesn't exist. There is also of course no matching VIR_ENUM_IMPL for
it.
(cherry picked from commit be7bc4d5cc)
2012-05-16 16:01:19 -06:00
Eric Blake
64eadd9a7b spec: F15 still uses cgconfig, RHEL lacks hyperv
Commit ecd8725c dropped attempts to probe the cgconfig service on
new enough Fedora where systemd took over that aspect of the system,
but mistakenly used F14 instead of F15 as the cutoff point.

https://bugzilla.redhat.com/show_bug.cgi?id=741358

Also, RHEL does not include HyperV support yet.

* libvirt.spec.in (with_cgconfig): Check cgconfig service in F15.
(%{?rhel}): Provide default for with_hyperv.
(cherry picked from commit ba6cbb182b)
2012-05-16 15:58:29 -06:00
1343 changed files with 560576 additions and 857445 deletions

84
.gitignore vendored
View File

@@ -1,28 +1,19 @@
*#*#
*.#*#
*.a
*.cov
*.exe
*.gcda
*.gcno
*.gcov
*.html
*.i
*.la
*.lo
*.loT
*.o
*.orig
*.pyc
*.rej
*.s
*~
.deps
.git
.git-module-status
.libs
.lvimrc
.memdump
.sc-start-sc_*
/ABOUT-NLS
/COPYING
@@ -46,29 +37,12 @@
/configure
/configure.lineno
/daemon/*_dispatch.h
/daemon/libvirt_qemud
/daemon/libvirtd
/daemon/libvirtd.init
/daemon/libvirtd.service
/daemon/libvirtd*.logrotate
/daemon/libvirtd.8
/daemon/libvirtd.8.in
/daemon/libvirtd.pod
/docs/devhelp/libvirt.devhelp
/docs/apibuild.py.stamp
/docs/hvsupport.html.in
/docs/libvirt-api.xml
/docs/libvirt-qemu-*.xml
/docs/libvirt-refs.xml
/docs/todo.html.in
/examples/domain-events/events-c/event-test
/examples/dominfo/info1
/examples/domsuspend/suspend
/examples/hellolibvirt/hellolibvirt
/examples/openauth/openauth
/gnulib/lib/*
/gnulib/m4/*
/gnulib/tests/*
/include/libvirt/libvirt.h
/libtool
/libvirt-*.tar.gz
/libvirt-[0-9]*
@@ -82,80 +56,26 @@
/mkinstalldirs
/po/*
/proxy/
/python/generated.stamp
/python/generator.py.stamp
/python/libvirt-export.c
/python/libvirt-qemu-export.c
/python/libvirt-qemu.[ch]
/python/libvirt.[ch]
/python/libvirt.py
/python/libvirt_qemu.py
/sc_*
/src/esx/*.generated.*
/src/hyperv/*.generated.*
/src/libvirt*.def
/src/libvirt.syms
/src/libvirt_*.stp
/src/libvirt_*helper
/src/libvirt_lxc
/src/libvirt_iohelper
/src/locking/qemu-sanlock.conf
/src/probes.h
/src/remote/*_client_bodies.h
/src/remote/*_protocol.[ch]
/src/rpc/virkeepaliveprotocol.[ch]
/src/rpc/virnetprotocol.[ch]
/src/util/virkeymaps.h
/src/virt-aa-helper
/tests/*.log
/tests/*.pid
/tests/*xml2*test
/tests/commandhelper
/tests/commandtest
/tests/conftest
/tests/cputest
/tests/domainsnapshotxml2xmltest
/tests/esxutilstest
/tests/eventtest
/tests/hashtest
/tests/jsontest
/tests/networkxml2argvtest
/tests/nodeinfotest
/tests/nwfilterxml2xmltest
/tests/object-locking
/tests/object-locking-files.txt
/tests/object-locking.cm[ix]
/tests/openvzutilstest
/tests/qemuargv2xmltest
/tests/qemuhelptest
/tests/qemumonitortest
/tests/qemuxmlnstest
/tests/qparamtest
/tests/reconnect
/tests/secaatest
/tests/seclabeltest
/tests/sexpr2xmltest
/tests/shunloadtest
/tests/sockettest
/tests/ssh
/tests/statstest
/tests/utiltest
/tests/virauthconfigtest
/tests/virbuftest
/tests/virhashtest
/tests/virkeyfiletest
/tests/virnet*test
/tests/virshtest
/tests/virtimetest
/tests/viruritest
/tests/vmx2xmltest
/tests/xencapstest
/tests/xmconfigtest
/tools/*.[18]
/tools/libvirt-guests.init
/tools/virsh
/tools/virsh-*-edit.c
/tools/virt-*-validate
/tools/virt-sanlock-cleanup
/update.log
Makefile
Makefile.in

Submodule .gnulib updated: d5612c714c...dbd914496c

View File

@@ -26,9 +26,6 @@
<fsimonce@redhat.com> <federico.simoncelli@gmail.com>
<marcandre.lureau@redhat.com> <marcandre.lureau@gmail.com>
<supriyak@linux.vnet.ibm.com> <supriyak@in.ibm.com>
<neil@aldur.co.uk> <neil@brightbox.co.uk>
<stefanb@us.ibm.com> <stefanb@linux.vnet.ibm.com>
<josh.durgin@dreamhost.com> <joshd@hq.newdream.net>
# Name consolidation:
# Preferred author spelling <preferred email>

46
AUTHORS
View File

@@ -28,9 +28,6 @@ The primary maintainers and people with commit access rights:
Osier Yang <jyang@redhat.com>
Wen Congyang <wency@cn.fujitsu.com>
Michal Prívozník <mprivozn@redhat.com>
Peter Krempa <pkrempa@redhat.com>
Christophe Fergeau <cfergeau@redhat.com>
Alex Jia <ajia@redhat.com>
Previous maintainers:
Karel Zak <kzak@redhat.com>
@@ -74,11 +71,13 @@ Patches have also been contributed by:
Itamar Heim <iheim@redhat.com>
Markus Armbruster <armbru@redhat.com>
Ryota Ozaki <ozaki.ryota@gmail.com>
James Morris <jmorris@namei.org>
Daniel J Walsh <dwalsh@redhat.com>
Maximilian Wilhelm <max@rfc2324.org>
Pritesh Kothari <Pritesh.Kothari@Sun.COM>
Amit Shah <amit.shah@redhat.com>
Florian Vichot <florian.vichot@diateam.net>
Takahashi Tomohiro <takatom@jp.fujitsu.com>
Serge E. Hallyn <serue@us.ibm.com>
Soren Hansen <soren@linux2go.dk>
Abel Míguez Rodríguez<amiguezr@pdi.ucm.es>
@@ -143,7 +142,7 @@ Patches have also been contributed by:
Hu Tao <hutao@cn.fujitsu.com>
Laurent Léonard <laurent@open-minds.org>
MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
Josh Durgin <josh.durgin@dreamhost.com>
Josh Durgin <joshd@hq.newdream.net>
Roopa Prabhu <roprabhu@cisco.com>
Paweł Krześniak <pawel.krzesniak@gmail.com>
Kay Schubert <kayegypt@web.de>
@@ -157,6 +156,7 @@ Patches have also been contributed by:
Zdenek Styblik <stybla@turnovfree.net>
Gui Jianfeng <guijianfeng@cn.fujitsu.com>
Michal Novotny <minovotn@redhat.com>
Christophe Fergeau <cfergeau@redhat.com>
Markus Groß <gross@univention.de>
Phil Petty <phpetty@cisco.com>
Taku Izumi <izumi.taku@jp.fujitsu.com>
@@ -183,7 +183,9 @@ Patches have also been contributed by:
Guannan Ren <gren@redhat.com>
John Williams <john.williams@petalogix.com>
Michael Santos <michael.santos@gmail.com>
Alex Jia <ajia@redhat.com>
Oskari Saarenmaa <os@ohmu.fi>
Peter Krempa <pkrempa@redhat.com>
Nan Zhang <nzhang@redhat.com>
Wieland Hoffmann <themineo@googlemail.com>
Douglas Schilling Landgraf <dougsland@redhat.com>
@@ -193,41 +195,9 @@ Patches have also been contributed by:
Xu He Jie <xuhj@linux.vnet.ibm.com>
Lei Li <lilei@linux.vnet.ibm.com>
Matthias Witte <witte@netzquadrat.de>
Tang Chen <tangchen@cn.fujitsu.com>
Dan Horák <dan@danny.cz>
Sage Weil <sage@newdream.net>
David L Stevens <dlstevens@us.ibm.com>
Tyler Coumbes <coumbes@gmail.com>
Wen Ruo Lv <lvroyce@linux.vnet.ibm.com>
Patrice LACHANCE <patlachance@gmail.com>
Eli Qiao <taget@linux.vnet.ibm.com>
Michael Wood <esiotrot@gmail.com>
Bharata B Rao <bharata@linux.vnet.ibm.com>
Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Chang Liu <lingjiao.lc@taobao.com>
Lorin Hochstein <lorin@isi.edu>
Christian Franke <nobody@nowhere.ws>
Prerna Saxena <prerna@linux.vnet.ibm.com>
Michael Ellerman <michael@ellerman.id.au>
Rommer <rommer@active.by>
Yuri Chornoivan <yurchor@ukr.net>
Deepak C Shetty <deepakcs@linux.vnet.ibm.com>
Radu Caragea <dmns_serp@yahoo.com>
Stefan Bader <stefan.bader@canonical.com>
Martin Kletzander <mkletzan@redhat.com>
Laszlo Ersek <lersek@redhat.com>
Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
Marcelo Cerri <mhcerri@linux.vnet.ibm.com>
Hendrik Schwartke <hendrik@os-t.de>
Ansis Atteka <aatteka@nicira.com>
Dan Wendlandt <dan@nicira.com>
Kyle Mestery <kmestery@cisco.com>
Lincoln Myers <lincoln_myers@yahoo.com>
Peter Robinson <pbrobinson@gmail.com>
Benjamin Cama <benoar@dolka.fr>
Duncan Rance <libvirt@dunquino.com>
Peng Zhou <ailvpeng25@gmail.com>
Li Zhang <zhlcindy@linux.vnet.ibm.com>
Stef Walter <stefw@gnome.org>
Christian Benvenuti <benve@cisco.com>
[....send patches to get your name here....]

View File

@@ -882,7 +882,7 @@ Wed May 13 18:06:17 CEST 2009 Daniel Veillard <veillard@redhat.com>
Wed May 13 12:34:06 BST 2009 Daniel P. Berrange <berrange@redhat.com>
* src/lxc_container.c: Replace sys/capability.h with
linux/capability.h, to avoid unnecessary dependency
linux/capability.h, to avoid unneccessary dependancy
on the libcap package.
Tue May 12 16:39:06 EDT 2009 Cole Robinson <crobinso@redhat.com>
@@ -3351,7 +3351,7 @@ Tue Jan 20 20:22:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
Tue Jan 20 19:49:53 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* .x-sc_prohibit_nonreentrant: Blacklist some places where
use of non-threadsafe APIs are not necessary to check
use of non-threadsafe APIs are not neccessary to check
* Makefile.am, Makefile.maint, Makefile.nonreentrant: Add
check for non-reentrant safe API calls
* Makefile.cfg: Temporarily disable non-reentrant check
@@ -3591,7 +3591,7 @@ Thu Jan 15 19:54:19 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
* src/Makefile.am, src/threads.c, src/threads.h: Generic internal API for threads
* src/threads-pthread.c, src/threads-pthread.h: UNIX pthreads impl
* src/threads-win32.c, src/threads-win32.h: Win32 threads impl
* src/internal.h: Remove unnecessary pthreads macros
* src/internal.h: Remove unnneccessary pthreads macros
* src/libvirt_private.syms: Add symbols for internal threads API
* po/POTFILES.in: Add node_device_conf.c
* proxy/Makefile.am: Add threads.c to build
@@ -4262,7 +4262,7 @@ Thu Dec 18 11:50:58 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
Misc daemon bug fixes (John Levon)
* qemud/qemud.c: Fix conditional for node devices
* qemud/remote.c: Remove unnecessary path.h include
* qemud/remote.c: Remove unneccessary path.h include
Thu Dec 18 07:47:58 +0100 2008 Jim Meyering <meyering@redhat.com>
@@ -5032,7 +5032,7 @@ Tue Nov 25 11:17:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
Tue Nov 25 10:49:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
* src/Makefile.am: Remove unnecessary $(builddir) usage which
* src/Makefile.am: Remove unneccessary $(builddir) usage which
breaks on older automake. Remove duplicate CFLAGS from merge
error
* src/xen_unified.c: Wire up XM driver for autostart
@@ -5093,7 +5093,7 @@ Mon Nov 24 19:22:40 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
* tests/Makefile.am, tests/sexpr2xmltest.c,
tests/testutilsxen.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c: Disable all
Xen tests when Xen driver build is disabled. Remove unnecessary
Xen tests when Xen driver build is disabled. Remove unneccessary
WITH_XEN conditionals from source, since the entire build
is disabled in Makefile.am
@@ -6822,7 +6822,7 @@ Wed Aug 20 21:05:09 BST 2008 Daniel P. Berrange <berrange@redhat.com>
src/xen_unified.h, src/xend_internal.c, src/xend_internal.h,
src/xm_internal.c, src/xs_internal.c, src/xs_internal.h
tests/testutils.h: Remove preprocessor conditions for driver
compilation. Remove unnecessary "extern C" declarations.
compilation. Remove unneccessary "extern C" declarations.
Wed Aug 20 20:42:09 BST 2008 Daniel P. Berrange <berrange@redhat.com>
@@ -7008,7 +7008,7 @@ Fri Aug 8 16:41:24 BST 2008 Daniel Berrange <berrange@redhat.com>
src/storage_backend_fs.c, src/storage_backend_iscsi.c,
src/storage_backend_logical.c, src/util.c, src/util.h,
src/veth.c, tests/qemuxml2argvtest.c: Fix const-correctness
of virRun and virExec, and remove unnecessary casts in callers
of virRun and virExec, and remove unneccessary casts in callers
Fri Aug 8 16:53:24 CEST 2008 Daniel Veillard <veillard@redhat.com>
@@ -7530,7 +7530,7 @@ Wed Jul 16 16:44:27 CEST 2008 Daniel Veillard <veillard@redhat.com>
Sat Jul 12 14:52:59 BST 2008 Daniel P. Berrange <berrange@redhat.com>
* src/qemu_conf.c: Remove unnecessary c-ctype.h include
* src/qemu_conf.c: Remove unneccessary c-ctype.h include
Fri Jul 11 20:32:59 BST 2008 Daniel P. Berrange <berrange@redhat.com>
@@ -8612,7 +8612,7 @@ Thu May 1 14:10:28 EST 2008 Daniel P. Berrange <berrange@redhat.com>
Tue Apr 29 12:32:28 EST 2008 Daniel P. Berrange <berrange@redhat.com>
* configure.in: Remove compatibility macros AC_CHECK_*_ONCE for
* configure.in: Remove compatability macros AC_CHECK_*_ONCE for
now part of onceonly.m4 in gnulib/m4/
Wed Apr 29 18:10:00 CEST 2008 Jim Meyering <meyering@redhat.com>
@@ -8628,7 +8628,7 @@ Wed Apr 29 18:10:00 CEST 2008 Jim Meyering <meyering@redhat.com>
Tue Apr 29 11:54:28 EST 2008 Daniel P. Berrange <berrange@redhat.com>
* configure.in: Add compatibility macros AC_CHECK_*_ONCE for
* configure.in: Add compatability macros AC_CHECK_*_ONCE for
older autoconf (RHEL-5 vintage)
Tue Apr 29 08:13:28 EST 2008 Daniel P. Berrange <berrange@redhat.com>
@@ -10247,7 +10247,7 @@ Fri Jan 25 12:00:00 BST 2008 Richard W.M. Jones <rjones@redhat.com>
Fri Jan 25 10:46:32 CET 2008 Daniel Veillard <veillard@redhat.com>
* src/xen_internal.c: fix an erroneous use of VIR_DOMAIN_NONE instead
* src/xen_internal.c: fix an erronous use of VIR_DOMAIN_NONE instead
of VIR_DOMAIN_NOSTATE (both defined as 0, no regression)
Thu Jan 24 18:08:28 CET 2008 Daniel Veillard <veillard@redhat.com>
@@ -10283,8 +10283,8 @@ Tue Jan 22 16:27:47 EST 2008 Daniel P. Berrange <berrange@redhat.com>
* configure.ac: Remove use of PKG_CHECK_EXISTS macro. Avoid
lines going over 80 chars wide. Make sasl check automatic
enable/disable as necessary.
* acinclude.m4: Added compatibility macro for old pkg-config
enable/disable as neccessary.
* acinclude.m4: Added compatability macro for old pkg-config
* src/gnutls_1_0_compat.h: Add compat for gnutls_cipher_algorithm_t
Mon Jan 21 18:03:47 CET 2008 Jim Meyering <meyering@redhat.com>
@@ -11617,7 +11617,7 @@ Tue Oct 23 17:30:52 CEST 2007 Daniel Veillard <veillard@redhat.com>
Mon Oct 22 22:33:59 CEST 2007 Daniel Veillard <veillard@redhat.com>
* src/xen_internal.c src/xen_unified.c src/xen_unified.h
src/xend_internal.c src/xml.c src/xml.h: committed erroneously
src/xend_internal.c src/xml.c src/xml.h: commited erronously
the NUMA patches sent for review on the list in last commit.
But that should not affect non NUMA users so early push should
not be a problem.
@@ -12117,7 +12117,7 @@ Mon Aug 13 21:18:48 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/util.h, src/util.c: Allow a file descriptor to be supplied
for STDIN when calling virExec(), or if -1, redirect from /dev/null
* src/qemu_driver.c, src/openvz_driver.c: Pass in -1 for new stdin
parameter above where necessary. Patch from Jim Paris
parameter above where neccessary. Patch from Jim Paris
Mon Aug 13 20:13:48 EST 2007 Daniel P. Berrange <berrange@redhat.com>
@@ -15485,7 +15485,7 @@ Fri Aug 4 20:19:23 EDT 2006 Daniel Berrange <berrange@redhat.com>
* src/libvirt.c: Fix off-by-one in validated VCPU number (it is
zero based, not one based).
* include/libvirt/libvirt.h: Add some convenience macros for
calculating necessary CPU map lengths & total host CPUs
calculating neccessary CPU map lengths & total host CPUs
* src/virsh.c: Add 'vcpuinfo' and 'vcpumap' commands
Fri Aug 4 14:45:25 CEST 2006 Daniel Veillard <veillard@redhat.com>
@@ -15708,7 +15708,7 @@ Wed Jun 14 13:10:03 EDT 2006 Daniel Veillard <veillard@redhat.com>
Tue Jun 13 14:06:01 EDT 2006 Daniel P. Berrange <berrange@redhat.com>
* src/virsh.c: use 'double' instead of 'float' when calculating
'CPU time' field for dominfo command, to ensure no unnecessary
'CPU time' field for dominfo command, to ensure no unneccessary
loss of precision converting from nanoseconds to seconds.
Tue Jun 13 18:35:22 EDT 2006 Daniel Veillard <veillard@redhat.com>

View File

@@ -496,13 +496,6 @@ following semantically named macros
- To avoid having to check if a or b are NULL:
STREQ_NULLABLE(a, b)
STRNEQ_NULLABLE(a, b)

View File

@@ -15,12 +15,9 @@ rm -rf build
mkdir build
cd build
# Run with options not normally exercised by the rpm build, for
# more complete code coverage.
../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
--enable-test-coverage \
--disable-nls \
--enable-werror
--enable-compile-warnings=error
# If the MAKEFLAGS envvar does not yet include a -j option,
# add -jN where N depends on the number of processors.
@@ -64,7 +61,6 @@ if [ -f /usr/bin/rpmbuild ]; then
-ba --clean libvirt.spec
fi
# Test mingw cross-compile
if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
make distclean
@@ -74,9 +70,22 @@ if [ -x /usr/bin/i686-pc-mingw32-gcc ]; then
--build=$(uname -m)-pc-linux \
--host=i686-pc-mingw32 \
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-pc-mingw32/sys-root/mingw" \
--enable-werror \
--without-libvirtd \
--without-python
--enable-compile-warnings=error \
--without-sasl \
--without-avahi \
--without-polkit \
--without-python \
--without-xen \
--without-qemu \
--without-lxc \
--without-uml \
--without-vbox \
--without-openvz \
--without-phyp \
--without-netcf \
--without-audit \
--without-dtrace \
--without-libvirtd
make
make install

View File

@@ -41,13 +41,10 @@ fi
# is required. The first is just the SHA1 that selects a gnulib snapshot.
# The second ensures that whenever we change the set of gnulib modules used
# by this package, we rerun bootstrap to pull in the matching set of files.
# The third ensures that whenever we change the set of local gnulib diffs,
# we rerun bootstrap to pull in those diffs.
bootstrap_hash()
{
git submodule status | sed 's/^[ +-]//;s/ .*//'
git hash-object bootstrap.conf
git ls-tree -d HEAD gnulib/local | awk '{print $3}'
}
# Ensure that whenever we pull in a gnulib update or otherwise change to a

267
bootstrap
View File

@@ -1,6 +1,6 @@
#! /bin/sh
# Print a version string.
scriptversion=2012-02-11.09; # UTC
scriptversion=2012-07-19.14; # UTC
# Bootstrap this package from checked-out sources.
@@ -36,6 +36,10 @@ nl='
LC_ALL=C
export LC_ALL
# Ensure that CDPATH is not set. Otherwise, the output from cd
# would cause trouble in at least one use below.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
local_gl_dir=gl
me=$0
@@ -73,6 +77,33 @@ Running without arguments will suffice in most cases.
EOF
}
# warnf_ FORMAT-STRING ARG1...
warnf_ ()
{
warnf_format_=$1
shift
nl='
'
case $* in
*$nl*) me_=$(printf "$me"|tr "$nl|" '??')
printf "$warnf_format_" "$@" | sed "s|^|$me_: |" ;;
*) printf "$me: $warnf_format_" "$@" ;;
esac >&2
}
# warn_ WORD1...
warn_ ()
{
# If IFS does not start with ' ', set it and emit the warning in a subshell.
case $IFS in
' '*) warnf_ '%s\n' "$*";;
*) (IFS=' '; warn_ "$@");;
esac
}
# die WORD1...
die() { warn_ "$@"; exit 1; }
# Configuration.
# Name of the Makefile.am
@@ -126,7 +157,8 @@ extract_package_name='
p
}
'
package=`sed -n "$extract_package_name" configure.ac` || exit
package=$(sed -n "$extract_package_name" configure.ac) \
|| die 'cannot find package name in configure.ac'
gnulib_name=lib$package
build_aux=build-aux
@@ -182,6 +214,8 @@ use_git=true
# otherwise find the first of the NAMES that can be run (i.e.,
# supports --version). If found, set ENVVAR to the program name,
# die otherwise.
#
# FIXME: code duplication, see also gnu-web-doc-update.
find_tool ()
{
find_tool_envvar=$1
@@ -199,19 +233,15 @@ find_tool ()
else
find_tool_error_prefix="\$$find_tool_envvar: "
fi
if test x"$find_tool_res" = x; then
echo >&2 "$me: one of these is required: $find_tool_names"
exit 1
fi
($find_tool_res --version </dev/null) >/dev/null 2>&1 || {
echo >&2 "$me: ${find_tool_error_prefix}cannot run $find_tool_res --version"
exit 1
}
test x"$find_tool_res" != x \
|| die "one of these is required: $find_tool_names"
($find_tool_res --version </dev/null) >/dev/null 2>&1 \
|| die "${find_tool_error_prefix}cannot run $find_tool_res --version"
eval "$find_tool_envvar=\$find_tool_res"
eval "export $find_tool_envvar"
}
# Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6.
# Find sha1sum, named gsha1sum on MacPorts, and shasum on Mac OS X 10.6.
find_tool SHA1SUM sha1sum gsha1sum shasum
# Override the default configuration, if necessary.
@@ -226,7 +256,6 @@ esac
test -z "${gnulib_extra_files}" && \
gnulib_extra_files="
$build_aux/install-sh
$build_aux/missing
$build_aux/mdate-sh
$build_aux/texinfo.tex
$build_aux/depcomp
@@ -252,7 +281,7 @@ do
usage
exit;;
--gnulib-srcdir=*)
GNULIB_SRCDIR=`expr "X$option" : 'X--gnulib-srcdir=\(.*\)'`;;
GNULIB_SRCDIR=${option#--gnulib-srcdir=};;
--skip-po)
SKIP_PO=t;;
--force)
@@ -266,21 +295,15 @@ do
--no-git)
use_git=false;;
*)
echo >&2 "$0: $option: unknown option"
exit 1;;
die "$option: unknown option";;
esac
done
if $use_git || test -d "$GNULIB_SRCDIR"; then
:
else
echo "$0: Error: --no-git requires --gnulib-srcdir" >&2
exit 1
fi
$use_git || test -d "$GNULIB_SRCDIR" \
|| die "Error: --no-git requires --gnulib-srcdir"
if test -n "$checkout_only_file" && test ! -r "$checkout_only_file"; then
echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
exit 1
die "Bootstrapping from a non-checked-out distribution is risky."
fi
# Ensure that lines starting with ! sort last, per gitignore conventions
@@ -303,10 +326,10 @@ insert_sorted_if_absent() {
file=$1
str=$2
test -f $file || touch $file
echo "$str" | sort_patterns - $file | cmp - $file > /dev/null \
echo "$str" | sort_patterns - $file | cmp -s - $file > /dev/null \
|| { echo "$str" | sort_patterns - $file > $file.bak \
&& mv $file.bak $file; } \
|| exit 1
|| die "insert_sorted_if_absent $file $str: failed"
}
# Adjust $PATTERN for $VC_IGNORE_FILE and insert it with
@@ -319,7 +342,7 @@ insert_vc_ignore() {
# A .gitignore entry that does not start with '/' applies
# recursively to subdirectories, so prepend '/' to every
# .gitignore entry.
pattern=`echo "$pattern" | sed s,^,/,`;;
pattern=$(echo "$pattern" | sed s,^,/,);;
esac
insert_sorted_if_absent "$vc_ignore_file" "$pattern"
}
@@ -330,11 +353,8 @@ grep '^[ ]*AC_CONFIG_AUX_DIR(\['"$build_aux"'\])' configure.ac \
>/dev/null && found_aux_dir=yes
grep '^[ ]*AC_CONFIG_AUX_DIR('"$build_aux"')' configure.ac \
>/dev/null && found_aux_dir=yes
if test $found_aux_dir = no; then
echo "$0: expected line not found in configure.ac. Add the following:" >&2
echo " AC_CONFIG_AUX_DIR([$build_aux])" >&2
exit 1
fi
test $found_aux_dir = yes \
|| die "configure.ac lacks 'AC_CONFIG_AUX_DIR([$build_aux])'; add it"
# If $build_aux doesn't exist, create it now, otherwise some bits
# below will malfunction. If creating it, also mark it as ignored.
@@ -423,31 +443,48 @@ check_versions() {
$use_git || continue
fi
# Honor $APP variables ($TAR, $AUTOCONF, etc.)
appvar=`echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_'`
appvar=$(echo $app | LC_ALL=C tr '[a-z]-' '[A-Z]_')
test "$appvar" = TAR && appvar=AMTAR
case $appvar in
GZIP) ;; # Do not use $GZIP: it contains gzip options.
*) eval "app=\${$appvar-$app}" ;;
esac
# Handle the still-experimental Automake-NG programs specially.
# They remain named as the mainstream Automake programs ("automake",
# and "aclocal") to avoid gratuitous incompatibilities with
# pre-existing usages (by, say, autoreconf, or custom autogen.sh
# scripts), but correctly identify themselves (as being part of
# "GNU automake-ng") when asked their version.
case $app in
automake-ng|aclocal-ng)
app=${app%-ng}
($app --version | grep '(GNU automake-ng)') >/dev/null 2>&1 || {
warn_ "Error: '$app' not found or not from Automake-NG"
ret=1
continue
} ;;
esac
if [ "$req_ver" = "-" ]; then
# Merely require app to exist; not all prereq apps are well-behaved
# so we have to rely on $? rather than get_version.
$app --version >/dev/null 2>&1
if [ 126 -le $? ]; then
echo "$me: Error: '$app' not found" >&2
warn_ "Error: '$app' not found"
ret=1
fi
else
# Require app to produce a new enough version string.
inst_ver=$(get_version $app)
if [ ! "$inst_ver" ]; then
echo "$me: Error: '$app' not found" >&2
warn_ "Error: '$app' not found"
ret=1
else
latest_ver=$(sort_ver $req_ver $inst_ver | cut -d' ' -f2)
if [ ! "$latest_ver" = "$inst_ver" ]; then
echo "$me: Error: '$app' version == $inst_ver is too old" >&2
echo " '$app' version >= $req_ver is required" >&2
warnf_ '%s\n' \
"Error: '$app' version == $inst_ver is too old" \
" '$app' version >= $req_ver is required"
ret=1
fi
fi
@@ -492,10 +529,8 @@ esac
# When we can deduce that gnulib-tool will require patch,
# and when patch is not already listed as a prerequisite, add it, too.
if test ! -d "$local_gl_dir" \
|| find "$local_gl_dir" -name '*.diff' -exec false {} +; then
:
else
if test -d "$local_gl_dir" \
&& ! find "$local_gl_dir" -name '*.diff' -exec false {} +; then
case $buildreq in
*patch*) ;;
*) buildreq="patch -
@@ -506,11 +541,10 @@ fi
if ! printf "$buildreq" | check_versions; then
echo >&2
if test -f README-prereq; then
echo "$0: See README-prereq for how to get the prerequisite programs" >&2
die "See README-prereq for how to get the prerequisite programs"
else
echo "$0: Please install the prerequisite programs" >&2
die "Please install the prerequisite programs"
fi
exit 1
fi
echo "$0: Bootstrapping from checked-out $package sources..."
@@ -539,7 +573,7 @@ git_modules_config () {
test -f .gitmodules && git config --file .gitmodules "$@"
}
gnulib_path=`git_modules_config submodule.gnulib.path`
gnulib_path=$(git_modules_config submodule.gnulib.path)
test -z "$gnulib_path" && gnulib_path=gnulib
# Get gnulib files.
@@ -612,10 +646,10 @@ download_po_files() {
subdir=$1
domain=$2
echo "$me: getting translations into $subdir for $domain..."
cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
cmd=$(printf "$po_download_command_format" "$domain" "$subdir")
eval "$cmd" && return
# Fallback to HTTP.
cmd=`printf "$po_download_command_format2" "$subdir" "$domain"`
cmd=$(printf "$po_download_command_format2" "$subdir" "$domain")
eval "$cmd"
}
@@ -638,7 +672,7 @@ update_po_files() {
&& ls "$ref_po_dir"/*.po 2>/dev/null |
sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS" || return
langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
langs=$(cd $ref_po_dir && echo *.po | sed 's/\.po//g')
test "$langs" = '*' && langs=x
for po in $langs; do
case $po in x) continue;; esac
@@ -675,18 +709,18 @@ symlink_to_dir()
# If the destination directory doesn't exist, create it.
# This is required at least for "lib/uniwidth/cjk.h".
dst_dir=`dirname "$dst"`
dst_dir=$(dirname "$dst")
if ! test -d "$dst_dir"; then
mkdir -p "$dst_dir"
# If we've just created a directory like lib/uniwidth,
# tell version control system(s) it's ignorable.
# FIXME: for now, this does only one level
parent=`dirname "$dst_dir"`
parent=$(dirname "$dst_dir")
for dot_ig in x $vc_ignore; do
test $dot_ig = x && continue
ig=$parent/$dot_ig
insert_vc_ignore $ig `echo "$dst_dir"|sed 's,.*/,,'`
insert_vc_ignore $ig "${dst_dir##*/}"
done
fi
@@ -710,10 +744,10 @@ symlink_to_dir()
# so that broken tools aren't confused into skipping needed builds. See
# <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>.
test -h "$dst" &&
src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
test "$src_i" = "$dst_i" &&
both_ls=`ls -dt "$src" "$dst"` &&
both_ls=$(ls -dt "$src" "$dst") &&
test "X$both_ls" = "X$dst$nl$src" || {
dot_dots=
case $src in
@@ -721,11 +755,10 @@ symlink_to_dir()
*)
case /$dst/ in
*//* | */../* | */./* | /*/*/*/*/*/)
echo >&2 "$me: invalid symlink calculation: $src -> $dst"
exit 1;;
/*/*/*/*/) dot_dots=../../../;;
/*/*/*/) dot_dots=../../;;
/*/*/) dot_dots=../;;
die "invalid symlink calculation: $src -> $dst";;
/*/*/*/*/) dot_dots=../../../;;
/*/*/*/) dot_dots=../../;;
/*/*/) dot_dots=../;;
esac;;
esac
@@ -736,6 +769,22 @@ symlink_to_dir()
}
}
version_controlled_file() {
parent=$1
file=$2
if test -d .git; then
git rm -n "$file" > /dev/null 2>&1
elif test -d .svn; then
svn log -r HEAD "$file" > /dev/null 2>&1
elif test -d CVS; then
grep -F "/${file##*/}/" "$parent/CVS/Entries" 2>/dev/null |
grep '^/[^/]*/[0-9]' > /dev/null
else
warn_ "no version control for $file?"
false
fi
}
# NOTE: we have to be careful to run both autopoint and libtoolize
# before gnulib-tool, since gnulib-tool is likely to provide newer
# versions of files "installed" by these two programs.
@@ -748,37 +797,54 @@ with_gettext=yes
grep '^[ ]*AM_GNU_GETTEXT_VERSION(' configure.ac >/dev/null || \
with_gettext=no
if test $with_gettext = yes; then
# Released autopoint has the tendency to install macros that have been
# obsoleted in current gnulib, so run this before gnulib-tool.
echo "$0: $AUTOPOINT --force"
$AUTOPOINT --force || exit
fi
if test $with_gettext = yes || test $use_libtool = 1; then
# Autoreconf runs aclocal before libtoolize, which causes spurious
# warnings if the initial aclocal is confused by the libtoolized
# (or worse out-of-date) macro directory.
if test $use_libtool = 1; then
echo "running: $LIBTOOLIZE --copy --install"
$LIBTOOLIZE --copy --install
fi
tempbase=.bootstrap$$
trap "rm -f $tempbase.0 $tempbase.1" 1 2 13 15
version_controlled_file() {
dir=$1
file=$2
found=no
if test -d CVS; then
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
grep '^/[^/]*/[0-9]' > /dev/null && found=yes
elif test -d .git; then
git rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
elif test -d .svn; then
svn log -r HEAD "$dir/$file" > /dev/null 2>&1 && found=yes
else
echo "$me: no version control for $dir/$file?" >&2
> $tempbase.0 > $tempbase.1 &&
find . ! -type d -print | sort > $tempbase.0 || exit
if test $with_gettext = yes; then
# Released autopoint has the tendency to install macros that have been
# obsoleted in current gnulib, so run this before gnulib-tool.
echo "$0: $AUTOPOINT --force"
$AUTOPOINT --force || exit
fi
test $found = yes
}
# Autoreconf runs aclocal before libtoolize, which causes spurious
# warnings if the initial aclocal is confused by the libtoolized
# (or worse out-of-date) macro directory.
# libtoolize 1.9b added the --install option; but we support back
# to libtoolize 1.5.22, where the install action was default.
if test $use_libtool = 1; then
install=
case $($LIBTOOLIZE --help) in
*--install*) install=--install ;;
esac
echo "running: $LIBTOOLIZE $install --copy"
$LIBTOOLIZE $install --copy
fi
find . ! -type d -print | sort >$tempbase.1
old_IFS=$IFS
IFS=$nl
for file in $(comm -13 $tempbase.0 $tempbase.1); do
IFS=$old_IFS
parent=${file%/*}
version_controlled_file "$parent" "$file" || {
for dot_ig in x $vc_ignore; do
test $dot_ig = x && continue
ig=$parent/$dot_ig
insert_vc_ignore "$ig" "${file##*/}"
done
}
done
IFS=$old_IFS
rm -f $tempbase.0 $tempbase.1
trap - 1 2 13 15
fi
# Import from gnulib.
@@ -804,11 +870,12 @@ echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
for file in $gnulib_files; do
symlink_to_dir "$GNULIB_SRCDIR" $file || exit
symlink_to_dir "$GNULIB_SRCDIR" $file \
|| die "failed to symlink $file"
done
bootstrap_post_import_hook \
|| { echo >&2 "$me: bootstrap_post_import_hook failed"; exit 1; }
|| die "bootstrap_post_import_hook failed"
# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some
# gnulib-populated directories. Such .m4 files would cause aclocal to fail.
@@ -836,16 +903,17 @@ echo "running: AUTOPOINT=true LIBTOOLIZE=true " \
"$AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS"
AUTOPOINT=true LIBTOOLIZE=true \
$AUTORECONF --verbose --install $no_recursive -I $m4_base $ACLOCAL_FLAGS \
|| exit 1
|| die "autoreconf failed"
# Get some extra files from gnulib, overriding existing files.
for file in $gnulib_extra_files; do
case $file in
*/INSTALL) dst=INSTALL;;
build-aux/*) dst=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;;
build-aux/*) dst=$build_aux/${file#build-aux/};;
*) dst=$file;;
esac
symlink_to_dir "$GNULIB_SRCDIR" $file $dst || exit
symlink_to_dir "$GNULIB_SRCDIR" $file $dst \
|| die "failed to symlink $file"
done
if test $with_gettext = yes; then
@@ -861,7 +929,19 @@ if test $with_gettext = yes; then
a\
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
}
' po/Makevars.template >po/Makevars || exit 1
' po/Makevars.template >po/Makevars \
|| die 'cannot generate po/Makevars'
# If the 'gettext' module is in use, grab the latest Makefile.in.in.
# If only the 'gettext-h' module is in use, assume autopoint already
# put the correct version of this file into place.
case $gnulib_modules in
*gettext-h*) ;;
*gettext*)
cp $GNULIB_SRCDIR/build-aux/po/Makefile.in.in po/Makefile.in.in \
|| die "cannot create po/Makefile.in.in"
;;
esac
if test -d runtime-po; then
# Similarly for runtime-po/Makevars, but not quite the same.
@@ -875,7 +955,8 @@ if test $with_gettext = yes; then
a\
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
}
' po/Makevars.template >runtime-po/Makevars || exit 1
' po/Makevars.template >runtime-po/Makevars \
|| die 'cannot generate runtime-po/Makevars'
# Copy identical files from po to runtime-po.
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)

View File

@@ -23,7 +23,6 @@ accept
areadlink
base64
bind
bitrotate
byteswap
c-ctype
c-strcase
@@ -41,7 +40,6 @@ environ
fclose
fcntl
fcntl-h
fdatasync
ffs
fnmatch
fsync
@@ -60,6 +58,7 @@ ignore-value
inet_pton
intprops
ioctl
isatty
largefile
listen
maintainer-makefile
@@ -69,7 +68,6 @@ mkstemps
mktempd
netdb
nonblocking
openpty
passfd
perror
physmem
@@ -80,6 +78,7 @@ posix-shell
pthread
pthread_sigmask
recv
regex
random_r
sched
send
@@ -103,7 +102,6 @@ sys_wait
termios
time_r
timegm
ttyname_r
uname
useless-if-before-free
usleep
@@ -161,10 +159,9 @@ fi
# Tell gnulib to:
# require LGPLv2+
# apply any local diffs in gnulib/local/ dir
# put *.m4 files in new gnulib/m4/ dir
# put *.[ch] files in new gnulib/lib/ dir
# import gnulib tests in new gnulib/tests/ dir
# put *.[ch] files in new gnulib/lib/ dir.
# import gnulib tests in new gnulib/tests/ dir.
gnulib_name=libgnu
m4_base=gnulib/m4
source_base=gnulib/lib
@@ -173,10 +170,7 @@ gnulib_tool_option_extras="\
--lgpl=2\
--with-tests\
--makefile-name=gnulib.mk\
--avoid=pt_chown\
--avoid=lock-tests\
"
local_gl_dir=gnulib/local
# Convince bootstrap to use multiple m4 directories.
: ${ACLOCAL=aclocal}
@@ -184,12 +178,6 @@ ACLOCAL="$ACLOCAL -I m4"
export ACLOCAL
# Build prerequisites
# Note that some of these programs are only required for 'make dist' to
# succeed from a fresh git checkout; not all of these programs are
# required to run 'make dist' on a tarball. As a special case, we want
# to require the equivalent of the Fedora python-devel package, but
# RHEL 5 lacks the witness python-config package; we hack around that
# old environment below.
buildreq="\
autoconf 2.59
automake 1.9.6
@@ -198,22 +186,11 @@ gettext 0.17
git 1.5.5
gzip -
libtool -
patch -
perl 5.5
pkg-config -
python-config -
rpcgen -
tar -
xmllint -
xsltproc -
"
# Use rpm as a fallback to bypass the bootstrap probe for python-config,
# for the sake of RHEL 5; without requiring it on newer systems that
# have python-config to begin with.
if `(${PYTHON_CONFIG-python-config} --version;
test $? -lt 126 || rpm -q python-devel) >/dev/null 2>&1`; then
PYTHON_CONFIG=true
fi
# Automake requires that ChangeLog exist.
touch ChangeLog || exit 1
@@ -221,7 +198,6 @@ touch ChangeLog || exit 1
# Override bootstrap's list - we don't use mdate-sh or texinfo.tex.
gnulib_extra_files="
$build_aux/install-sh
$build_aux/missing
$build_aux/depcomp
$build_aux/config.guess
$build_aux/config.sub

125
cfg.mk
View File

@@ -1,5 +1,5 @@
# Customize Makefile.maint. -*- makefile -*-
# Copyright (C) 2008-2012 Red Hat, Inc.
# Copyright (C) 2008-2011 Red Hat, Inc.
# Copyright (C) 2003-2008 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
@@ -36,9 +36,6 @@ generated_files = \
$(srcdir)/src/remote/*_protocol.[ch] \
$(srcdir)/gnulib/lib/*.[ch]
# We haven't converted all scripts to using gnulib's init.sh yet.
_test_script_regex = \<\(init\|test-lib\)\.sh\>
# Tests not to run as part of "make distcheck".
local-checks-to-skip = \
changelog-check \
@@ -76,6 +73,17 @@ local-checks-to-skip = \
sc_makefile_check \
sc_useless_cpp_parens
# Most developers don't run 'make distcheck'. We want the official
# dist to be secure, but don't want to penalize other developers
# using a distro that has not yet picked up the automake fix.
# FIXME remove this ifeq (making the syntax check unconditional)
# once fixed automake (1.11.6 or 1.12.2+) is more common.
ifeq ($(filter dist%, $(MAKECMDGOALS)), )
local-checks-to-skip += sc_vulnerable_makefile_CVE-2012-3386
else
distdir: sc_vulnerable_makefile_CVE-2012-3386
endif
# Files that should never cause syntax check failures.
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
(^(HACKING|docs/(news\.html\.in|.*\.patch))|\.po)$$
@@ -171,7 +179,6 @@ useless_free_options = \
--name=xmlBufferFree \
--name=xmlFree \
--name=xmlFreeDoc \
--name=xmlFreeNode \
--name=xmlXPathFreeContext \
--name=xmlXPathFreeObject
@@ -316,12 +323,6 @@ sc_prohibit_internal_functions:
halt='use VIR_ macros instead of internal functions' \
$(_sc_search_regexp)
# Avoid raw malloc and free, except in documentation comments.
sc_prohibit_raw_allocation:
@prohibit='^.[^*].*\<((m|c|re)alloc|free) *\([^)]' \
halt='use VIR_ macros from memory.h instead of malloc/free' \
$(_sc_search_regexp)
# Avoid functions that can lead to double-close bugs.
sc_prohibit_close:
@prohibit='([^>.]|^)\<[fp]?close *\(' \
@@ -346,12 +347,12 @@ sc_prohibit_access_xok:
# Similar to the gnulib maint.mk rule for sc_prohibit_strcmp
# Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
snp_ = strncmp *\(.+\)
sc_prohibit_strncmp:
@prohibit='! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)' \
exclude=':# *define STR(N?EQLEN|PREFIX)\(' \
halt='$(ME): use STREQLEN or STRPREFIX instead of str''ncmp' \
$(_sc_search_regexp)
@grep -nE '! *str''ncmp *\(|\<str''ncmp *\(.+\) *[!=]=' \
$$($(VC_LIST_EXCEPT)) \
| grep -vE ':# *define STR(N?EQLEN|PREFIX)\(' && \
{ echo '$(ME): use STREQLEN or STRPREFIX instead of str''ncmp' \
1>&2; exit 1; } || :
# Use virAsprintf rather than as'printf since *strp is undefined on error.
sc_prohibit_asprintf:
@@ -372,11 +373,6 @@ sc_prohibit_sprintf:
halt='use snprintf, not s'printf \
$(_sc_search_regexp)
sc_prohibit_strncpy:
@prohibit='strncpy *\(' \
halt='use virStrncpy, not strncpy' \
$(_sc_search_regexp)
sc_prohibit_readlink:
@prohibit='readlink *\(' \
halt='use virFileResolveLink, not readlink' \
@@ -416,26 +412,14 @@ sc_prohibit_ctype_h:
halt="don't use ctype.h; instead, use c-ctype.h" \
$(_sc_search_regexp)
# Insist on correct types for [pug]id.
sc_correct_id_types:
@prohibit='\<(int|long) *[pug]id\>' \
halt="use pid_t for pid, uid_t for uid, gid_t for gid" \
$(_sc_search_regexp)
# Forbid sizeof foo or sizeof (foo), require sizeof(foo)
sc_size_of_brackets:
@prohibit='sizeof\s' \
halt='use sizeof(foo), not sizeof (foo) or sizeof foo' \
$(_sc_search_regexp)
# Ensure that no C source file, docs, or rng schema uses TABs for
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
# files in gnulib, since they're imported.
space_indent_files=(\.(rng|s?[ch](\.in)?|html.in|py|syms)|(daemon|tools)/.*\.in)
space_indent_files=(\.(rng|s?[ch](\.in)?|html.in|py)|(daemon|tools)/.*\.in)
sc_TAB_in_indentation:
@prohibit='^ * ' \
in_vc_files='$(space_indent_files)$$' \
halt='indent with space, not TAB, in C, sh, html, py, syms and RNG schemas' \
halt='indent with space, not TAB, in C, sh, html, py, and RNG schemas' \
$(_sc_search_regexp)
ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
@@ -469,18 +453,6 @@ sc_prohibit_xmlGetProp:
halt='use virXMLPropString, not xmlGetProp' \
$(_sc_search_regexp)
# xml(ParseURI|SaveUri) doesn't handle IPv6 URIs well
sc_prohibit_xmlURI:
@prohibit='\<xml(ParseURI|SaveUri) *\(' \
halt='use virURI(Parse|Format), not xml(ParseURI|SaveUri)' \
$(_sc_search_regexp)
# we don't want old old-style return with parentheses around argument
sc_prohibit_return_as_function:
@prohibit='\<return *\(([^()]*(\([^()]*\)[^()]*)*)\) *;' \
halt='avoid extra () with return statements' \
$(_sc_search_regexp)
# ATTRIBUTE_UNUSED should only be applied in implementations, not
# header declarations
sc_avoid_attribute_unused_in_header:
@@ -586,10 +558,11 @@ func_re := ($(func_or))
# _("...: "
# "%s", _("no storage vol w..."
sc_libvirt_unmarked_diagnostics:
@prohibit='\<$(func_re) *\([^"]*"[^"]*[a-z]{3}' \
exclude='_\(' \
halt='$(ME): found unmarked diagnostic(s)' \
$(_sc_search_regexp)
@grep -nE \
'\<$(func_re) *\([^"]*"[^"]*[a-z]{3}' $$($(VC_LIST_EXCEPT)) \
| grep -v '_''(' && \
{ echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
exit 1; } || :
@{ grep -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT)); \
grep -A1 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
| sed 's/_("[^"][^"]*"//;s/[ ]"%s"//' \
@@ -640,37 +613,6 @@ sc_prohibit_gettext_markup:
halt='do not mark these strings for translation' \
$(_sc_search_regexp)
# Our code is divided into modular subdirectories for a reason, and
# lower-level code must not include higher-level headers.
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
sc_prohibit_cross_inclusion:
@for dir in $(cross_dirs); do \
case $$dir in \
util/) safe="util";; \
cpu/ | locking/ | network/ | rpc/ | security/) \
safe="($$dir|util|conf)";; \
xenapi/ | xenxs/ ) safe="($$dir|util|conf|xen)";; \
*) safe="($$dir|util|conf|cpu|network|locking|rpc|security)";; \
esac; \
in_vc_files="^src/$$dir" \
prohibit='^# *include .$(cross_dirs_re)' \
exclude="# *include .$$safe" \
halt='unsafe cross-directory include' \
$(_sc_search_regexp) \
done
# When converting an enum to a string, make sure that we track any new
# elements added to the enum by using a _LAST marker.
sc_require_enum_last_marker:
@grep -A1 -nE '^[^#]*VIR_ENUM_IMPL *\(' $$($(VC_LIST_EXCEPT)) \
| sed -ne '/VIR_ENUM_IMPL[^,]*,$$/N' \
-e '/VIR_ENUM_IMPL[^,]*,[^,]*[^_,][^L,][^A,][^S,][^T,],/p' \
-e '/VIR_ENUM_IMPL[^,]*,[^,]\{0,4\},/p' \
| grep . && \
{ echo '$(ME): enum impl needs to use _LAST marker' 1>&2; \
exit 1; } || :
# We don't use this feature of maint.mk.
prev_version_file = /dev/null
@@ -691,7 +633,6 @@ ifeq (0,$(MAKELEVEL))
test -f po/Makevars || { echo 1; exit; }; \
actual=$$(git submodule status | $(_submodule_hash); \
git hash-object bootstrap.conf; \
git ls-tree -d HEAD gnulib/local | awk '{print $$3}'; \
git diff .gnulib); \
stamp="$$($(_submodule_hash) $(_curr_status) 2>/dev/null)"; \
test "$$stamp" = "$$actual"; echo $$?)
@@ -741,13 +682,13 @@ $(srcdir)/src/remote/remote_client_bodies.h: $(srcdir)/src/remote/remote_protoco
# List all syntax-check exemptions:
exclude_file_name_regexp--sc_avoid_strcase = ^tools/virsh\.c$$
_src1=libvirt|fdstream|qemu/qemu_monitor|util/(command|util)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller
_src1=libvirt|fdstream|qemu/qemu_monitor|util/(command|util)|xen/xend_internal|rpc/virnetsocket
exclude_file_name_regexp--sc_avoid_write = \
^(src/($(_src1))|daemon/libvirtd|tools/console|tests/(shunload|virnettlscontext)test)\.c$$
exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/
exclude_file_name_regexp--sc_flags_usage = ^(docs/|src/util/virnetdevtap\.c$$)
exclude_file_name_regexp--sc_flags_usage = ^docs/
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
^src/rpc/gendispatch\.pl$$
@@ -769,7 +710,7 @@ exclude_file_name_regexp--sc_prohibit_close = \
(\.p[yl]$$|^docs/|^(src/util/virfile\.c|src/libvirt\.c)$$)
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
(^tests/qemuhelpdata/|\.(gif|ico|png|diff)$$)
(^tests/qemuhelpdata/|\.(gif|ico|png)$$)
_src2=src/(util/command|libvirt|lxc/lxc_controller)
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
@@ -786,25 +727,17 @@ exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
^((po|tests)/|docs/.*py$$|tools/(virsh|console)\.c$$)
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
^(src/util/memory\.[ch]|examples/.*)$$
exclude_file_name_regexp--sc_prohibit_readlink = ^src/util/util\.c$$
exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/util\.c$$
exclude_file_name_regexp--sc_prohibit_sprintf = \
^(docs/hacking\.html\.in)|(examples/systemtap/.*stp)|(src/dtrace2systemtap\.pl)|(src/rpc/gensystemtap\.pl)$$
exclude_file_name_regexp--sc_prohibit_sprintf = ^docs/hacking\.html\.in$$
exclude_file_name_regexp--sc_prohibit_strncpy = \
^(src/util/util|tools/virsh)\.c$$
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/xml\.c$$
exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
exclude_file_name_regexp--sc_prohibit_return_as_function = \.py$$
exclude_file_name_regexp--sc_require_config_h = ^examples/
exclude_file_name_regexp--sc_require_config_h_first = ^examples/
@@ -813,5 +746,3 @@ exclude_file_name_regexp--sc_trailing_blank = \.(fig|gif|ico|png)$$
exclude_file_name_regexp--sc_unmarked_diagnostics = \
^(docs/apibuild.py|tests/virt-aa-helper-test)$$
exclude_file_name_regexp--sc_size_of_brackets = cfg.mk

View File

@@ -3,13 +3,13 @@ dnl Process this file with autoconf to produce a configure script.
dnl Copyright (C) 2005-2012 Red Hat, Inc.
dnl See COPYING.LIB for the License of this software
AC_INIT([libvirt], [0.9.11], [libvir-list@redhat.com], [], [http://libvirt.org])
AC_INIT([libvirt], [0.9.6.3], [libvir-list@redhat.com], [], [http://libvirt.org])
AC_CONFIG_SRCDIR([src/libvirt.c])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
dnl Make automake keep quiet about wildcards & other GNUmake-isms
AM_INIT_AUTOMAKE([-Wno-portability])
AM_INIT_AUTOMAKE([-Wno-portability tar-ustar])
AM_MAINTAINER_MODE([enable])
# Maintainer note - comment this line out if you plan to rerun
@@ -106,7 +106,7 @@ VERSION_SCRIPT_FLAGS=-Wl,--version-script=
VERSION_SCRIPT_FLAGS="-Wl,-M -Wl,"
AC_MSG_RESULT([$VERSION_SCRIPT_FLAGS])
LIBVIRT_COMPILE_WARNINGS
LIBVIRT_COMPILE_WARNINGS([maximum])
AC_MSG_CHECKING([for CPUID instruction])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
@@ -131,15 +131,18 @@ AC_CHECK_SIZEOF([long])
dnl Availability of various common functions (non-fatal if missing),
dnl and various less common threadsafe functions
AC_CHECK_FUNCS_ONCE([cfmakeraw geteuid getgid getgrnam_r getmntent_r \
AC_CHECK_FUNCS_ONCE([cfmakeraw fdatasync geteuid getgid getgrnam_r getmntent_r \
getpwuid_r getuid initgroups kill mmap posix_fallocate posix_memalign \
regexec sched_getaffinity])
if test $ac_cv_func_fdatasync = no; then
AC_DEFINE([fdatasync], [fsync], [Define to fsync if you lack fdatasync])
fi
dnl Availability of pthread functions (if missing, win32 threading is
dnl assumed). Because of $LIB_PTHREAD, we cannot use AC_CHECK_FUNCS_ONCE.
dnl LIB_PTHREAD and LIBMULTITHREAD were set during gl_INIT by gnulib.
dnl LIB_PTHREAD was set during gl_INIT by gnulib.
old_LIBS=$LIBS
LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD"
LIBS="$LIBS $LIB_PTHREAD"
AC_CHECK_FUNCS([pthread_mutexattr_init])
LIBS=$old_libs
@@ -156,22 +159,7 @@ AC_SUBST(RT_LIBS)
dnl Availability of various common headers (non-fatal if missing).
AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/un.h \
sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \
sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h \
net/if.h])
AC_MSG_CHECKING([for struct ifreq in net/if.h])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <net/if.h>
]],
[[
struct ifreq ifr;
]])],[
AC_DEFINE([HAVE_STRUCT_IFREQ],[],[Defined if struct ifreq existsin net/if.h])
AC_MSG_RESULT([yes])
],[
AC_MSG_RESULT([yes])
])
sys/un.h sys/syscall.h netinet/tcp.h ifaddrs.h libtasn1.h])
dnl Our only use of libtasn1.h is in the testsuite, and can be skipped
dnl if the header is not present. Assume -ltasn1 is present if the
@@ -211,22 +199,17 @@ AC_PATH_PROG([UDEVADM], [udevadm], [],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([UDEVSETTLE], [udevsettle], [],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([MODPROBE], [modprobe], [modprobe],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([OVSVSCTL], [ovs-vsctl], [ovs-vsctl],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_PATH_PROG([SCRUB], [scrub], [scrub],
AC_PATH_PROG([MODPROBE], [modprobe], [],
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
AC_DEFINE_UNQUOTED([DNSMASQ],["$DNSMASQ"],
[Location or name of the dnsmasq program])
AC_DEFINE_UNQUOTED([RADVD],["$RADVD"],
[Location or name of the radvd program])
AC_DEFINE_UNQUOTED([BRCTL],["$BRCTL"],
[Location or name of the brctl program (see bridge-utils)])
AC_DEFINE_UNQUOTED([TC],["$TC"],
[Location or name of the tc profram (see iproute2)])
AC_DEFINE_UNQUOTED([OVSVSCTL],["$OVSVSCTL"],
[Location or name of the ovs-vsctl program])
if test -n "$UDEVADM"; then
AC_DEFINE_UNQUOTED([UDEVADM],["$UDEVADM"],
[Location or name of the udevadm program])
@@ -239,8 +222,6 @@ if test -n "$MODPROBE"; then
AC_DEFINE_UNQUOTED([MODPROBE],["$MODPROBE"],
[Location or name of the modprobe program])
fi
AC_DEFINE_UNQUOTED([SCRUB],["$SCRUB"],
[Location or name of the scrub program (for wiping algorithms)])
dnl Specific dir for HTML output ?
AC_ARG_WITH([html-dir], [AC_HELP_STRING([--with-html-dir=path],
@@ -274,10 +255,9 @@ if test "$prefix" = "/usr" && test "$sysconfdir" = '${prefix}/etc' ; then
fi
dnl Make some notes about which OS we're compiling for, as the lxc and qemu
dnl drivers require linux headers, and storage_mpath, dtrace, and nwfilter
dnl are also linux specific. The "network" and storage_fs drivers are known
dnl to not work on MacOS X presently, so we also make a note if compiling
dnl for that
dnl drivers require linux headers, while storage_mpath and nwfilter are also
dnl linux specific. The "network" and storage_fs drivers are known to not
dnl work on MacOS X presently, so we also make a note if compiling for that
with_linux=no with_osx=no
case $host in
@@ -294,7 +274,6 @@ if test $with_linux = no; then
then
with_qemu=no
fi
with_dtrace=no
fi
AM_CONDITIONAL([WITH_LINUX], [test "$with_linux" = "yes"])
@@ -336,12 +315,6 @@ AC_ARG_WITH([remote],
AC_HELP_STRING([--with-remote], [add remote driver support @<:@default=yes@:>@]),[],[with_remote=yes])
AC_ARG_WITH([libvirtd],
AC_HELP_STRING([--with-libvirtd], [add libvirtd support @<:@default=yes@:>@]),[],[with_libvirtd=yes])
AC_ARG_WITH([console-lock-files],
AC_HELP_STRING([--with-console-lock-files],
[location for UUCP style lock files for console PTYs
(use auto for default paths on some platforms)
@<:@default=auto@:>@]),
[],[with_console_lock_files=auto])
dnl
dnl in case someone want to build static binaries
@@ -366,41 +339,16 @@ dnl init script flavor
dnl
AC_MSG_CHECKING([for init script flavor])
AC_ARG_WITH([init-script],
[AC_HELP_STRING([--with-init-script@<:@=STYLE@:>@],
[Style of init script to install: redhat, systemd, systemd+redhat,
upstart, auto, none @<:@default=auto@:>@])],[],[with_init_script=check])
init_redhat=no
init_systemd=no
init_upstart=no
case "$with_init_script" in
systemd+redhat)
init_redhat=yes
init_systemd=yes
;;
systemd)
init_systemd=yes
;;
upstart)
init_upstart=yes
;;
redhat)
init_redhat=yes
;;
none)
;;
check)
if test "$cross_compiling" != yes && test -f /etc/redhat-release; then
init_redhat=yes
with_init_script=redhat
fi
;;
*)
AC_MSG_ERROR([Unknown initscript flavour $with_init_script])
;;
esac
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test "$init_redhat" = "yes")
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_UPSTART], test "$init_upstart" = "yes")
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_SYSTEMD], test "$init_systemd" = "yes")
[AC_HELP_STRING([--with-init-script=@<:@redhat|auto|none@:>@],
[Style of init script to install @<:@default=auto@:>@])])
if test "x$with_init_script" = "x" || test "x$with_init_script" = "xauto"; then
if test "$cross_compiling" = yes || test ! -f /etc/redhat-release; then
with_init_script=none
else
with_init_script=redhat
fi
fi
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test x$with_init_script = xredhat)
AC_MSG_RESULT($with_init_script)
dnl RHEL-5 has a peculiar version of Xen, which requires some special casing
@@ -748,18 +696,16 @@ fi
if test "$with_lxc" = "yes" || test "$with_lxc" = "check"; then
AC_TRY_LINK([
#include <sched.h>
#include <linux/loop.h>
#include <sys/epoll.h>
], [
unshare (!(LO_FLAGS_AUTOCLEAR + EPOLL_CLOEXEC));
unshare (1);
], [
with_lxc=yes
], [
if test "$with_lxc" = "check"; then
with_lxc=no
AC_MSG_NOTICE([Required kernel features were not found, disabling LXC])
AC_MSG_NOTICE([Function unshare() not present in <sched.h> header but required for LXC driver, disabling it])
else
AC_MSG_ERROR([Required kernel features for LXC were not found])
AC_MSG_ERROR([Function unshare() not present in <sched.h> header, but required for LXC driver])
fi
])
fi
@@ -1212,36 +1158,12 @@ AM_CONDITIONAL([HAVE_AUDIT], [test "$with_audit" = "yes"])
AC_SUBST([AUDIT_CFLAGS])
AC_SUBST([AUDIT_LIBS])
dnl UUCP style file locks for PTY consoles
if test "$with_console_lock_files" != "no"; then
case $with_console_lock_files in
yes | auto)
dnl Default locations for platforms, or disable if unknown
if test "$with_linux" = "yes"; then
with_console_lock_files=/var/lock
elif test "$with_console_lock_files" = "auto"; then
with_console_lock_files=no
fi ;;
esac
if test "$with_console_lock_files" = "yes"; then
AC_MSG_ERROR([You must specify path for the lock files on this
platform])
fi
AC_DEFINE_UNQUOTED([VIR_PTY_LOCK_FILE_PATH], "$with_console_lock_files",
[path to directory containing UUCP pty lock files])
fi
AM_CONDITIONAL([VIR_PTY_LOCK_FILE_PATH], [test "$with_console_lock_files" != "no"])
dnl SELinux
AC_ARG_WITH([selinux],
AC_HELP_STRING([--with-selinux], [use SELinux to manage security @<:@default=check@:>@]),
[],
[with_selinux=check])
AC_ARG_WITH([selinux_mount],
AC_HELP_STRING([--with-selinux-mount], [set SELinux mount point @<:@default=check@:>@]),
[],
[with_selinux_mount=check])
SELINUX_CFLAGS=
SELINUX_LIBS=
@@ -1265,20 +1187,7 @@ if test "$with_selinux" != "no"; then
LIBS="$old_libs"
fi
if test "$with_selinux" = "yes"; then
AC_MSG_CHECKING([SELinux mount point])
if test "$with_selinux_mount" = "check" || test -z "$with_selinux_mount"; then
if test -d /sys/fs/selinux ; then
SELINUX_MOUNT=/sys/fs/selinux
else
SELINUX_MOUNT=/selinux
fi
else
SELINUX_MOUNT=$with_selinux_mount
fi
AC_MSG_RESULT([$SELINUX_MOUNT])
SELINUX_LIBS="-lselinux"
AC_DEFINE_UNQUOTED([SELINUX_MOUNT], ["$SELINUX_MOUNT"], [SELinux mount point])
AC_DEFINE_UNQUOTED([HAVE_SELINUX], 1, [whether basic SELinux functionality is available])
dnl We prefer to use <selinux/label.h> and selabel_open, but can fall
dnl back to matchpathcon for the sake of RHEL 5's version of libselinux.
@@ -1421,10 +1330,10 @@ if test "$with_dtrace" != "no" ; then
with_dtrace=yes
fi
if test "$with_dtrace" = "yes"; then
AC_DEFINE_UNQUOTED([WITH_DTRACE_PROBES], 1, [whether DTrace static probes are available])
AC_DEFINE_UNQUOTED([WITH_DTRACE], 1, [whether DTrace static probes are available])
fi
fi
AM_CONDITIONAL([WITH_DTRACE_PROBES], [test "$with_dtrace" != "no"])
AM_CONDITIONAL([WITH_DTRACE], [test "$with_dtrace" != "no"])
dnl NUMA lib
@@ -1462,29 +1371,6 @@ AM_CONDITIONAL([HAVE_NUMACTL], [test "$with_numactl" != "no"])
AC_SUBST([NUMACTL_CFLAGS])
AC_SUBST([NUMACTL_LIBS])
dnl numad
AC_ARG_WITH([numad],
AC_HELP_STRING([--with-numad], [use numad to manage CPU placement dynamically @<:@default=check@:>@]),
[],
[with_numad=check])
if test "$with_numad" != "no" ; then
AC_PATH_PROG([NUMAD], [numad], [], [/bin:/usr/bin])
if test -z "$NUMAD" ; then
if test "$with_numad" = "check"; then
with_numad="no"
else
AC_MSG_ERROR([You must install the 'numad' to manage CPU placement dynamically])
fi
else
with_numad="yes"
fi
if test "$with_numad" = "yes"; then
AC_DEFINE_UNQUOTED([HAVE_NUMAD], 1, [whether numad is available])
AC_DEFINE_UNQUOTED([NUMAD],["$NUMAD"], [Location or name of the numad program])
fi
fi
AM_CONDITIONAL([HAVE_NUMAD], [test "$with_numad" != "no"])
dnl pcap lib
LIBPCAP_CONFIG="pcap-config"
@@ -1689,9 +1575,6 @@ AC_ARG_WITH([netcf],
NETCF_CFLAGS=
NETCF_LIBS=
if test "$with_libvirtd" = "no" ; then
with_netcf=no
fi
if test "$with_netcf" = "yes" || test "$with_netcf" = "check"; then
PKG_CHECK_MODULES(NETCF, netcf >= $NETCF_REQUIRED,
[with_netcf=yes], [
@@ -1816,7 +1699,6 @@ if test "$with_storage_lvm" = "yes" || test "$with_storage_lvm" = "check"; then
AC_PATH_PROG([PVREMOVE], [pvremove], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([VGREMOVE], [vgremove], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([LVREMOVE], [lvremove], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([LVCHANGE], [lvchange], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([VGCHANGE], [vgchange], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([VGSCAN], [vgscan], [], [$PATH:/sbin:/usr/sbin])
AC_PATH_PROG([PVS], [pvs], [], [$PATH:/sbin:/usr/sbin])
@@ -1830,7 +1712,6 @@ if test "$with_storage_lvm" = "yes" || test "$with_storage_lvm" = "check"; then
if test -z "$PVREMOVE" ; then AC_MSG_ERROR([We need pvremove for LVM storage driver]) ; fi
if test -z "$VGREMOVE" ; then AC_MSG_ERROR([We need vgremove for LVM storage driver]) ; fi
if test -z "$LVREMOVE" ; then AC_MSG_ERROR([We need lvremove for LVM storage driver]) ; fi
if test -z "$LVCHANGE" ; then AC_MSG_ERROR([We need lvchange for LVM storage driver]) ; fi
if test -z "$VGCHANGE" ; then AC_MSG_ERROR([We need vgchange for LVM storage driver]) ; fi
if test -z "$VGSCAN" ; then AC_MSG_ERROR([We need vgscan for LVM storage driver]) ; fi
if test -z "$PVS" ; then AC_MSG_ERROR([We need pvs for LVM storage driver]) ; fi
@@ -1843,7 +1724,6 @@ if test "$with_storage_lvm" = "yes" || test "$with_storage_lvm" = "check"; then
if test -z "$PVREMOVE" ; then with_storage_lvm=no ; fi
if test -z "$VGREMOVE" ; then with_storage_lvm=no ; fi
if test -z "$LVREMOVE" ; then with_storage_lvm=no ; fi
if test -z "$LVCHANGE" ; then with_storage_lvm=no ; fi
if test -z "$VGCHANGE" ; then with_storage_lvm=no ; fi
if test -z "$VGSCAN" ; then with_storage_lvm=no ; fi
if test -z "$PVS" ; then with_storage_lvm=no ; fi
@@ -1861,7 +1741,6 @@ if test "$with_storage_lvm" = "yes" || test "$with_storage_lvm" = "check"; then
AC_DEFINE_UNQUOTED([PVREMOVE],["$PVREMOVE"],[Location of pvremove program])
AC_DEFINE_UNQUOTED([VGREMOVE],["$VGREMOVE"],[Location of vgremove program])
AC_DEFINE_UNQUOTED([LVREMOVE],["$LVREMOVE"],[Location of lvremove program])
AC_DEFINE_UNQUOTED([LVCHANGE],["$LVCHANGE"],[Location of lvchange program])
AC_DEFINE_UNQUOTED([VGCHANGE],["$VGCHANGE"],[Location of vgchange program])
AC_DEFINE_UNQUOTED([VGSCAN],["$VGSCAN"],[Location of vgscan program])
AC_DEFINE_UNQUOTED([PVS],["$PVS"],[Location of pvs program])
@@ -2162,25 +2041,6 @@ AM_CONDITIONAL([WITH_PYTHON], [test "$with_python" = "yes"])
AC_SUBST([PYTHON_VERSION])
AC_SUBST([PYTHON_INCLUDES])
AC_ARG_ENABLE([with-test-suite],
AC_HELP_STRING([--with-test-suite], [build test suite by default @<:@default=check@:>@]),
[case "${withval}" in
yes|no|check) ;;
*) AC_MSG_ERROR([bad value ${withval} for tests option]) ;;
esac],
[withval=check])
AC_MSG_CHECKING([Whether to build test suite by default])
if test "$withval" = "check" ; then
if test -d $srcdir/.git ; then
withval=yes
else
withval=no
fi
fi
AC_MSG_RESULT([$withval])
AM_CONDITIONAL([WITH_TESTS], [test "$withval" = "yes"])
AC_ARG_ENABLE([test-coverage],
AC_HELP_STRING([--enable-test-coverage], [turn on code coverage instrumentation @<:@default=no@:>@]),
[case "${enableval}" in
@@ -2594,6 +2454,9 @@ AM_CONDITIONAL([HAVE_LIBNL], [test "$have_libnl" = "yes"])
AC_SUBST([LIBNL_CFLAGS])
AC_SUBST([LIBNL_LIBS])
# Only COPYING.LIB is under version control, yet COPYING
# is included as part of the distribution tarball.
# Copy one to the other, but only if this is a srcdir-build.
@@ -2676,7 +2539,7 @@ AC_MSG_NOTICE([ Disk: $with_storage_disk])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Security Drivers])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([ SELinux: $with_secdriver_selinux ($SELINUX_MOUNT)])
AC_MSG_NOTICE([ SELinux: $with_secdriver_selinux])
AC_MSG_NOTICE([AppArmor: $with_secdriver_apparmor])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Driver Loadable Modules])
@@ -2820,15 +2683,12 @@ AC_MSG_NOTICE([])
AC_MSG_NOTICE([Miscellaneous])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([ Debug: $enable_debug])
AC_MSG_NOTICE([ Use -Werror: $set_werror])
AC_MSG_NOTICE([ Warnings: $enable_compile_warnings])
AC_MSG_NOTICE([Warning Flags: $WARN_CFLAGS])
AC_MSG_NOTICE([ Readline: $lv_use_readline])
AC_MSG_NOTICE([ Python: $with_python])
AC_MSG_NOTICE([ DTrace: $with_dtrace])
AC_MSG_NOTICE([ numad: $with_numad])
AC_MSG_NOTICE([ XML Catalog: $XML_CATALOG_FILE])
AC_MSG_NOTICE([ Init script: $with_init_script])
AC_MSG_NOTICE([Console locks: $with_console_lock_files])
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Privileges])
AC_MSG_NOTICE([])

14
daemon/.gitignore vendored Normal file
View File

@@ -0,0 +1,14 @@
*.la
*.lo
.deps
.libs
Makefile
Makefile.in
libvirt_qemud
libvirtd
libvirtd.init
libvirtd*.logrotate
libvirtd.8
libvirtd.8.in
libvirtd.pod
probes.h

View File

@@ -1,12 +1,12 @@
## Process this file with automake to produce Makefile.in
## Copyright (C) 2005-2012 Red Hat, Inc.
## Copyright (C) 2005-2011 Red Hat, Inc.
## See COPYING.LIB for the License of this software
INCLUDES = \
-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
-I$(top_builddir)/include -I$(top_srcdir)/include \
-I$(top_builddir)/src -I$(top_srcdir)/src \
-I$(top_srcdir)/gnulib/lib -I../gnulib/lib \
-I$(top_srcdir)/include -I$(top_builddir)/include \
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/util \
-I$(top_srcdir)/src/conf \
-I$(top_srcdir)/src/rpc \
@@ -38,7 +38,6 @@ EXTRA_DIST = \
libvirtd.policy-1 \
libvirtd.sasl \
libvirtd.sysconf \
libvirtd.sysctl \
libvirtd.aug \
libvirtd.logrotate.in \
libvirtd.qemu.logrotate.in \
@@ -48,6 +47,7 @@ EXTRA_DIST = \
THREADS.txt \
libvirtd.pod.in \
libvirtd.8.in \
libvirtd.stp \
$(DAEMON_SOURCES)
BUILT_SOURCES =
@@ -109,11 +109,9 @@ libvirtd_LDADD = \
$(SASL_LIBS) \
$(POLKIT_LIBS)
if WITH_DTRACE_PROBES
libvirtd_LDADD += ../src/probes.o
endif
libvirtd_LDADD += \
../src/libvirt-net-rpc-server.la \
../src/libvirt-net-rpc.la \
../src/libvirt-qemu.la
if ! WITH_DRIVER_MODULES
@@ -170,27 +168,41 @@ policyfile = libvirtd.policy-1
endif
endif
install-data-local: install-init-redhat install-init-systemd install-init-upstart \
install-data-sasl install-data-polkit \
install-logrotate install-sysctl
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt \
$(DESTDIR)$(localstatedir)/run/libvirt \
$(DESTDIR)$(localstatedir)/lib/libvirt
if WITH_DTRACE
libvirtd_LDADD += probes.o
nodist_libvirtd_SOURCES = probes.h
uninstall-local:: uninstall-init-redhat uninstall-init-systemd uninstall-init-upstart \
uninstall-data-sasl uninstall-data-polkit \
uninstall-logrotate uninstall-sysctl
BUILT_SOURCES += probes.h
tapsetdir = $(datadir)/systemtap/tapset
tapset_DATA = libvirtd.stp
probes.h: probes.d
$(AM_V_GEN)$(DTRACE) -o $@ -h -s $<
probes.o: probes.d
$(AM_V_GEN)$(DTRACE) -o $@ -G -s $<
CLEANFILES += probes.h probes.o
endif
install-data-local: install-init install-data-sasl install-data-polkit \
install-logrotate
mkdir -p $(DESTDIR)$(localstatedir)/log/libvirt
mkdir -p $(DESTDIR)$(localstatedir)/run/libvirt
mkdir -p $(DESTDIR)$(localstatedir)/lib/libvirt
uninstall-local:: uninstall-init uninstall-data-sasl uninstall-data-polkit
rmdir $(DESTDIR)$(localstatedir)/log/libvirt || :
rmdir $(DESTDIR)$(localstatedir)/run/libvirt || :
rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || :
if HAVE_POLKIT
install-data-polkit::
$(MKDIR_P) $(DESTDIR)$(policydir)
install-data-polkit:: install-init
mkdir -p $(DESTDIR)$(policydir)
$(INSTALL_DATA) $(srcdir)/$(policyfile) $(DESTDIR)$(policydir)/org.libvirt.unix.policy
uninstall-data-polkit::
uninstall-data-polkit:: install-init
rm -f $(DESTDIR)$(policydir)/org.libvirt.unix.policy
rmdir $(DESTDIR)$(policydir) || :
else
install-data-polkit::
uninstall-data-polkit::
@@ -229,94 +241,29 @@ libvirtd.uml.logrotate: libvirtd.uml.logrotate.in
mv $@-t $@
install-logrotate: $(LOGROTATE_CONFS)
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt/qemu/ \
$(DESTDIR)$(localstatedir)/log/libvirt/lxc/ \
$(DESTDIR)$(localstatedir)/log/libvirt/uml/ \
$(DESTDIR)$(sysconfdir)/logrotate.d/
mkdir -p $(DESTDIR)$(localstatedir)/log/libvirt/qemu/
mkdir -p $(DESTDIR)$(localstatedir)/log/libvirt/lxc/
mkdir -p $(DESTDIR)$(localstatedir)/log/libvirt/uml/
mkdir -p $(DESTDIR)$(sysconfdir)/logrotate.d/
$(INSTALL_DATA) libvirtd.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd
$(INSTALL_DATA) libvirtd.qemu.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu
$(INSTALL_DATA) libvirtd.lxc.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc
$(INSTALL_DATA) libvirtd.uml.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
uninstall-logrotate:
rm -f $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd \
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu \
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc \
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/qemu || :
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/lxc || :
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/uml || :
rmdir $(DESTDIR)$(sysconfdir)/logrotate.d || :
install-sysconfig:
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \
$(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
uninstall-sysconfig:
rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
install-sysctl:
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysctl.d
$(INSTALL_DATA) $(srcdir)/libvirtd.sysctl \
$(DESTDIR)$(sysconfdir)/sysctl.d/libvirtd
uninstall-sysctl:
rm -f $(DESTDIR)$(sysconfdir)/sysctl.d/libvirtd
rmdir $(DESTDIR)$(sysconfdir)/sysctl.d || :
if LIBVIRT_INIT_SCRIPT_RED_HAT
BUILT_SOURCES += libvirtd.init
install-init-redhat: install-sysconfig libvirtd.init
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
install-init: libvirtd.init
mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/init.d
$(INSTALL_SCRIPT) libvirtd.init \
$(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig
$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \
$(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
uninstall-init-redhat: uninstall-sysconfig
rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
else
install-init-redhat:
uninstall-init-redhat:
endif # LIBVIRT_INIT_SCRIPT_RED_HAT
uninstall-init:
rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd \
$(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
if LIBVIRT_INIT_SCRIPT_UPSTART
install-init-upstart: install-sysconfig
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/event.d
$(INSTALL_SCRIPT) libvirtd.upstart \
$(DESTDIR)$(sysconfdir)/event.d/libvirtd
uninstall-init-upstart: uninstall-sysconfig
rm -f $(DESTDIR)$(sysconfdir)/event.d/libvirtd
rmdir $(DESTDIR)$(sysconfdir)/event.d || :
else
install-init-upstart:
uninstall-init-upstart:
endif # LIBVIRT_INIT_SCRIPT_UPSTART
EXTRA_DIST += libvirtd.service.in
if LIBVIRT_INIT_SCRIPT_SYSTEMD
SYSTEMD_UNIT_DIR = /lib/systemd/system
BUILT_SOURCES += libvirtd.service
install-init-systemd: install-sysconfig libvirtd.service
$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
$(INSTALL_SCRIPT) libvirtd.service \
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
uninstall-init-systemd: uninstall-sysconfig
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
else
install-init-systemd:
uninstall-init-systemd:
endif # LIBVIRT_INIT_SCRIPT_SYSTEMD
BUILT_SOURCES += libvirtd.init
libvirtd.init: libvirtd.init.in $(top_builddir)/config.status
$(AM_V_GEN)sed \
@@ -327,21 +274,18 @@ libvirtd.init: libvirtd.init.in $(top_builddir)/config.status
chmod a+x $@-t && \
mv $@-t $@
libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
$(AM_V_GEN)sed \
-e s!\@localstatedir\@!$(localstatedir)!g \
-e s!\@sbindir\@!$(sbindir)!g \
-e s!\@sysconfdir\@!$(sysconfdir)!g \
< $< > $@-t && \
chmod a+x $@-t && \
mv $@-t $@
check-local:
$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
'$(AUGPARSE)' -I $(srcdir) $(srcdir)/test_libvirtd.aug; \
fi
else
install-init:
uninstall-init:
libvirtd.init:
endif # LIBVIRT_INIT_SCRIPT_RED_HAT
# This must be added last, since functions it provides/replaces
# are used by nearly every other library.
@@ -352,6 +296,9 @@ install-data-local: install-data-sasl
uninstall-local:: uninstall-data-sasl
endif # WITH_LIBVIRTD
# This is needed for 'make dist' too, so can't wrap in WITH_LIBVIRTD.
EXTRA_DIST += probes.d libvirtd.stp
POD2MAN = pod2man -c "Virtualization Support" \
-r "$(PACKAGE)-$(VERSION)" -s 8
@@ -362,12 +309,12 @@ $(srcdir)/libvirtd.8.in: libvirtd.pod.in
# the WITH_LIBVIRTD conditional
if HAVE_SASL
install-data-sasl:
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sasl2/
mkdir -p $(DESTDIR)$(sysconfdir)/sasl2/
$(INSTALL_DATA) $(srcdir)/libvirtd.sasl $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
uninstall-data-sasl:
rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
rmdir $(DESTDIR)$(sysconfdir)/sasl2/ || :
rmdir $(DESTDIR)$(sysconfdir)/sasl2/
else
install-data-sasl:
uninstall-data-sasl:

View File

@@ -66,10 +66,6 @@ module Libvirtd =
let auditing_entry = int_entry "audit_level"
| bool_entry "audit_logging"
let keepalive_entry = int_entry "keepalive_interval"
| int_entry "keepalive_count"
| bool_entry "keepalive_required"
(* Each enty in the config is one of the following three ... *)
let entry = network_entry
| sock_acl_entry
@@ -79,7 +75,6 @@ module Libvirtd =
| processing_entry
| logging_entry
| auditing_entry
| keepalive_entry
let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
let empty = [ label "#empty" . eol ]

View File

@@ -1,7 +1,7 @@
/*
* libvirtd.c: daemon start of day, guest process & i/o management
*
* Copyright (C) 2006-2012 Red Hat, Inc.
* Copyright (C) 2006-2011 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -47,7 +47,6 @@
#include "conf.h"
#include "memory.h"
#include "conf.h"
#include "virnetlink.h"
#include "virnetserver.h"
#include "threads.h"
#include "remote.h"
@@ -147,10 +146,6 @@ struct daemonConfig {
int audit_level;
int audit_logging;
int keepalive_interval;
unsigned int keepalive_count;
int keepalive_required;
};
enum {
@@ -187,11 +182,10 @@ static int daemonForkIntoBackground(const char *argv0)
if (pipe(statuspipe) < 0)
return -1;
pid_t pid = fork();
int pid = fork();
switch (pid) {
case 0:
{
/* intermediate child */
int stdinfd = -1;
int stdoutfd = -1;
int nextpid;
@@ -208,9 +202,9 @@ static int daemonForkIntoBackground(const char *argv0)
goto cleanup;
if (dup2(stdoutfd, STDERR_FILENO) != STDERR_FILENO)
goto cleanup;
if (stdinfd > STDERR_FILENO && VIR_CLOSE(stdinfd) < 0)
if (VIR_CLOSE(stdinfd) < 0)
goto cleanup;
if (stdoutfd > STDERR_FILENO && VIR_CLOSE(stdoutfd) < 0)
if (VIR_CLOSE(stdoutfd) < 0)
goto cleanup;
if (setsid() < 0)
@@ -218,70 +212,54 @@ static int daemonForkIntoBackground(const char *argv0)
nextpid = fork();
switch (nextpid) {
case 0: /* grandchild */
case 0:
return statuspipe[1];
case -1: /* error */
goto cleanup;
default: /* intermediate child succeeded */
_exit(EXIT_SUCCESS);
case -1:
return -1;
default:
_exit(0);
}
cleanup:
VIR_FORCE_CLOSE(stdoutfd);
VIR_FORCE_CLOSE(stdinfd);
VIR_FORCE_CLOSE(statuspipe[1]);
_exit(EXIT_FAILURE);
return -1;
}
case -1: /* error in parent */
goto error;
case -1:
return -1;
default:
{
/* parent */
int got, exitstatus = 0;
int ret;
char status;
VIR_FORCE_CLOSE(statuspipe[1]);
/* We wait to make sure the first child forked successfully */
if (virPidWait(pid, NULL) < 0)
goto error;
if ((got = waitpid(pid, &exitstatus, 0)) < 0 ||
got != pid ||
exitstatus != 0) {
return -1;
}
/* If we get here, then the grandchild was spawned, so we
* must exit. Block until the second child initializes
* successfully */
/* Now block until the second child initializes successfully */
again:
ret = read(statuspipe[0], &status, 1);
if (ret == -1 && errno == EINTR)
goto again;
VIR_FORCE_CLOSE(statuspipe[0]);
if (ret != 1) {
char ebuf[1024];
if (ret == 1 && status != 0) {
fprintf(stderr,
_("%s: error: unable to determine if daemon is "
"running: %s\n"), argv0,
virStrerror(errno, ebuf, sizeof(ebuf)));
exit(EXIT_FAILURE);
} else if (status != 0) {
fprintf(stderr,
_("%s: error: %s. Check /var/log/messages or run "
"without --daemon for more info.\n"), argv0,
_("%s: error: %s. Check /var/log/messages or run without "
"--daemon for more info.\n"), argv0,
virDaemonErrTypeToString(status));
exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
_exit(ret == 1 && status == 0 ? 0 : 1);
}
}
error:
VIR_FORCE_CLOSE(statuspipe[0]);
VIR_FORCE_CLOSE(statuspipe[1]);
return -1;
}
@@ -492,12 +470,8 @@ static int daemonSetupNetworking(virNetServerPtr srv,
NULL)))
goto error;
if (virNetServerAddService(srv, svc,
config->mdns_adv && !ipsock ?
"_libvirt._tcp" :
NULL) < 0)
if (virNetServerAddService(srv, svc, NULL) < 0)
goto error;
if (svcRO &&
virNetServerAddService(srv, svcRO, NULL) < 0)
goto error;
@@ -909,7 +883,7 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
#endif
data->auth_tls = REMOTE_AUTH_NONE;
data->mdns_adv = 0;
data->mdns_adv = 1;
data->min_workers = 5;
data->max_workers = 20;
@@ -925,10 +899,6 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
data->audit_level = 1;
data->audit_logging = 0;
data->keepalive_interval = 5;
data->keepalive_count = 5;
data->keepalive_required = 0;
localhost = virGetHostname(NULL);
if (localhost == NULL) {
/* we couldn't resolve the hostname; assume that we are
@@ -1092,10 +1062,6 @@ daemonConfigLoad(struct daemonConfig *data,
GET_CONF_STR (conf, filename, log_outputs);
GET_CONF_INT (conf, filename, log_buffer_size);
GET_CONF_INT (conf, filename, keepalive_interval);
GET_CONF_INT (conf, filename, keepalive_count);
GET_CONF_INT (conf, filename, keepalive_required);
virConfFree (conf);
return 0;
@@ -1149,7 +1115,7 @@ static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
{
VIR_INFO("Reloading configuration on SIGHUP");
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL);
if (virStateReload() < 0)
VIR_WARN("Error while reloading drivers");
}
@@ -1441,7 +1407,7 @@ int main(int argc, char **argv) {
if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
VIR_ERROR(_("Failed to fork as daemon: %s"),
virStrerror(errno, ebuf, sizeof(ebuf)));
virStrerror(errno, ebuf, sizeof ebuf));
goto cleanup;
}
}
@@ -1486,9 +1452,6 @@ int main(int argc, char **argv) {
config->max_workers,
config->prio_workers,
config->max_clients,
config->keepalive_interval,
config->keepalive_count,
!!config->keepalive_required,
config->mdns_adv ? config->mdns_name : NULL,
use_polkit_dbus,
remoteClientInitHook))) {
@@ -1572,7 +1535,7 @@ int main(int argc, char **argv) {
* an error ?
*/
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
0, "start", NULL, NULL);
0, "start", NULL);
if (daemonSetupNetworking(srv, config,
sock_file, sock_file_ro,
@@ -1599,22 +1562,15 @@ int main(int argc, char **argv) {
goto cleanup;
}
/* Register the netlink event service */
if (virNetlinkEventServiceStart() < 0) {
ret = VIR_DAEMON_ERR_NETWORK;
goto cleanup;
}
/* Run event loop. */
virNetServerRun(srv);
ret = 0;
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
0, "shutdown", NULL, NULL);
0, "shutdown", NULL);
cleanup:
virNetlinkEventServiceStop();
virNetServerProgramFree(remoteProgram);
virNetServerProgramFree(qemuProgram);
virNetServerClose(srv);

View File

@@ -56,8 +56,8 @@
# Alternatively can disable for all services on a host by
# stopping the Avahi daemon
#
# This is disabled by default, uncomment this to enable it
#mdns_adv = 1
# This is enabled by default, uncomment this to disable it
#mdns_adv = 0
# Override the default mDNS advertizement name. This must be
# unique on the immediate broadcast network.
@@ -284,7 +284,7 @@
# Logging controls
#
# Logging level: 4 errors, 3 warnings, 2 information, 1 debug
# Logging level: 4 errors, 3 warnings, 2 informations, 1 debug
# basically 1 will log everything possible
#log_level = 3
@@ -309,7 +309,7 @@
# the event layer.
# Logging outputs:
# An output is one of the places to save logging information
# An output is one of the places to save logging informations
# The format for an output can be:
# x:stderr
# output goes to stderr
@@ -366,28 +366,3 @@
# it with the output of the 'uuidgen' command and then
# uncomment this entry
#host_uuid = "00000000-0000-0000-0000-000000000000"
###################################################################
# Keepalive protocol:
# This allows libvirtd to detect broken client connections or even
# dead client. A keepalive message is sent to a client after
# keepalive_interval seconds of inactivity to check if the client is
# still responding; keepalive_count is a maximum number of keepalive
# messages that are allowed to be sent to the client without getting
# any response before the connection is considered broken. In other
# words, the connection is automatically closed approximately after
# keepalive_interval * (keepalive_count + 1) seconds since the last
# message received from the client. If keepalive_interval is set to
# -1, libvirtd will never send keepalive requests; however clients
# can still send them and the deamon will send responses. When
# keepalive_count is set to 0, connections will be automatically
# closed after keepalive_interval seconds of inactivity without
# sending any keepalive messages.
#
#keepalive_interval = 5
#keepalive_count = 5
#
# If set to 1, libvirtd will refuse to talk to clients that do not
# support keepalive protocol. Defaults to 0.
#
#keepalive_required = 1

View File

@@ -1,7 +1,7 @@
/*
* libvirtd.h: daemon data structure definitions
*
* Copyright (C) 2006-2012 Red Hat, Inc.
* Copyright (C) 2006-2011 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -22,10 +22,8 @@
*/
#ifndef LIBVIRTD_H__
# define LIBVIRTD_H__
# define VIR_ENUM_SENTINELS
#ifndef QEMUD_INTERNAL_H__
# define QEMUD_INTERNAL_H__
# include <config.h>
@@ -35,11 +33,59 @@
# include "qemu_protocol.h"
# include "logging.h"
# include "threads.h"
# include "network.h"
# if HAVE_SASL
# include "virnetsaslcontext.h"
# endif
# include "virnetserverprogram.h"
# if WITH_DTRACE
# ifndef LIBVIRTD_PROBES_H
# define LIBVIRTD_PROBES_H
# include "probes.h"
# endif /* LIBVIRTD_PROBES_H */
/* Systemtap 1.2 headers have a bug where they cannot handle a
* variable declared with array type. Work around this by casting all
* arguments. This is some gross use of the preprocessor because
* PROBE is a var-arg macro, but it is better than the alternative of
* making all callers to PROBE have to be aware of the issues. And
* hopefully, if we ever add a call to PROBE with other than 2 or 3
* end arguments, you can figure out the pattern to extend this hack.
*/
# define VIR_COUNT_ARGS(...) VIR_ARG5(__VA_ARGS__, 4, 3, 2, 1)
# define VIR_ARG5(_1, _2, _3, _4, _5, ...) _5
# define VIR_ADD_CAST_EXPAND(a, b, ...) VIR_ADD_CAST_PASTE(a, b, __VA_ARGS__)
# define VIR_ADD_CAST_PASTE(a, b, ...) a##b(__VA_ARGS__)
/* The double cast is necessary to silence gcc warnings; any pointer
* can safely go to intptr_t and back to void *, which collapses
* arrays into pointers; while any integer can be widened to intptr_t
* then cast to void *. */
# define VIR_ADD_CAST(a) ((void *)(intptr_t)(a))
# define VIR_ADD_CAST2(a, b) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b)
# define VIR_ADD_CAST3(a, b, c) \
VIR_ADD_CAST(a), VIR_ADD_CAST(b), VIR_ADD_CAST(c)
# define VIR_ADD_CASTS(...) \
VIR_ADD_CAST_EXPAND(VIR_ADD_CAST, VIR_COUNT_ARGS(__VA_ARGS__), \
__VA_ARGS__)
# define PROBE_EXPAND(NAME, ARGS) NAME(ARGS)
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT("trace." __FILE__ , __func__, __LINE__, \
#NAME ": " FMT, __VA_ARGS__); \
if (LIBVIRTD_ ## NAME ## _ENABLED()) { \
PROBE_EXPAND(LIBVIRTD_ ## NAME, \
VIR_ADD_CASTS(__VA_ARGS__)); \
}
# else
# define PROBE(NAME, FMT, ...) \
VIR_DEBUG_INT("trace." __FILE__, __func__, __LINE__, \
#NAME ": " FMT, __VA_ARGS__);
# endif
typedef struct daemonClientStream daemonClientStream;
typedef daemonClientStream *daemonClientStreamPtr;
typedef struct daemonClientPrivate daemonClientPrivate;
@@ -63,7 +109,6 @@ struct daemonClientPrivate {
virConnectPtr conn;
daemonClientStreamPtr streams;
bool keepalive_supported;
};
# if HAVE_SASL

View File

@@ -59,13 +59,6 @@ start() {
echo -n $"Starting $SERVICE daemon: "
mkdir -p @localstatedir@/cache/libvirt
rm -rf @localstatedir@/cache/libvirt/*
# LIBVIRTD_NOFILES_LIMIT from /etc/sysconfig/libvirtd is not handled
# automatically
if [ -n "$LIBVIRTD_NOFILES_LIMIT" ]; then
ulimit -n "$LIBVIRTD_NOFILES_LIMIT"
fi
KRB5_KTNAME=$KRB5_KTNAME daemon --pidfile $PIDFILE --check $SERVICE $PROCESS --daemon $LIBVIRTD_CONFIG_ARGS $LIBVIRTD_ARGS
RETVAL=$?
echo
@@ -80,6 +73,7 @@ stop() {
echo
if [ $RETVAL -eq 0 ]; then
rm -f @localstatedir@/lock/subsys/$SERVICE
rm -f $PIDFILE
rm -rf @localstatedir@/cache/libvirt/*
else
exit $RETVAL

View File

@@ -34,8 +34,8 @@ file are instantly applied.
<defaults>
<!-- Only a program in the active host session can use libvirt in
read-write mode for management, and we require user password -->
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep_session</allow_active>
</defaults>
</action>

View File

@@ -34,8 +34,8 @@ file are instantly applied.
<defaults>
<!-- Only a program in the active host session can use libvirt in
read-write mode for management, and we require user password -->
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_any>no</allow_any>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>

View File

@@ -1,23 +0,0 @@
# NB we don't use socket activation. When libvirtd starts it will
# spawn any virtual machines registered for autostart. We want this
# to occur on every boot, regardless of whether any client connects
# to a socket. Thus socket activation doesn't have any benefit
[Unit]
Description=Virtualization daemon
After=syslog.target
After=udev.target
After=avahi.target
After=dbus.target
Before=libvirt-guests.service
[Service]
EnvironmentFile=-/etc/sysconfig/libvirtd
ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
# Override the maximum number of opened files
#LimitNOFILE=2048
[Install]
WantedBy=multi-user.target

65
daemon/libvirtd.stp Normal file
View File

@@ -0,0 +1,65 @@
probe libvirt.daemon.client.connect = process("libvirtd").mark("client_connect")
{
fd = $arg1;
readonly = $arg2;
localAddr = user_string($arg3);
remoteAddr = user_string($arg4);
}
probe libvirt.daemon.client.disconnect = process("libvirtd").mark("client_disconnect")
{
fd = $arg1;
}
probe libvirt.daemon.client.tls_allow = process("libvirtd").mark("client_tls_allow")
{
fd = $arg1;
x509dname = user_string($arg2);
}
probe libvirt.daemon.client.tls_deny = process("libvirtd").mark("client_tls_deny")
{
fd = $arg1;
x509dname = user_string($arg2);
}
probe libvirt.daemon.client.tls_fail = process("libvirtd").mark("client_tls_fail")
{
fd = $arg1;
}
function authtype_to_string(authtype) {
if (authtype == 0)
return "none"
if (authtype == 1)
return "sasl"
if (authtype == 2)
return "polkit"
return "unknown"
}
probe libvirt.daemon.client.auth_allow = process("libvirtd").mark("client_auth_allow")
{
fd = $arg1;
authtype = $arg2;
authname = authtype_to_string($arg2);
identity = user_string($arg3);
}
probe libvirt.daemon.client.auth_deny = process("libvirtd").mark("client_auth_deny")
{
fd = $arg1;
authtype = $arg2;
authname = authtype_to_string($arg2);
identity = user_string($arg3);
}
probe libvirt.daemon.client.auth_fail = process("libvirtd").mark("client_auth_fail")
{
fd = $arg1;
authtype = $arg2;
authname = authtype_to_string($arg2);
}

View File

@@ -1,7 +1,4 @@
# Override the default config file
# NOTE: This setting is no longer honoured if using
# systemd. Set '--config /etc/libvirt/libvirtd.conf'
# in LIBVIRTD_ARGS instead.
#LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
# Listen for TCP/IP connections
@@ -19,6 +16,3 @@
#QEMU_AUDIO_DRV=sdl
#
#SDL_AUDIODRIVER=pulse
# Override the maximum number of opened files
#LIBVIRTD_NOFILES_LIMIT=2048

View File

@@ -1,8 +0,0 @@
# The kernel allocates aio memory on demand, and this number limits the
# number of parallel aio requests; the only drawback of a larger limit is
# that a malicious guest could issue parallel requests to cause the kernel
# to set aside memory. Set this number at least as large as
# 128 * (number of virtual disks on the host)
# Libvirt uses a default of 1M requests to allow 8k disks, with at most
# 64M of kernel memory if all disks hit an aio request at the same time.
fs.aio-max-nr = 1048576

View File

@@ -31,11 +31,9 @@ script
ulimit -c "$DAEMON_COREFILE_LIMIT"
fi
# LIBVIRTD_NOFILES_LIMIT from /etc/sysconfig/libvirtd is not handled
# automatically
if [ -n "$LIBVIRTD_NOFILES_LIMIT" ]; then
ulimit -n "$LIBVIRTD_NOFILES_LIMIT"
fi
# Clean up a pidfile that might be left around
rm -f /var/run/libvirtd.pid
mkdir -p /var/cache/libvirt
rm -rf /var/cache/libvirt/*
@@ -43,5 +41,6 @@ script
end script
post-stop script
rm -f $PIDFILE
rm -rf /var/cache/libvirt/*
end script

12
daemon/probes.d Normal file
View File

@@ -0,0 +1,12 @@
provider libvirtd {
probe client_connect(int fd, int readonly, const char *localAddr, const char *remoteAddr);
probe client_disconnect(int fd);
probe client_auth_allow(int fd, int authtype, const char *identity);
probe client_auth_deny(int fd, int authtype, const char *identity);
probe client_auth_fail(int fd, int authtype);
probe client_tls_allow(int fd, const char *x509dname);
probe client_tls_deny(int fd, const char *x509dname);
probe client_tls_fail(int fd);
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
/*
* stream.c: APIs for managing client streams
*
* Copyright (C) 2009, 2011 Red Hat, Inc.
* Copyright (C) 2009 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -94,7 +94,7 @@ daemonStreamUpdateEvents(daemonClientStream *stream)
* fast stream, but slow client
*/
static void
daemonStreamMessageFinished(virNetMessagePtr msg ATTRIBUTE_UNUSED,
daemonStreamMessageFinished(virNetMessagePtr msg,
void *opaque)
{
daemonClientStream *stream = opaque;
@@ -276,7 +276,7 @@ cleanup:
* -1 on fatal client error
*/
static int
daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
daemonStreamFilter(virNetServerClientPtr client,
virNetMessagePtr msg,
void *opaque)
{
@@ -556,7 +556,7 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
/*
* Process a finish handshake from the client.
* Process an finish handshake from the client.
*
* Returns a VIR_NET_OK confirmation if successful, or a VIR_NET_ERROR
* if there was a stream error

View File

@@ -54,8 +54,8 @@ listen_addr = \"192.168.0.1\"
# Alternatively can disable for all services on a host by
# stopping the Avahi daemon
#
# This is disabled by default, uncomment this to enable it
mdns_adv = 1
# This is enabled by default, uncomment this to disable it
mdns_adv = 0
# Override the default mDNS advertizement name. This must be
# unique on the immediate broadcast network.
@@ -330,8 +330,8 @@ audit_level = 2
{ "#comment" = "Alternatively can disable for all services on a host by" }
{ "#comment" = "stopping the Avahi daemon" }
{ "#comment" = "" }
{ "#comment" = "This is disabled by default, uncomment this to enable it" }
{ "mdns_adv" = "1" }
{ "#comment" = "This is enabled by default, uncomment this to disable it" }
{ "mdns_adv" = "0" }
{ "#empty" }
{ "#comment" = "Override the default mDNS advertizement name. This must be" }
{ "#comment" = "unique on the immediate broadcast network." }

8
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
Makefile
Makefile.in
.memdump
apibuild.pyc
*.html
libvirt-api.xml
libvirt-refs.xml
todo.html.in

View File

@@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in
## Copyright (C) 2005-2011 Red Hat, Inc.
## Copyright (C) 2005-2012 Red Hat, Inc.
## See COPYING.LIB for the License of this software
SUBDIRS= schemas
@@ -60,12 +60,7 @@ png = \
libvirt-driver-arch.png \
libvirt-object-model.png \
madeWith.png \
et.png \
migration-managed-direct.png \
migration-managed-p2p.png \
migration-native.png \
migration-tunnel.png \
migration-unmanaged-direct.png
et.png
gif = \
architecture.gif \
@@ -93,12 +88,7 @@ fig = \
libvirt-net-physical.fig \
libvirt-daemon-arch.fig \
libvirt-driver-arch.fig \
libvirt-object-model.fig \
migration-managed-direct.fig \
migration-managed-p2p.fig \
migration-native.fig \
migration-tunnel.fig \
migration-unmanaged-direct.fig
libvirt-object-model.fig
EXTRA_DIST= \
apibuild.py \
@@ -116,7 +106,7 @@ MAINTAINERCLEANFILES = \
$(addprefix $(srcdir)/,$(apihtml)) \
$(addprefix $(srcdir)/,$(devhelphtml))
all: web
all-am: web
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
qemu_api: $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
@@ -200,12 +190,19 @@ python_generated_files = \
$(srcdir)/libvirt-qemu-api.xml \
$(srcdir)/libvirt-qemu-refs.xml
$(python_generated_files): $(srcdir)/apibuild.py \
APIBUILD=$(srcdir)/apibuild.py
APIBUILD_STAMP=$(APIBUILD).stamp
$(python_generated_files): $(APIBUILD_STAMP)
$(APIBUILD_STAMP): $(srcdir)/apibuild.py \
$(srcdir)/../include/libvirt/*.h \
$(srcdir)/../src/libvirt.c \
$(srcdir)/../src/libvirt-qemu.c \
$(srcdir)/../src/util/virterror.c
$(AM_V_GEN)srcdir=$(srcdir) $(PYTHON) $(srcdir)/apibuild.py
$(AM_V_GEN)srcdir=$(srcdir) $(PYTHON) $(APIBUILD)
touch $@
check-local: all
@@ -215,6 +212,7 @@ clean-local:
maintainer-clean-local: clean-local
rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml todo.html.in hvsupport.html.in
rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
rm -rf $(APIBUILD_STAMP)
rebuild: api qemu_api all

View File

@@ -100,7 +100,7 @@ index dfc6415..3642296 100644
+ /* If xendConfigVersion is 2, then we can only report _LIVE (and
+ * xm_internal reports _CONFIG). If it is 3, then _LIVE and
+ * _CONFIG are always in sync for a running system. */
+ if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
+ if (domain->id < 0 && priv->xendConfigVersion < 3)
+ return -2;
+ if (domain->id < 0 && (flags & VIR_DOMAIN_VCPU_LIVE)) {
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",

View File

@@ -110,7 +110,7 @@ index fe2ff86..66e8518 100644
+ * depends on xendConfigVersion. */
+ if (dom) {
+ priv = dom->conn->privateData;
+ if (priv->xendConfigVersion >= XEND_CONFIG_VERSION_3_0_4)
+ if (priv->xendConfigVersion >= 3)
+ flags |= VIR_DOMAIN_VCPU_CONFIG;
+ }
+ return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, flags);
@@ -163,14 +163,14 @@ index 3642296..55c2cc4 100644
+
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
+
+ if ((domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) ||
+ if ((domain->id < 0 && priv->xendConfigVersion < 3) ||
+ (flags & VIR_DOMAIN_VCPU_MAXIMUM))
+ return -2;
+
+ /* With xendConfigVersion 2, only _LIVE is supported. With
+ * xendConfigVersion 3, only _LIVE|_CONFIG is supported for
+ * running domains, or _CONFIG for inactive domains. */
+ if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
+ if (priv->xendConfigVersion < 3) {
+ if (flags & VIR_DOMAIN_VCPU_CONFIG) {
+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("Xend version does not support modifying "

View File

@@ -122,7 +122,7 @@ index 55c2cc4..b90c331 100644
-
- priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
-
- if (domain->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
- if (domain->id < 0 && priv->xendConfigVersion < 3)
- return(-1);
-
- snprintf(buf, sizeof(buf), "%d", vcpus);

View File

@@ -1649,7 +1649,6 @@ class CParser:
"virDomainSetMemoryFlags" : (False, ("memory")),
"virDomainBlockJobSetSpeed" : (False, ("bandwidth")),
"virDomainBlockPull" : (False, ("bandwidth")),
"virDomainBlockRebase" : (False, ("bandwidth")),
"virDomainMigrateGetMaxSpeed" : (False, ("bandwidth")) }
def checkLongLegacyFunction(self, name, return_type, signature):

View File

@@ -348,16 +348,5 @@
</dd>
</dl>
<h2><a name="mobile">Mobile applications</a></h2>
<dl>
<dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt>
<dd>
VM Manager is VM (libvirt) manager (over SSH) application. VM Manager
is an application for libvirt VM / Domain management over SSH.
Please keep in mind that this software is under heavy development.
</dd>
</dl>
</body>
</html>

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<html>
<body>
<h1 >Authentication &amp; access control</h1>
<h1 >Access control</h1>
<p>
When connecting to libvirt, some connections may require client
authentication before allowing use of the APIs. The set of possible
@@ -11,122 +11,6 @@
<ul id="toc"></ul>
<h2><a name="Auth_client_config">Client configuration</a></h2>
<p>
When connecting to a remote hypervisor which requires authentication,
most libvirt applications will prompt the user for the credentials. It is
also possible to provide a client configuration file containing all the
authentication credentials, avoiding any interaction. Libvirt will look
for the authentication file using the following sequence:
</p>
<ol>
<li>The file path specified by the $LIBVIRT_AUTH_FILE environment
variable.</li>
<li>The file path specified by the "authfile=/some/file" URI
query parameter</li>
<li>The file $HOME/.libvirt/auth.conf</li>
<li>The file /etc/libvirt/auth.conf</li>
</ol>
<p>
The auth configuration file uses the traditional <code>".ini"</code>
style syntax. There are two types of groups that can be present in
the config. First there are one or more <strong>credential</strong>
sets, which provide the actual authentication credentials. The keys
within the group may be:
</p>
<ul>
<li><code>username</code>: the user login name to act as. This
is relevant for ESX, Xen, HyperV and SSH, but probably not
the one you want to libvirtd with SASL.</li>
<li><code>authname</code>: the name to authorize as. This is
what is commonly required for libvirtd with SASL.</li>
<li><code>password</code>: the secret password</li>
<li><code>realm</code>: the domain realm for SASL, mostly
unused</li>
</ul>
<p>
Each set of credentials has a name, which is part of the group
entry name. Overall the syntax is
</p>
<pre>
[credentials-$NAME]
credname1=value1
credname2=value2</pre>
<p>
For example, to define two sets of credentials used for production
and test machines, using libvirtd, and a further ESX server for dev:
</p>
<pre>
[credentials-test]
authname=fred
password=123456
[credentials-prod]
authname=bar
password=letmein
[credentials-dev]
username=joe
password=hello</pre>
<p>
The second set of groups provide mappings of credentials to
specific machine services. The config file group names compromise
the service type and host:
</p>
<pre>
[auth-$SERVICE-$HOSTNAME]
credentials=$CREDENTIALS</pre>
<p>
For example, following the previous example, here is how to
list some machines
</p>
<pre>
[auth-libvirt-test1.example.com]
credentials=test
[auth-libvirt-test2.example.com]
credentials=test
[auth-libvirt-demo3.example.com]
credentials=test
[auth-libvirt-prod1.example.com]
credentials=prod
[auth-esx-dev1.example.com]
credentials=dev</pre>
<p>
The following service types are known to libvirt
</p>
<ol>
<li><code>libvirt</code> - used for connections to a libvirtd
server, which is configured with SASL auth</li>
<li><code>ssh</code> - used for connections to a Phyp server
over SSH</li>
<li><code>esx</code> - used for connections to an ESX or
VirtualCenter server</li>
<li><code>xen</code> - used for connections to a Xen Enterprise
sever using XenAPI</li>
</ol>
<p>
Applications using libvirt are free to use this same configuration
file for storing other credentials. For example, it can be used
to storage VNC or SPICE login credentials
</p>
<h2><a name="ACL_server_config">Server configuration</a></h2>
<p>
The libvirt daemon allows the administrator to choose the authentication

View File

@@ -9,47 +9,22 @@
<h2><a name="bugzilla">Bug Tracking</a></h2>
<p>
If you are using libvirt binaries from a Linux distribution
check below for distribution specific bug reporting policies
first.
The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
should be used to report bugs and request features in libvirt.
Before submitting a ticket, check the existing tickets to see if
the bug/feature is already tracked.
</p>
<h2><a name="general">General libvirt bug reports</a></h2>
<p>
The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
should be used to report bugs and request features in libvirt.
Before submitting a ticket, check the existing tickets to see if
the bug/feature is already tracked.
If you are using official libvirt binaries from a Linux distribution
check below for distribution specific bug reporting policies first.
For general libvirt bug reports, from self-built releases, GIT snapshots
and any other non-distribution supported builds, enter tickets under
the <code>Virtualization Tools</code> product and the <code>libvirt</code>
component.
</p>
<p>
It's always a good idea to file bug reports, as the process of
filing the report always makes it easier to describe the
problem, and the bug number provides a quick way of referring to
the problem. However, not everybody in the community pays
attention to bugzilla, so after you file a bug, asking questions
and submitting patches on <a href="contact.html">the libvirt
mailing lists</a> will increase your bug's visibility and
encourage people to think about your problem. Don't hesitate to
ask questions on the list, as others may know of existing
solutions or be interested in collaborating with you on finding
a solution. Patches are always appreciated, and it's likely
that someone else has the same problem you do!
</p>
<p>
If you decide to write code, though, before you begin please
read the <a href="hacking.html">contributor guidelines</a>,
especially the first point: "Discuss any large changes on the
mailing list first. Post patches early and listen to feedback."
Few development experiences are more discouraging than spending
a bunch of time writing a patch only to have someone point out a
better approach on list.
</p>
<ul>
<li><a href="http://bugzilla.redhat.com/buglist.cgi?component=libvirt&amp;product=Virtualization%20Tools">View libvirt tickets</a></li>
@@ -59,37 +34,26 @@
<h2><a name="distribution">Linux Distribution specific bug reports</a></h2>
<ul>
<li>
If you are using binaries from <strong>Fedora</strong>, enter
tickets against the <code>Fedora</code> product and
the <code>libvirt</code> component.
If you are using official binaries from a <strong>Fedora distribution</strong>, enter
tickets against the <code>Fedora</code> product and the <code>libvirt</code>
component.
<ul>
<li><a href="http://bugzilla.redhat.com/buglist.cgi?component=libvirt&amp;product=Fedora">View Fedora libvirt tickets</a></li>
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Fedora&amp;component=libvirt">New Fedora libvirt ticket</a></li>
</ul>
</li>
<li>
<p>
If you are using binaries from <strong>Red Hat Enterprise
Linux</strong>, enter tickets against the Red Hat Enterprise
Linux product that you're using (e.g., Red Hat Enterprise
Linux 6) and the <code>libvirt</code> component. Red Hat
bugzilla has <a href="http://bugzilla.redhat.com">additional guidance</a> about getting support if
you are a Red Hat customer.
</p>
If you are using official binaries from <strong>Red Hat Enterprise Linux distribution</strong>,
tickets against the <code>Red Hat Enterprise Linux 5</code> product and
the <code>libvirt</code> component.
<ul>
<li><a href="http://bugzilla.redhat.com/buglist.cgi?component=libvirt&amp;product=Red%20Hat%20Enterprise%20Linux%205">View Red Hat Enterprise Linux libvirt tickets</a></li>
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%205&amp;component=libvirt">New Red Hat Enterprise Linux libvirt ticket</a></li>
</ul>
</li>
<li>
<p>
If you are using binaries from another Linux distribution
first follow their own bug reporting guidelines.
</p>
</li>
<li>
<p>
Finally, if you are a contributor to another Linux
distribution and would like to have your procedure for
filing bugs mentioned here, please mail the libvirt
development list.
</p>
If you are using official binaries from another Linux distribution first
follow their own bug reporting guidelines.
</li>
</ul>
@@ -117,18 +81,18 @@
If the bug leads to a tool linked to libvirt crash, then the best
is to provide a backtrace along with the scenario used to get the
crash, the simplest is to run the program under gdb, reproduce the
steps leading to the crash and then issue a gdb "bt -a" command to
steps leading to the crash and then issue a gdb "bt" command to
get the stack trace, attach it to the bug. Note that for the
data to be really useful libvirt debug informations must be present
for example by installing libvirt debuginfo package on Fedora or
Red Hat Enterprise Linux (with debuginfo-install libvirt) prior
to running gdb.</p>
<p>
It may also happen that the libvirt daemon itself crashes or gets stuck,
It may also happen that the libvirt daemon itself crashes or get stuck,
in the first case run it (as root) under gdb, and reproduce the sequence
leading to the crash, similary to a normal program provide the
"bt" backtrace information to where gdb will have stopped.<br/>
But if libvirtd gets stuck, for example seems to stop processing
But if libvirtd get stuck, for example seems to stop processing
commands, try to attach to the faulty daemon and issue a gdb command
"thread apply all bt" to show all the threads backtraces, as in:</p>
<pre> # ps -o etime,pid `pgrep libvirt`
@@ -142,5 +106,10 @@
(gdb)
</pre>
<p>
If requesting a new feature attach any available patch to the ticket
and also email the patch to the libvirt mailing list for discussion
</p>
</body>
</html>

4
docs/devhelp/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
Makefile
Makefile.in
libvirt.devhelp
*.html

View File

@@ -56,7 +56,7 @@ esx://example-esx.com/?no_verify=1 (ESX over HTTPS, but doesn't verify the s
URIs have this general form (<code>[...]</code> marks an optional part).
</p>
<pre>
type://[username@]hostname[:port]/[[folder/...]datacenter/[folder/...][cluster/]server][?extraparameters]
type://[username@]hostname[:port]/[datacenter[/cluster]/server][?extraparameters]
</pre>
<p>
The <code>type://</code> is either <code>esx://</code> or
@@ -79,14 +79,6 @@ type://[username@]hostname[:port]/[[folder/...]datacenter/[folder/...][cluster/]
</p>
<pre>
vpx://example-vcenter.com/dc1/cluster1/example-esx.com
</pre>
<p>
Datacenters and clusters can be organized in folders, those have to be
specified as well. The driver can handle folders
<span class="since">since 0.9.7</span>.
</p>
<pre>
vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
</pre>

View File

@@ -35,27 +35,10 @@ mount them use:
<p>
NB, the blkio controller in some kernels will not allow creation of nested
sub-directories which will prevent correct operation of the libvirt LXC
driver. On such kernels, it may be necessary to unmount the blkio controller.
driver. On such kernels, it may be neccessary to unmount the blkio controller.
</p>
<h2>Environment setup for the container init</h2>
<p>
When the container "init" process is started, it will be given several useful
environment variables.
</p>
<dl>
<dt>LIBVIRT_LXC_NAME</dt>
<dd>The name assigned to the container by libvirt</dd>
<dt>LIBVIRT_LXC_UUID</dt>
<dd>The UUID assigned to the container by libvirt</dd>
<dt>LIBVIRT_LXC_CMDLINE</dt>
<dd>The unparsed command line arguments specified in the container configuration</dd>
</dl>
<h3>Example config version 1</h3>
<p></p>
<pre>

View File

@@ -432,16 +432,9 @@ mount -t cgroup none /dev/cgroup -o devices
<h3><a name="xmlimport">Converting from QEMU args to domain XML</a></h3>
<p>
The <code>virsh domxml-from-native</code> provides a way to
convert an existing set of QEMU args into a guest description
using libvirt Domain XML that can then be used by libvirt.
Please note that this command is intended to be used to convert
existing qemu guests previously started from the command line to
be managed through libvirt. It should not be used a method of
creating new guests from scratch. New guests should be created
using an application calling the libvirt APIs (see
the <a href="apps.html">libvirt applications page</a> for some
examples) or by manually crafting XML to pass to virsh.
The <code>virsh domxml-from-native</code> provides a way to convert an
existing set of QEMU args into a guest description using libvirt Domain XML
that can then be used by libvirt.
</p>
<pre>$ cat &gt; demo.args &lt;&lt;EOF
@@ -520,73 +513,6 @@ $ virsh domxml-to-native qemu-argv demo.xml
-serial none -parallel none -usb
</pre>
<h2><a name="qemucommand">Pass-through of arbitrary qemu
commands</a></h2>
<p>Libvirt provides an XML namespace and an optional
library <code>libvirt-qemu.so</code> for dealing specifically
with qemu. When used correctly, these extensions allow testing
specific qemu features that have not yet been ported to the
generic libvirt XML and API interfaces. However, they
are <b>unsupported</b>, in that the library is not guaranteed to
have a stable API, abusing the library or XML may result in
inconsistent state the crashes libvirtd, and upgrading either
qemu-kvm or libvirtd may break behavior of a domain that was
relying on a qemu-specific pass-through. If you find yourself
needing to use them to access a particular qemu feature, then
please post an RFE to the libvirt mailing list to get that
feature incorporated into the stable libvirt XML and API
interfaces.
</p>
<p>The library provides two
API: <code>virDomainQemuMonitorCommand</code>, for sending an
arbitrary monitor command (in either HMP or QMP format) to a
qemu guest (<span class="since">Since 0.8.3</span>),
and <code>virDomainQemuAttach</code>, for registering a qemu
domain that was manually started so that it can then be managed
by libvirtd (<span class="since">Since 0.9.4</span>).
</p>
<p>Additionally, the following XML additions allow fine-tuning of
the command line given to qemu when starting a domain
(<span class="since">Since 0.8.3</span>). In order to use the
XML additions, it is necessary to issue an XML namespace request
(the special <code>xmlns:<i>name</i></code> attribute) that
pulls in <code>http://libvirt.org/schemas/domain/qemu/1.0</code>;
typically, the namespace is given the name
of <code>qemu</code>. With the namespace in place, it is then
possible to add an element <code>&lt;qemu:commandline&gt;</code>
under <code>driver</code>, with the following sub-elements
repeated as often as needed:
<dl>
<dt><code>qemu:arg</code></dt>
<dd>Add an additional command-line argument to the qemu
process when starting the domain, given by the value of the
attribute <code>value</code>.
</dd>
<dt><code>qemu:env</code></dt>
<dd>Add an additional environment variable to the qemu
process when starting the domain, given with the name-value
pair recorded in the attributes <code>name</code>
and optional <code>value</code>.</dd>
</dl>
<p>Example:</p><pre>
&lt;domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'&gt;
&lt;name&gt;QEmu-fedora-i686&lt;/name&gt;
&lt;memory&gt;219200&lt;/memory&gt;
&lt;os&gt;
&lt;type arch='i686' machine='pc'&gt;hvm&lt;/type&gt;
&lt;/os&gt;
&lt;devices&gt;
&lt;emulator&gt;/usr/bin/qemu-system-x86_64&lt;/emulator&gt;
&lt;/devices&gt;
&lt;qemu:commandline&gt;
&lt;qemu:arg value='-newarg'/&gt;
&lt;qemu:env name='QEMU_ENV' value='VAL'/&gt;
&lt;/qemu:commandline&gt;
&lt;/domain&gt;
</pre>
<h2><a name="xmlconfig">Example domain XML config</a></h2>
<h3>QEMU emulated guest on x86_64</h3>

View File

@@ -70,11 +70,6 @@ vbox+ssh://user@example.com/session (remote access, SSH tunnelled)
&lt;target dev='fda'/&gt;
&lt;/disk&gt;
&lt;filesystem type='mount'&gt;
&lt;source dir='/home/user/stuff'/&gt;
&lt;target dir='my-shared-folder'/&gt;
&lt;/filesystem&gt;
&lt;!--BRIDGE--&gt;
&lt;interface type='bridge'&gt;
&lt;source bridge='eth0'/&gt;

View File

@@ -28,11 +28,6 @@ BIOS you will see</p>
&lt;feature name='xtpr'/&gt;
...
&lt;/cpu&gt;
&lt;power_management&gt;
&lt;suspend_mem/&gt;
&lt;suspend_disk/&gt;
&lt;suspend_hybrid/&gt;
&lt;power_management/&gt;
&lt;/host&gt;</span>
&lt;!-- xen-3.0-x86_64 --&gt;
@@ -65,30 +60,20 @@ BIOS you will see</p>
&lt;/guest&gt;</span>
...
&lt;/capabilities&gt;</pre>
<p>The first block (in red) indicates the host hardware
capabilities, such as CPU properties and the power
management features of the host platform. CPU models are
shown as additional features relative to the closest base
model, within a feature block (the block is similar to what
you will find in a Xen fully virtualized domain
description). Further, the power management features
supported by the host are shown, such as Suspend-to-RAM (S3),
Suspend-to-Disk (S4) and Hybrid-Suspend (a combination of S3
and S4). In case the host does not support
any such feature, then an empty &lt;power_management/&gt;
tag will be shown. </p>
<p>The second block (in blue) indicates the paravirtualization
support of the Xen support, you will see the os_type of xen
to indicate a paravirtual kernel, then architecture
information and potential features.</p>
<p>The third block (in green) gives similar information but
when running a 32 bit OS fully virtualized with Xen using
the hvm support.</p>
<p>This section is likely to be updated and augmented in the
future,
see <a href="https://www.redhat.com/archives/libvir-list/2007-March/msg00215.html">the
discussion</a> which led to the capabilities format in the
mailing-list archives.</p>
<p>The first block (in red) indicates the host hardware capabilities, currently
it is limited to the CPU properties but other information may be available,
it shows the CPU architecture, topology, model name, and additional features
which are not included in the model but the CPU provides them. Features of the
chip are shown within the feature block (the block is similar to what you will
find in a Xen fully virtualized domain description).</p>
<p>The second block (in blue) indicates the paravirtualization support of the
Xen support, you will see the os_type of xen to indicate a paravirtual
kernel, then architecture information and potential features.</p>
<p>The third block (in green) gives similar information but when running a
32 bit OS fully virtualized with Xen using the hvm support.</p>
<p>This section is likely to be updated and augmented in the future, see <a href="https://www.redhat.com/archives/libvir-list/2007-March/msg00215.html">the
discussion</a> which led to the capabilities format in the mailing-list
archives.</p>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -58,7 +58,7 @@
<pre>
...
&lt;bridge name="virbr0" stp="on" delay="5"/&gt;
&lt;domain name="example.com"/&gt;
&lt;domain name="example"/&gt;
&lt;forward mode="nat" dev="eth0"/&gt;
...</pre>
@@ -134,12 +134,12 @@
attribute is set, firewall rules will restrict forwarding
to the named device only. This presumes that the local LAN
router has suitable routing table entries to return
traffic to this host. All incoming and outgoing sessions
to guest on these networks are unrestricted. (To restrict
incoming traffic to a guest on a routed network, you can
configure <a href="formatnwfilter.html">nwfilter rules</a>
on the guest's interfaces.)
<span class="since">Since 0.4.2</span>
traffic to this host. Firewall rules are also installed
that prevent incoming sessions from the physical network
to the guests, but outgoing sessions are unrestricted (as
are sessions from the host to the guests, and between
guests on the same network.)<span class="since">Since
0.4.2</span>
</dd>
<dt><code>bridge</code></dt>
@@ -214,7 +214,7 @@
As mentioned above, a <code>&lt;forward&gt;</code> element can
have multiple <code>&lt;interface&gt;</code> subelements, each
one giving the name of a physical interface that can be used
for this network <span class="since">Since 0.9.4</span>:
for this network<span class="since">Since 0.9.4</span>:
<pre>
...
&lt;forward mode='passthrough'&gt;
@@ -226,21 +226,7 @@
&lt;/forward&gt;
...
</pre>
Additionally, <span class="since">since 0.9.10</span>, libvirt
allows a shorthand for specifying all virtual interfaces
associated with a single physical function, by using
the <code>&lt;pf&gt;</code> subelement to call out the
corresponding physical interface associated with multiple
virtual interfaces:
<pre>
...
&lt;forward mode='passthrough'&gt;
&lt;pf dev='eth0'/&gt;
&lt;/forward&gt;
...
</pre>
<p>When a guest interface is being constructed, libvirt will pick
When a guest interface is being constructed, libvirt will pick
an interface from this list to use for the connection. In
modes where physical interfaces can be shared by multiple
guest interfaces, libvirt will choose the interface that
@@ -248,7 +234,7 @@
that do not allow sharing of the physical device (in
particular, 'passthrough' mode, and 'private' mode when using
802.1Qbh), libvirt will choose an unused physical interface
or, if it can't find an unused interface, fail the operation.</p>
or, if it can't find an unused interface, fail the operation.
</dd>
</dl>
<h5><a name="elementQoS">Quality of service</a></h5>
@@ -315,11 +301,9 @@
...</pre>
<p>
<span class="since">Since 0.9.4</span>
A portgroup provides a method of easily putting guest
connections to the network into different classes, with each
class potentially having a different level/type of service.
<span class="since">Since 0.9.4</span> Each
class potentially having a different level/type of service. Each
network can have multiple portgroup elements (and one of those
can optionally be designated as the 'default' portgroup for the
network), and each portgroup has a name, as well as various
@@ -356,14 +340,8 @@
<pre>
...
&lt;mac address='00:16:3E:5D:C7:9E'/&gt;
&lt;domain name="example.com"/&gt;
&lt;dns&gt;
&lt;txt name="example" value="example value" /&gt;
&lt;srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10'/&gt;
&lt;host ip='192.168.122.2'&gt;
&lt;hostname&gt;myhost&lt;/hostname&gt;
&lt;hostname&gt;myhostalias&lt;/hostname&gt;
&lt;/host&gt;
&lt;/dns&gt;
&lt;ip address="192.168.122.1" netmask="255.255.255.0"&gt;
&lt;dhcp&gt;
@@ -412,17 +390,6 @@
<span class="since">Since 0.9.3</span>
</dd>
</dl>
<dl>
<dt><code>srv</code></dt>
<dd>The <code>dns</code> element can have also 0 or more <code>srv</code>
record elements. Each <code>srv</code> record element defines a DNS SRV record
and has 2 mandatory and 5 optional attributes. The mandatory attributes
are service name and protocol (tcp, udp) and the optional attributes are
target, port, priority, weight and domain as defined in DNS server SRV
RFC (RFC 2782).
<span class="since">Since 0.9.9</span>
</dd>
</dl>
</dd>
<dt><code>ip</code></dt>
<dd>The <code>address</code> attribute defines an IPv4 address in
@@ -575,7 +542,6 @@
<h3><a name="examplesBridge">Using an existing host bridge</a></h3>
<p>
<span class="since">Since 0.9.4</span>
This shows how to use a pre-existing host bridge "br0". The
guests will effectively be directly connected to the physical
network (i.e. their IP addresses will all be on the subnet of
@@ -593,8 +559,6 @@
<h3><a name="examplesDirect">Using a macvtap "direct" connection</a></h3>
<p>
<span class="since">Since 0.9.4, QEMU and KVM only, requires
Linux kernel 2.6.34 or newer</span>
This shows how to use macvtap to connect to the physical network
directly through one of a group of physical devices (without
using a host bridge device). As with the host bridge network,

View File

@@ -1,232 +1,5 @@
<html>
<body>
<h1>Node devices XML format</h1>
<ul id="toc"></ul>
<h2><a name="NodedevAttributes">Node Device XML</a></h2>
<p>
There are several libvirt functions, all with the
prefix <code>virNodeDevice</code>, which deal with management of
host devices that can be handed to guests via passthrough as
&lt;hostdev&gt; elements
in <a href="formatdomain.html#elementsUSB">the domain XML</a>.
These devices are represented as a hierarchy, where a device on
a bus has a parent of the bus controller device; the root of the
hierarchy is the node named "computer".
</p>
<p>
When represented in XML, a node device uses the
top-level <code>device</code> element, with the following
elements present according to the type of device:
</p>
<dl>
<dt><code>name</code></dt>
<dd>The name for this device. The name will be alphanumeric,
with words separated by underscore. For many devices, the
name is just the bus type and address, as in
"pci_0000_00_02_1" or "usb_1_5_3", but some devices are able
to provide more specific names, such as
"net_eth1_00_27_13_6a_fe_00".
</dd>
<dt><code>parent</code></dt>
<dd>If this element is present, it names the parent device (that
is, a controller to which this node belongs).
</dd>
<dt><code>capability</code></dt>
<dd>This node appears for each capability that libvirt
associates with a node. A mandatory
attribute <code>type</code> lists which category the device
belongs to, and controls which further subelements will be
present to describe the node:
<dl>
<dt><code>system</code></dt>
<dd>Describes the overall host. Sub-elements include:
<dl>
<dt><code>product</code></dt>
<dd>If present, a simple text string giving the product
name of the system.</dd>
<dt><code>hardware</code></dt>
<dd>Describes the hardware of the system, including
sub-elements for <code>vendor</code>, <code>version</code>,
<code>serial</code>, and <code>uuid</code>.</dd>
<dt><code>firmware</code></dt>
<dd>Describes the firmware of the system, including
sub-elements for <code>vendor</code>, <code>version</code>,
and <code>release_date</code>.</dd>
</dl>
</dd>
<dt><code>pci</code></dt>
<dd>Describes a device on the host's PCI bus. Sub-elements
include:
<dl>
<dt><code>domain</code></dt>
<dd>Which domain the device belongs to.</dd>
<dt><code>bus</code></dt>
<dd>Which bus within the domain.</dd>
<dt><code>slot</code></dt>
<dd>Which slot within the bus.</dd>
<dt><code>function</code></dt>
<dd>Which function within the slot.</dd>
<dt><code>product</code></dt>
<dd>Product details from the device ROM, including an
attribute <code>id</code> with the hexadecimal product
id, and an optional text description of that id.</dd>
<dt><code>vendor</code></dt>
<dd>Vendor details from the device ROM, including an
attribute <code>id</code> with the hexadecimal vendor
id, and an optional text name of that vendor.</dd>
</dl>
</dd>
<dt><code>usb_device</code></dt>
<dd>Describes a device on the host's USB bus, based on its
location within the bus. Sub-elements include:
<dl>
<dt><code>bus</code></dt>
<dd>Which bus the device belongs to.</dd>
<dt><code>device</code></dt>
<dd>Which device within the bus.</dd>
<dt><code>product</code></dt>
<dd>Product details from the device ROM, including an
attribute <code>id</code> with the hexadecimal product
id, and an optional text description of that id.</dd>
<dt><code>vendor</code></dt>
<dd>Vendor details from the device ROM, including an
attribute <code>id</code> with the hexadecimal vendor
id, and an optional text name of that vendor.</dd>
</dl>
</dd>
<dt><code>usb</code></dt>
<dd>Describes a USB device, based on its advertised driver
interface. Sub-elements include:
<dl>
<dt><code>number</code></dt>
<dd>The device number.</dd>
<dt><code>number</code></dt>
<dd>The device class.</dd>
<dt><code>number</code></dt>
<dd>The device subclass.</dd>
<dt><code>number</code></dt>
<dd>The device protocol.</dd>
<dt><code>description</code></dt>
<dd>If present, a description of the device.</dd>
</dl>
</dd>
<dt><code>net</code></dt>
<dd>Describes a device capable for use as a network
interface. Sub-elements include:
<dl>
<dt><code>interface</code></dt>
<dd>The interface name tied to this device.</dd>
<dt><code>address</code></dt>
<dd>If present, the MAC address of the device.</dd>
<dt><code>capability</code></dt>
<dd>A network protocol exposed by the device, where the
attribute <code>type</code> can be "80203" for IEEE
802.3, or "80211" for various flavors of IEEE 802.11.
</dd>
</dl>
</dd>
<dt><code>scsi_host</code></dt>
<dd>Describes a SCSI host device. Sub-elements include:
<dl>
<dt><code>host</code></dt>
<dd>The SCSI host number.</dd>
<dt><code>capability</code></dt>
<dd>Current capabilities include "vports_ops" (indicates
vport operations are supported) and "fc_host", the later
implies following sub-elements: <code>wwnn</code>,
<code>wwpn</code>, <code>fabric_wwn</code>.
</dd>
</dl>
</dd>
<dt><code>scsi</code></dt>
<dd>Desribes a SCSI device. Sub-elements include:
<dl>
<dt><code>host</code></dt>
<dd>The SCSI host containing the device.</dd>
<dt><code>bus</code></dt>
<dd>The bus within the host.</dd>
<dt><code>target</code></dt>
<dd>The target within the bus.</dd>
<dt><code>lun</code></dt>
<dd>The lun within the target.</dd>
<dt><code>type</code></dt>
<dd>The type of SCSI device.</dd>
</dl>
</dd>
<dt><code>storage</code></dt>
<dd>Describes a device usable for storage. Sub-elements
include:
<dl>
<dt><code>block</code></dt>
<dd>A block device file name that accesses the storage
present on the device.</dd>
<dt><code>bus</code></dt>
<dd>If present, the name of the bus the device is found
on.</dd>
<dt><code>drive_type</code></dt>
<dd>The type of the drive, such as "disk" or
"cdrom".</dd>
<dt><code>model</code></dt>
<dd>Any model information available from the
device.</dd>
<dt><code>vendor</code></dt>
<dd>Any vendor information available from the
device.</dd>
<dt><code>serial</code></dt>
<dd>Any serial number information available from the
device.</dd>
<dt><code>size</code></dt>
<dd>For fixed-size storage, the amount of storage
available.</dd>
<dt><code>capability</code></dt>
<dd>If present, an additional capability is listed via
the attribute <code>type</code>. Current capabilites
include "hotpluggable" and "removable", with the
latter implying the following
sub-elements: <code>media_available</code> (0 or
1), <code>media_size</code>,
and <code>media_label</code>.</dd>
</dl>
</dd>
</dl>
</dd>
</dl>
<h2><a name="nodeExample">Examples</a></h2>
<p>The following are some example node device XML outputs:</p>
<pre>
&lt;device&gt;
&lt;name&gt;computer&lt;/name&gt;
&lt;capability type='system'&gt;
&lt;product&gt;2241B36&lt;/product&gt;
&lt;hardware&gt;
&lt;vendor&gt;LENOVO&lt;/vendor&gt;
&lt;version&gt;ThinkPad T500&lt;/version&gt;
&lt;serial&gt;R89055N&lt;/serial&gt;
&lt;uuid&gt;c9488981-5049-11cb-9c1c-993d0230b4cd&lt;/uuid&gt;
&lt;/hardware&gt;
&lt;firmware&gt;
&lt;vendor&gt;LENOVO&lt;/vendor&gt;
&lt;version&gt;6FET82WW (3.12 )&lt;/version&gt;
&lt;release_date&gt;11/26/2009&lt;/release_date&gt;
&lt;/firmware&gt;
&lt;/capability&gt;
&lt;/device&gt;
&lt;device&gt;
&lt;name&gt;net_eth1_00_27_13_6a_fe_00&lt;/name&gt;
&lt;parent&gt;pci_0000_00_19_0&lt;/parent&gt;
&lt;capability type='net'&gt;
&lt;interface&gt;eth1&lt;/interface&gt;
&lt;address&gt;00:27:13:6a:fe:00&lt;/address&gt;
&lt;capability type='80203'/&gt;
&lt;/capability&gt;
&lt;/device&gt;</pre>
</body>
</html>

View File

@@ -109,131 +109,6 @@
<br/><br/>
</p>
<h3><a name="nwfconceptschains">Filtering chains</a></h3>
<p>
Filtering rules are organized in filter chains. These chains can be
thought of as having a tree structure with packet
filtering rules as entries in individual chains (branches). <br>
Packets start their filter evaluation in the <code>root</code> chain
and can then continue their evaluation in other chains, return from
those chains back into the <code>root</code> chain or be
dropped or accepted by a filtering rule in one of the traversed chains.
<br/>
Libvirt's network filtering system automatically creates individual
<code>root</code> chains for every virtual machine's network interface
on which the user chooses to activate traffic filtering.
The user may write filtering rules that are either directly instantiated
in the <code>root</code> chain or may create protocol-specific
filtering chains for efficient evaluation of protocol-specific rules.
The following chains exist:
</p>
<ul>
<li>root</li>
<li>mac <span class="since">(since 0.9.8)</span></li>
<li>stp (spanning tree protocol)
<span class="since">(since 0.9.8)</span></li>
<li>vlan (802.1Q) <span class="since">(since 0.9.8)</span></li>
<li>arp, rarp</li>
<li>ipv4</li>
<li>ipv6</li>
</ul>
<p>
<span class="since">Since 0.9.8</span> multiple chains evaluating the
<code>mac</code>, <code>stp</code>, <code>vlan</code>,
<code>arp</code>, <code>rarp</code>, <code>ipv4</code>, or
<code>ipv6</code> protocol can be created using
the protocol name only as a prefix in the chain's name. This for
examples allows chains with names <code>arp-xyz</code> or
<code>arp-test</code> to be specified and have ARP protocol packets
evaluated in those chains.
<br/><br/>
The following filter shows an example of filtering ARP traffic
in the <code>arp</code> chain.
</p>
<pre>
&lt;filter name='no-arp-spoofing' chain='arp' priority='-500'&gt;
&lt;uuid&gt;f88f1932-debf-4aa1-9fbe-f10d3aa4bc95&lt;/uuid&gt;
&lt;rule action='drop' direction='out' priority='300'&gt;
&lt;mac match='no' srcmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='out' priority='350'&gt;
&lt;arp match='no' arpsrcmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='out' priority='400'&gt;
&lt;arp match='no' arpsrcipaddr='$IP'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='in' priority='450'&gt;
&lt;arp opcode='Reply'/&gt;
&lt;arp match='no' arpdstmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='in' priority='500'&gt;
&lt;arp match='no' arpdstipaddr='$IP'/&gt;
&lt;/rule&gt;
&lt;rule action='accept' direction='inout' priority='600'&gt;
&lt;arp opcode='Request'/&gt;
&lt;/rule&gt;
&lt;rule action='accept' direction='inout' priority='650'&gt;
&lt;arp opcode='Reply'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='inout' priority='1000'/&gt;
&lt;/filter&gt;
</pre>
<p>
The consequence of putting ARP-specific rules in the <code>arp</code>
chain, rather than for example in the <code>root</code> chain, is that
packets for any other protocol than ARP do not need to be evaluated by
ARP protocol-specific rules. This improves the efficiency
of the traffic filtering. However, one must then pay attention to only
put filtering rules for the given protocol into the chain since
any other rules will not be evaluated, i.e., an IPv4 rule will not
be evaluated in the ARP chain since no IPv4 protocol packets will
traverse the ARP chain.
<br/><br/>
</p>
<h3><a name="nwfconceptschainpriorities">Filtering chain priorities</a></h3>
<p>
All chains are connected to the <code>root</code> chain. The order in
which those chains are accessed is influenced by the priority of the
chain. The following table shows the chains that can be assigned a
priority and their default priorities.
</p>
<table class="top_table">
<tr>
<th> Chain (prefix) </th>
<th> Default priority </th>
</tr>
<tr>
<td>stp</td><td>-810</td>
</tr>
<tr>
<td>mac</td><td>-800</td>
</tr>
<tr>
<td>vlan</td><td>-750</td>
</tr>
<tr>
<td>ipv4</td><td>-700</td>
</tr>
<tr>
<td>ipv6</td><td>-600</td>
</tr>
<tr>
<td>arp</td><td>-500</td>
</tr>
<tr>
<td>rarp</td><td>-400</td>
</tr>
</table>
<p>
A chain with a lower priority value is accessed before one with a
higher value.
<br><br>
<span class="since">Since 0.9.8</span> the above listed chains
can be assigned custom priorities by writing a value in the
range [-1000, 1000] into the priority (XML) attribute in the filter
node. The above example filter shows the default priority of -500
for <code>arp</code> chains.
</p>
<h3><a name="nwfconceptsvars">Usage of variables in filters</a></h3>
<p>
@@ -260,11 +135,42 @@
<a href="#nwflimits">section on limitations</a> on how to use this
feature and what to expect when using it.
<br/><br/>
The above-shown network filer <code>no-arp-spoofing</code>
is an example of
The following is the XML description of the network filer
<code>no-arp-spoofing</code>. It serves as an example for
a network filter XML referencing the <code>MAC</code> and
<code>IP</code> variables.
<br/><br/>
<code>IP</code> parameters. This particular filter is referenced by the
<code>clean-traffic</code> filter.
</p>
<pre>
&lt;filter name='no-arp-spoofing' chain='arp'&gt;
&lt;uuid&gt;f88f1932-debf-4aa1-9fbe-f10d3aa4bc95&lt;/uuid&gt;
&lt;rule action='drop' direction='out' priority='300'&gt;
&lt;mac match='no' srcmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='out' priority='350'&gt;
&lt;arp match='no' arpsrcmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='out' priority='400'&gt;
&lt;arp match='no' arpsrcipaddr='$IP'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='in' priority='450'&gt;
&lt;arp opcode='Reply'/&gt;
&lt;arp match='no' arpdstmacaddr='$MAC'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='in' priority='500'&gt;
&lt;arp match='no' arpdstipaddr='$IP'/&gt;
&lt;/rule&gt;
&lt;rule action='accept' direction='inout' priority='600'&gt;
&lt;arp opcode='Request'/&gt;
&lt;/rule&gt;
&lt;rule action='accept' direction='inout' priority='650'&gt;
&lt;arp opcode='Reply'/&gt;
&lt;/rule&gt;
&lt;rule action='drop' direction='inout' priority='1000'/&gt;
&lt;/filter&gt;
</pre>
<p>
Note that referenced variables are always prefixed with the
$ (dollar) sign. The format of the value of a variable
must be of the type expected by the filter attribute in the
@@ -276,101 +182,8 @@
interface from attaching when hotplugging is used. The types
that are expected for each XML attribute are shown
below.
<br/><br/>
<span class="since">Since 0.9.8</span> variables can contain lists of
elements, e.g., the variable <code>IP</code> can contain multiple IP
addresses that are valid on a particular interface. The notation for
providing multiple elements for the IP variable is:
</p>
<pre>
...
&lt;devices&gt;
&lt;interface type='bridge'&gt;
&lt;mac address='00:16:3e:5d:c7:9e'/&gt;
&lt;filterref filter='clean-traffic'&gt;
&lt;parameter name='IP' value='10.0.0.1'/&gt;
&lt;parameter name='IP' value='10.0.0.2'/&gt;
&lt;parameter name='IP' value='10.0.0.3'/&gt;
&lt;/filterref&gt;
&lt;/interface&gt;
&lt;/devices&gt;
...</pre>
<p>
This then allows filters to enable multiple IP addresses
per interface. Therefore, with the list
of IP address shown above, the following rule will create 3
individual filtering rules, one for each IP address.
</p>
<pre>
...
&lt;rule action='accept' direction='in' priority='500'&gt;
&lt;tcp srpipaddr='$IP'/&gt;
&lt;/rule&gt;
...
</pre>
<p>
<span class="since">Since 0.9.10</span> it is possible to access
individual elements of a variable holding a list of elements.
A filtering rule like the following accesses the 2nd element
of the variable DSTPORTS.
</p>
<pre>
...
&lt;rule action='accept' direction='in' priority='500'&gt;
&lt;udp dstportstart='$DSTPORTS[1]'/&gt;
&lt;/rule&gt;
...
</pre>
<p>
<span class="since">Since 0.9.10</span> it is possible to create
filtering rules that instantiate all combinations of rules from
different lists using the notation of
<code>$VARIABLE[@&lt;iterator ID&gt;]</code>.
The following rule allows a virtual machine to
receive traffic on a set of ports, which are specified in DSTPORTS,
from the set of source IP address specified in SRCIPADDRESSES.
The rule generates all combinations of elements of the variable
DSTPORT with those of SRCIPADDRESSES by using two independent
iterators to access their elements.
</p>
<pre>
...
&lt;rule action='accept' direction='in' priority='500'&gt;
&lt;ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/&gt;
&lt;/rule&gt;
...
</pre>
<p>
In an example we assign concrete values to SRCIPADDRESSES and DSTPORTS
</p>
<pre>
SRCIPADDRESSES = [ 10.0.0.1, 11.1.2.3 ]
DSTPORTS = [ 80, 8080 ]
</pre>
<p>
Accessing the variables using $SRCIPADDRESSES[@1] and $DSTPORTS[@2] would
then result in all combinations of addresses and ports being created:
</p>
<pre>
10.0.0.1, 80
10.0.0.1, 8080
11.1.2.3, 80
11.1.2.3, 8080
</pre>
<p>
Accessing the same variables using a single iterator, for example by using
the notation $SRCIPADDRESSES[@1] and $DSTPORTS[@1], would result in
parallel access to both lists and result in the following combinations:
</p>
<pre>
10.0.0.1, 80
11.1.2.3, 8080
</pre>
<p>
Further, the notation of $VARIABLE is short-hand for $VARIABLE[@0]. The
former notation always assumes the iterator with Id '0'.
<p>
<h2><a name="nwfelems">Element and attribute overview</a></h2>
<p>
@@ -445,19 +258,11 @@
</p>
<ul>
<li>
action -- mandatory; must either be <code>drop</code>
(matching the rule silently discards the packet with no
further analysis),
<code>reject</code> (matching the rule generates an ICMP
reject message with no further analysis) <span class="since">(since
0.9.0)</span>, <code>accept</code> (matching the rule accepts
the packet with no further analysis), <code>return</code>
(matching the rule passes this filter, but returns control to
the calling filter for further
analysis) <span class="since">(since 0.9.7)</span>,
or <code>continue<code> (matching the rule goes on to the next
rule for further analysis) <span class="since">(since
0.9.7)</span>.
action -- mandatory; must either be <code>drop</code>,
<code>reject</code><span class="since">(since 0.9.0)</span>,
or <code>accept</code> if
the evaluation of the filtering rule is supposed to drop,
reject (using ICMP message), or accept a packet
</li>
<li>
direction -- mandatory; must either be <code>in</code>, <code>out</code> or
@@ -467,21 +272,10 @@
<li>
priority -- optional; the priority of the rule controls the order in
which the rule will be instantiated relative to other rules.
Rules with lower value will be instantiated before rules with higher
values.
Valid values are in the range of 0 to 1000.
<span class="since">Since 0.9.8</span> this has been extended to cover
the range of -1000 to 1000. If this attribute is not
provided, priority 500 will automatically be assigned.
<br>
Note that filtering rules in the <code>root</code> chain are sorted
with filters connected to the <code>root</code> chain following
their priorities. This allows to interleave filtering rules with
access to filter chains.
(See also section on
<a href="#nwfconceptschainpriorities">
filtering chain priorities
</a>.)
Rules with lower value will be instantiated and therefore evaluated
before rules with higher value.
Valid values are in the range of 0 to 1000. If this attribute is not
provided, the value 500 will automatically be assigned.
</li>
<li>
statematch -- optional; possible values are '0' or 'false' to
@@ -610,203 +404,6 @@
[...]
</pre>
<h5><a name="nwfelemsRulesProtoVLAN">VLAN (802.1Q)</a>
<span class="since">(Since 0.9.8)</span>
</h5>
<p>
Protocol ID: <code>vlan</code>
<br/>
Note: Rules of this type should go either into the <code>root</code> or
<code>vlan</code> chain.
</p>
<table class="top_table">
<tr>
<th> Attribute </th>
<th> Datatype </th>
<th> Semantics </th>
</tr>
<tr>
<td>srcmacaddr</td>
<td>MAC_ADDR</td>
<td>MAC address of sender</td>
</tr>
<tr>
<td>srcmacmask</td>
<td>MAC_MASK</td>
<td>Mask applied to MAC address of sender</td>
</tr>
<tr>
<td>dstmacaddr</td>
<td>MAC_ADDR</td>
<td>MAC address of destination</td>
</tr>
<tr>
<td>dstmacmask</td>
<td>MAC_MASK</td>
<td>Mask applied to MAC address of destination</td>
</tr>
<tr>
<td>vlan-id</td>
<td>UINT16 (0x0-0xfff, 0 - 4095)</td>
<td>VLAN ID</td>
</tr>
<tr>
<td>encap-protocol</td>
<td>UINT16 (0x03c-0xfff), String</td>
<td>Encapsulated layer 3 protocol ID</td>
</tr>
<tr>
<td>comment </td>
<td>STRING</td>
<td>text with max. 256 characters</td>
</tr>
</table>
<p>
Valid Strings for <code>encap-protocol</code> are: arp, ipv4, ipv6
</p>
<h5><a name="nwfelemsRulesProtoSTP">STP (Spanning Tree Protocol)</a>
<span class="since">(Since 0.9.8)</span>
</h5>
<p>
Protocol ID: <code>stp</code>
<br/>
Note: Rules of this type should go either into the <code>root</code> or
<code>stp</code> chain.
</p>
<table class="top_table">
<tr>
<th> Attribute </th>
<th> Datatype </th>
<th> Semantics </th>
</tr>
<tr>
<td>srcmacaddr</td>
<td>MAC_ADDR</td>
<td>MAC address of sender</td>
</tr>
<tr>
<td>srcmacmask</td>
<td>MAC_MASK</td>
<td>Mask applied to MAC address of sender</td>
</tr>
<tr>
<td>type</td>
<td>UINT8</td>
<td>Bridge Protcol Data Unit (BPDU) type</td>
</tr>
<tr>
<td>flags</td>
<td>UINT8</td>
<td>BPDU flag</td>
</tr>
<tr>
<td>root-priority</td>
<td>UINT16</td>
<td>Root priority (range start)</td>
</tr>
<tr>
<td>root-priority-hi</td>
<td>UINT16</td>
<td>Root priority range end</td>
</tr>
<tr>
<td>root-address</td>
<td>MAC_ADDRESS</td>
<td>Root MAC address</td>
</tr>
<tr>
<td>root-address-mask</td>
<td>MAC_MASK</td>
<td>Root MAC address mask</td>
</tr>
<tr>
<td>root-cost</td>
<td>UINT32</td>
<td>Root path cost (range start)</td>
</tr>
<tr>
<td>root-cost-hi</td>
<td>UINT32</td>
<td>Root path cost range end</td>
</tr>
<tr>
<td>sender-priority</td>
<td>UINT16</td>
<td>Sender priority (range start)</td>
</tr>
<tr>
<td>sender-priority-hi</td>
<td>UINT16</td>
<td>Sender priority range end</td>
</tr>
<tr>
<td>sender-address</td>
<td>MAC_ADDRESS</td>
<td>BPDU sender MAC address</td>
</tr>
<tr>
<td>sender-address-mask</td>
<td>MAC_MASK</td>
<td>BPDU sender MAC address mask</td>
</tr>
<tr>
<td>port</td>
<td>UINT16</td>
<td>Port identifier (range start)</td>
</tr>
<tr>
<td>port_hi</td>
<td>UINT16</td>
<td>Port identifier range end</td>
</tr>
<tr>
<td>msg-age</td>
<td>UINT16</td>
<td>Message age timer (range start)</td>
</tr>
<tr>
<td>msg-age-hi</td>
<td>UINT16</td>
<td>Message age timer range end</td>
</tr>
<tr>
<td>max-age</td>
<td>UINT16</td>
<td>Maximum age timer (range start)</td>
</tr>
<tr>
<td>max-age-hi</td>
<td>UINT16</td>
<td>Maximum age timer range end</td>
</tr>
<tr>
<td>hello-time</td>
<td>UINT16</td>
<td>Hello time timer (range start)</td>
</tr>
<tr>
<td>hello-time-hi</td>
<td>UINT16</td>
<td>Hello time timer range end</td>
</tr>
<tr>
<td>forward-delay</td>
<td>UINT16</td>
<td>Forward delay (range start)</td>
</tr>
<tr>
<td>forward-delay-hi</td>
<td>UINT16</td>
<td>Forward delay range end</td>
</tr>
<tr>
<td>comment</td>
<td>STRING</td>
<td>text with max. 256 characters</td>
</tr>
</table>
<h5><a name="nwfelemsRulesProtoARP">ARP/RARP</a></h5>
<p>
Protocol ID: <code>arp</code> or <code>rarp</code>
@@ -896,7 +493,6 @@
<h5><a name="nwfelemsRulesProtoIP">IPv4</a></h5>
<p>
Protocol ID: <code>ip</code>
<br/>
Note: Rules of this type should either go into the
<code>root</code> or <code>ipv4</code> chain.
</p>
@@ -987,7 +583,6 @@
<h5><a name="nwfelemsRulesProtoIPv6">IPv6</a></h5>
<p>
Protocol ID: <code>ipv6</code>
<br/>
Note: Rules of this type should either go into the
<code>root</code> or <code>ipv6</code> chain.
</p>
@@ -1828,10 +1423,8 @@
</p>
<ul>
<li>mac</li>
<li>stp (spanning tree protocol)</li>
<li>vlan (802.1Q)</li>
<li>arp, rarp</li>
<li>ipv4</li>
<li>ip</li>
<li>ipv6</li>
</ul>
@@ -1843,14 +1436,13 @@
filter subsystem first passes through the filtering support implemented
by ebtables and only then through iptables or ip6tables filters. If
a filter tree has rules with the protocols <code>mac</code>,
<code>stp</code>, <code>vlan</code>
<code>arp</code>, <code>rarp</code>, <code>ipv4</code>,
or <code>ipv6</code> ebtables rules will automatically be instantiated.
<code>arp</code>, <code>rarp</code>, <code>ip</code>, or <code>ipv6</code>
ebtables rules will automatically be instantiated.
<br/>
The role of the <code>chain</code> attribute in the network filter
XML is that internally a new user-defined ebtables table is created
that then for example receives all <code>arp</code> traffic coming
from or going to a virtual machine if the chain <code>arp</code>
from or going to a virtual machine, if the chain <code>arp</code>
has been specified. Further, a rule is generated in an interface's
<code>root</code> chain that directs all ipv4 traffic into the
user-defined chain. Therefore, all ARP traffic rules should then be
@@ -1858,12 +1450,6 @@
into user-defined tables is only supported with filtering on the ebtables
layer.
<br/>
<span class="since">Since 0.9.8</span> multiple chains for the same
protocol can be created. For this the name of the chain must have
a prefix of one of the previously enumerated protocols. To create an
additional chain for handling of ARP traffic, a chain with name
<code>arp-test</code> can be specified.
<br/>
As an example, it is
possible to filter on UDP traffic by source and destination ports using
the <code>ip</code> protocol filter and specifying attributes for the
@@ -2209,13 +1795,6 @@
0.8.1 or later in order not to lose the network traffic filters
associated with an interface.
</p>
<h3><a name="nwflimitsvlan">VLAN filtering on Linux</a></h3>
<p>
VLAN (802.1Q) packets, if sent by a virtual machine, cannot be filtered
with rules for protocol IDs <code>arp</code>, <code>rarp</code>,
<code>ipv4</code> and <code>ipv6</code> but only
with protocol IDs <code>mac</code> and <code>vlan</code>. Therefore,
the example filter <code>clean-traffic</code> will not work as expected.
</p>
</body>
</html>

View File

@@ -39,8 +39,8 @@
<dd>
Specifies what this secret is used for. A mandatory
<code>type</code> attribute specifies the usage category, currently
only <code>volume</code> and <code>ceph</code> are defined.
Specific usage categories are described below.
only <code>volume</code> is defined. Specific usage categories are
described below.
</dd>
</dl>
@@ -54,18 +54,6 @@
this secret is associated with.
</p>
<h3>Usage type "ceph"</h3>
<p>
This secret is associated with a Ceph RBD (rados block device).
The <code>&lt;usage type='ceph'&gt;</code> element must contain
a single <code>name</code> element that specifies a usage name
for the secret. The Ceph secret can then be used by UUID or by
this usage name via the <code>&lt;auth&gt;</code> element of
a <a href="domain.html#elementsDisks">disk
device</a>. <span class="since">Since 0.9.7</span>.
</p>
<h2><a name="example">Example</a></h2>
<pre>

View File

@@ -13,7 +13,7 @@
volumes. Some may have constraints on volume size, or placement.
</p>
<p>
The top level tag for a storage pool document is 'pool'. It has
The is the top level tag for a storage pool document is 'pool'. It has
a single attribute <code>type</code>, which is one of <code>dir</code>,
<code>fs</code>,<code>netfs</code>,<code>disk</code>,<code>iscsi</code>,
<code>logical</code>. This corresponds to the storage backend drivers
@@ -234,24 +234,11 @@
to sparsely allocate a volume. It does not have to honour requests
for sparse allocation though.<br/>
<br/>
By default this is specified in bytes, but an optional attribute
By default this is specified in bytes, but an optional
<code>unit</code> can be specified to adjust the passed value.
Values can be: 'B' or 'bytes' for bytes, 'KB' (kilobytes,
10<sup>3</sup> or 1000 bytes), 'K' or 'KiB' (kibibytes,
2<sup>10</sup> or 1024 bytes), 'MB' (megabytes, 10<sup>6</sup>
or 1,000,000 bytes), 'M' or 'MiB' (mebibytes, 2<sup>20</sup>
or 1,048,576 bytes), 'GB' (gigabytes, 10<sup>9</sup> or
1,000,000,000 bytes), 'G' or 'GiB' (gibibytes, 2<sup>30</sup>
or 1,073,741,824 bytes), 'TB' (terabytes, 10<sup>12</sup> or
1,000,000,000,000 bytes), 'T' or 'TiB' (tebibytes,
2<sup>40</sup> or 1,099,511,627,776 bytes), 'PB' (petabytes,
10<sup>15</sup> or 1,000,000,000,000,000 bytes), 'P' or 'PiB'
(pebibytes, 2<sup>50</sup> or 1,125,899,906,842,624 bytes),
'EB' (exabytes, 10<sup>18</sup> or 1,000,000,000,000,000,000
bytes), or 'E' or 'EiB' (exbibytes, 2<sup>60</sup> or
1,152,921,504,606,846,976 bytes). <span class="since">Since
0.4.1, multi-character <code>unit</code> since
0.9.11</span></dd>
Values can be: 'K' (kilobytes), 'M' (megabytes), 'G' (gigabytes),
'T' (terabytes), 'P' (petabytes), or 'E' (exabytes).
<span class="since">Since 0.4.1</span></dd>
<dt><code>capacity</code></dt>
<dd>Providing the logical capacity for the volume. This value is
in bytes by default, but a <code>unit</code> attribute can be

View File

@@ -585,12 +585,6 @@
<li><p>For strict equality of a prefix:</p>
<pre>
STRPREFIX(a,b)
</pre>
</li>
<li><p>To avoid having to check if a or b are NULL:</p>
<pre>
STREQ_NULLABLE(a, b)
STRNEQ_NULLABLE(a, b)
</pre>
</li>
</ul>

View File

@@ -120,16 +120,6 @@
called again, <span class="since">since 0.9.0</span>, to allow
any additional resource cleanup:<br/>
<pre>/etc/libvirt/hooks/qemu guest_name release end -</pre></li>
<li><span class="since">Since 0.9.11</span>, the qemu hook script
is also called at the beginning of incoming migration. It is called
as: <pre>/etc/libvirt/hooks/qemu guest_name migrate begin -</pre>
with domain XML sent to standard input of the script. In this case,
the script acts as a filter and is supposed to modify the domain
XML and print it out on its standard output. Empty output is
identical to copying the input XML without changing it. In case the
script returns failure or the output XML is not valid, incoming
migration will be canceled. This hook may be used, e.g., to change
location of disk images for incoming domains.</li>
</ul>
<h5><a name="lxc">/etc/libvirt/hooks/lxc</a></h5>
@@ -171,20 +161,19 @@
source and destination hosts:</p>
<ol>
<li>At the beginning of the migration, the <i>qemu</i> hook script on
the <b>destination</b> host is executed with the "migrate"
operation.</li>
<li>Before QEMU process is spawned, the two operations ("prepare" and
"start") called for domain start are executed on
<b>destination</b> host.</li>
<li>If both of these hook script executions exit successfully (exit
status 0), the migration continues. Any other exit code indicates
failure, and the migration is aborted.</li>
<li>The QEMU guest is then migrated to the destination host.</li>
the <b>destination</b> host is executed with the "start"
operation.<br/><br/></li>
<li>If this hook script returns indicating success (error code 0), the
migration continues. Any other return code indicates failure, and
the migration is aborted.<br/><br/></li>
<li>The QEMU guest is then migrated to the destination host.<br/>
<br/></li>
<li>Unless an error occurs during the migration process, the <i>qemu</i>
hook script on the <b>source</b> host is then executed with the
"stopped" and "release" operations to indicate it is no longer
running on this host. Regardless of the return codes, the
migration is not aborted as it has already been performed.</li>
hook script on the <b>source</b> host is then executed with the "stopped"
operation, to indicate it is no longer running on this
host.<br/><br/>
Regardless of the return code from this hook script, the migration
is not aborted as it has already been performed.</li>
</ol>
<br/>

1
docs/html/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.html

View File

@@ -373,10 +373,7 @@
allocation of collected information (however, on an
out-of-memory condition, the buffer may still be NULL). The
caller is responsible for freeing registered buffers, since the
buffers are designed to persist beyond virCommandFree. It
is possible to pass the same pointer to both
virCommandSetOutputBuffer and virCommandSetErrorBuffer, in which
case the child process interleaves output into a single string.
buffers are designed to persist beyond virCommandFree.
</p>
<h3><a name="directory">Setting working directory</a></h3>
@@ -448,7 +445,7 @@
<strong>Note:</strong> if the command has been daemonized
this will only block &amp; wait for the intermediate process,
not the real command. <code>virCommandRun</code> will
report on any errors that have occurred upon this point
report on any errors that have occured upon this point
with all previous API calls. If the command fails to
run, or exits with non-zero status an error will be
reported via normal libvirt error infrastructure. If a

View File

@@ -163,28 +163,14 @@
<ul>
<li>type=call: the in parameters for the method call, XDR encoded</li>
<li>type=call-with-fds: number of file handles, then the in parameters for the method call, XDR encoded, followed by the file handles</li>
<li>type=reply+status=ok: the return value and/or out parameters for the method call, XDR encoded</li>
<li>type=reply+status=error: the error information for the method, a virErrorPtr XDR encoded</li>
<li>type=reply-with-fds+status=ok: number of file handles, the return value and/or out parameters for the method call, XDR encoded, followed by the file handles</li>
<li>type=reply-with-fds+status=error: number of file handles, the error information for the method, a virErrorPtr XDR encoded, followed by the file handles</li>
<li>type=event: the parameters for the event, XDR encoded</li>
<li>type=stream+status=ok: no payload</li>
<li>type=stream+status=error: the error information for the method, a virErrorPtr XDR encoded</li>
<li>type=stream+status=continue: the raw bytes of data for the stream. No XDR encoding</li>
</ul>
<p>
With the two packet types that support passing file descriptors, in
between the header and the payload there will be a 4-byte integer
specifying the number of file descriptors which are being sent.
The actual file handles are sent after the payload has been sent.
Each file handle has a single dummy byte transmitted as a carrier
for the out of band file descriptor. While the sender should always
send '\0' as the dummy byte value, the receiver ought to ignore the
value for the sake of robustness.
</p>
<p>
For the exact payload information for each procedure, consult the XDR protocol
definition for the program+version in question
@@ -353,27 +339,6 @@
+--+-----------------------+--------+
</pre>
<h4><a name="wireexamplescallfd">Method call with passed FD</a></h4>
<p>
A single method call with 2 passed file descriptors and successful
reply, for a program=8, version=1, procedure=3, which 10 bytes worth
of input args, and 4 bytes worth of return values. The number of
file descriptors is encoded as a 32-bit int. Each file descriptor
then has a 1 byte dummy payload. The overall input
packet length is 4 + 24 + 4 + 2 + 10 == 44, and output packet length 32.
</p>
<pre>
+--+-----------------------+---------------+-------+
C --&gt; |44| 8 | 1 | 3 | 0 | 1 | 0 | 2 | .o.oOo.o. | 0 | 0 | --&gt; S (call)
+--+-----------------------+---------------+-------+
+--+-----------------------+--------+
C &lt;-- |32| 8 | 1 | 3 | 1 | 1 | 0 | .o.oOo | &lt;-- S (reply)
+--+-----------------------+--------+
</pre>
<h2><a name="security">RPC security</a></h2>

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -364,51 +364,3 @@ span.since {
font-style: italic;
font-weight: bold;
}
img.diagram {
background: rgb(230,230,230);
border: 2px dotted rgb(178,178,178);
padding: 1em;
display: block;
margin-left: auto;
margin-right: auto;
}
table.data th, table.data td {
padding: 0.3em;
}
table.data {
border-spacing: 0px;
}
table.data thead th {
background: rgb(178,178,178);
text-align: center;
}
table.data {
border: 1px solid black;
border-collapse: collapse;
}
table.data thead tr th {
border: 1px solid black;
}
table.data tr.head th {
border-left: 1px solid black;
border-right: 1px solid black;
}
table.data tbody td {
background: rgb(240,240,240);
}
table.data tbody td.y {
background: rgb(220,255,220);
text-align: center;
}
table.data tbody td.n {
background: rgb(255,220,220);
text-align: center;
}

View File

@@ -76,7 +76,7 @@
<p>
The sanlock daemon must be started on every single host
that will be running virtual machines. So repeat these
steps as necessary.
steps as neccessary.
</p>
<h2><a name="sanlockplugin">libvirt sanlock plugin configuration</a></h2>

View File

@@ -170,8 +170,8 @@ export LIBVIRT_LOG_OUTPUTS="1:file:virsh.log"</pre>
put the correct breakpoints when running under a debugger.</p>
<p>To activate full debug of the libvirt entry points, utility
functions and the QEmu/KVM driver, set:</p>
<pre>log_filters="1:libvirt 1:util 1:qemu"
log_outputs="1:file:/var/log/libvirt/libvirtd.log"</pre>
<pre>log_filters=1:libvirt 1:util 1:qemu
log_output=1:file:/var/log/libvirt/libvirtd.log</pre>
<p>in libvirtd.conf and restart the daemon will allow to
gather a copious amount of debugging traces for the operations done
in those areas.</p>

View File

@@ -1,58 +0,0 @@
#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2775 2400 3675 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
2775 2400 3675 2400 3675 2850 2775 2850 2775 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 2925 2700 libvirtd\001
-6
6 5400 2400 6300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
5400 2400 6300 2400 6300 2850 5400 2850 5400 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 5550 2700 libvirtd\001
-6
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1200 1200 3825 1200 3825 3000 1200 3000 1200 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5250 1200 7875 1200 7875 3000 5250 3000 5250 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5400 1350 6075 1350 6075 1950 5400 1950 5400 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6225 1350 6900 1350 6900 1950 6225 1950 6225 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3000 1350 3675 1350 3675 1950 3000 1950 3000 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 1350 2850 1350 2850 1950 2175 1950 2175 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 1350 2025 1350 2025 1950 1350 1950 1350 1350
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
1 1 1.00 135.00 180.00
4350 4275 4350 3600 3300 3600 3300 2850
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
1 1 1.00 135.00 180.00
4800 4275 4800 3600 5775 3600 5775 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3225 4125 5850 4125 5850 6000 3225 6000 3225 4125
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
3375 5100 5700 5100 5700 5550 3375 5550 3375 5100
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
1 1 1.00 135.00 180.00
3750 5100 3750 4500 4050 4500
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
4050 4275 5100 4275 5100 4725 4050 4725 4050 4275
4 0 0 50 -1 16 12 0.0000 4 150 870 6825 2850 Dest Host\001
4 0 0 50 -1 16 12 0.0000 4 150 1080 1350 2850 Source Host\001
4 0 0 50 -1 16 12 0.0000 4 150 495 1425 1725 VM-A\001
4 0 0 50 -1 16 12 0.0000 4 150 495 2250 1725 VM-B\001
4 0 0 50 -1 16 12 0.0000 4 150 495 3075 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 5475 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 6300 1725 VM-D\001
4 0 0 50 -1 16 12 0.0000 4 150 960 4725 5850 Client Host\001
4 0 0 50 -1 16 12 0.0000 4 180 1500 3525 5400 management app\001
4 0 0 50 -1 16 12 0.0000 4 150 735 4200 4575 libvirt.so\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -1,58 +0,0 @@
#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2775 2400 3675 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
2775 2400 3675 2400 3675 2850 2775 2850 2775 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 2925 2700 libvirtd\001
-6
6 5400 2400 6300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
5400 2400 6300 2400 6300 2850 5400 2850 5400 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 5550 2700 libvirtd\001
-6
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1200 1200 3825 1200 3825 3000 1200 3000 1200 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5250 1200 7875 1200 7875 3000 5250 3000 5250 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5400 1350 6075 1350 6075 1950 5400 1950 5400 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6225 1350 6900 1350 6900 1950 6225 1950 6225 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3000 1350 3675 1350 3675 1950 3000 1950 3000 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 1350 2850 1350 2850 1950 2175 1950 2175 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 1350 2025 1350 2025 1950 1350 1950 1350 1350
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
1 1 1.00 135.00 180.00
4350 4275 4350 3600 3300 3600 3300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3225 4125 5850 4125 5850 6000 3225 6000 3225 4125
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
3375 5100 5700 5100 5700 5550 3375 5550 3375 5100
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
1 1 1.00 135.00 180.00
3750 5100 3750 4500 4050 4500
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
4050 4275 5100 4275 5100 4725 4050 4725 4050 4275
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 135.00 180.00
3675 2625 5400 2625
4 0 0 50 -1 16 12 0.0000 4 150 870 6825 2850 Dest Host\001
4 0 0 50 -1 16 12 0.0000 4 150 1080 1350 2850 Source Host\001
4 0 0 50 -1 16 12 0.0000 4 150 495 1425 1725 VM-A\001
4 0 0 50 -1 16 12 0.0000 4 150 495 2250 1725 VM-B\001
4 0 0 50 -1 16 12 0.0000 4 150 495 3075 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 5475 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 6300 1725 VM-D\001
4 0 0 50 -1 16 12 0.0000 4 150 960 4725 5850 Client Host\001
4 0 0 50 -1 16 12 0.0000 4 180 1500 3525 5400 management app\001
4 0 0 50 -1 16 12 0.0000 4 150 735 4200 4575 libvirt.so\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,43 +0,0 @@
#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2775 2400 3675 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
2775 2400 3675 2400 3675 2850 2775 2850 2775 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 2925 2700 libvirtd\001
-6
6 5400 2400 6300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
5400 2400 6300 2400 6300 2850 5400 2850 5400 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 5550 2700 libvirtd\001
-6
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 1 0 4
1 1 1.00 135.00 180.00
3375 1350 3375 825 5700 825 5700 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1200 1200 3825 1200 3825 3000 1200 3000 1200 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5250 1200 7875 1200 7875 3000 5250 3000 5250 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6225 1350 6900 1350 6900 1950 6225 1950 6225 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5400 1350 6075 1350 6075 1950 5400 1950 5400 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3000 1350 3675 1350 3675 1950 3000 1950 3000 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 1350 2850 1350 2850 1950 2175 1950 2175 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 1350 2025 1350 2025 1950 1350 1950 1350 1350
4 0 0 50 -1 16 12 0.0000 4 150 495 1425 1725 VM-A\001
4 0 0 50 -1 16 12 0.0000 4 150 495 2250 1725 VM-B\001
4 0 0 50 -1 16 12 0.0000 4 150 495 3075 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 5475 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 6300 1725 VM-D\001
4 0 0 50 -1 16 12 0.0000 4 150 1080 1350 2850 Source Host\001
4 0 0 50 -1 16 12 0.0000 4 150 870 6825 2850 Dest Host\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,49 +0,0 @@
#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2775 2400 3675 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
2775 2400 3675 2400 3675 2850 2775 2850 2775 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 2925 2700 libvirtd\001
-6
6 5400 2400 6300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
5400 2400 6300 2400 6300 2850 5400 2850 5400 2400
4 0 0 50 -1 16 12 0.0000 4 150 570 5550 2700 libvirtd\001
-6
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 135.00 180.00
3375 1950 3375 2400
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 1 0 4
1 1 1.00 135.00 180.00
3375 2850 3375 3375 5700 3375 5700 2850
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 135.00 180.00
5700 2400 5700 1950
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1200 1200 3825 1200 3825 3000 1200 3000 1200 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5250 1200 7875 1200 7875 3000 5250 3000 5250 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5400 1350 6075 1350 6075 1950 5400 1950 5400 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6225 1350 6900 1350 6900 1950 6225 1950 6225 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3000 1350 3675 1350 3675 1950 3000 1950 3000 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 1350 2850 1350 2850 1950 2175 1950 2175 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 1350 2025 1350 2025 1950 1350 1950 1350 1350
4 0 0 50 -1 16 12 0.0000 4 150 870 6825 2850 Dest Host\001
4 0 0 50 -1 16 12 0.0000 4 150 1080 1350 2850 Source Host\001
4 0 0 50 -1 16 12 0.0000 4 150 495 1425 1725 VM-A\001
4 0 0 50 -1 16 12 0.0000 4 150 495 2250 1725 VM-B\001
4 0 0 50 -1 16 12 0.0000 4 150 495 3075 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 5475 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 6300 1725 VM-D\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,58 +0,0 @@
#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2775 2400 3675 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
2775 2400 3675 2400 3675 2850 2775 2850 2775 2400
4 0 0 50 -1 16 12 0.0000 4 150 630 2925 2700 HV Ctrl\001
-6
6 5400 2400 6300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
5400 2400 6300 2400 6300 2850 5400 2850 5400 2400
4 0 0 50 -1 16 12 0.0000 4 150 630 5550 2700 HV Ctrl\001
-6
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1200 1200 3825 1200 3825 3000 1200 3000 1200 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5250 1200 7875 1200 7875 3000 5250 3000 5250 1200
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5400 1350 6075 1350 6075 1950 5400 1950 5400 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6225 1350 6900 1350 6900 1950 6225 1950 6225 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3000 1350 3675 1350 3675 1950 3000 1950 3000 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 1350 2850 1350 2850 1950 2175 1950 2175 1350
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1350 1350 2025 1350 2025 1950 1350 1950 1350 1350
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
1 1 1.00 135.00 180.00
4350 4275 4350 3600 3300 3600 3300 2850
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3225 4125 5850 4125 5850 6000 3225 6000 3225 4125
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
3375 5100 5700 5100 5700 5550 3375 5550 3375 5100
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
1 1 1.00 135.00 180.00
3750 5100 3750 4500 4050 4500
2 2 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
4050 4275 5100 4275 5100 4725 4050 4725 4050 4275
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 135.00 180.00
3675 2625 5400 2625
4 0 0 50 -1 16 12 0.0000 4 150 870 6825 2850 Dest Host\001
4 0 0 50 -1 16 12 0.0000 4 150 1080 1350 2850 Source Host\001
4 0 0 50 -1 16 12 0.0000 4 150 495 1425 1725 VM-A\001
4 0 0 50 -1 16 12 0.0000 4 150 495 2250 1725 VM-B\001
4 0 0 50 -1 16 12 0.0000 4 150 495 3075 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 5475 1725 VM-C\001
4 0 0 50 -1 16 12 0.0000 4 150 495 6300 1725 VM-D\001
4 0 0 50 -1 16 12 0.0000 4 150 960 4725 5850 Client Host\001
4 0 0 50 -1 16 12 0.0000 4 180 1500 3525 5400 management app\001
4 0 0 50 -1 16 12 0.0000 4 150 735 4200 4575 libvirt.so\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,601 +0,0 @@
<html>
<body>
<h1>Guest migration</h1>
<ul id="toc"></ul>
<p>
Migration of guests between hosts is a complicated problem with many possible
solutions, each with their own positive and negative points. For maximum
flexibility of both hypervisor integration, and adminsitrator deployment,
libvirt implements several options for migration.
</p>
<h2><a id="transport">Network data transports</a></h2>
<p>
There are two options for the data transport used during migration, either
the hypervisor's own <strong>native</strong> transport, or <strong>tunnelled</strong>
over a libvirtd connection.
</p>
<h3><a id="transportnative">Hypervisor native transport</a></h3>
<p>
<em>Native</em> data transports may or may not support encryption, depending
on the hypervisor in question, but will typically have the lowest computational costs
by minimising the number of data copies involved. The native data transports will also
require extra hypervisor-specific network configuration steps by the administrator when
deploying a host. For some hypervisors, it might be necessary to open up a large range
of ports on the firewall to allow multiple concurrent migration operations.
</p>
<p>
<img class="diagram" src="migration-native.png" alt="Migration native path">
</p>
<h3><a id="transporttunnel">libvirt tunnelled transport</a></h3>
<p>
<em>Tunnelled</em> data transports will always be capable of strong encryption
since they are able to leverage the capabilities built in to the libvirt RPC protocol.
The downside of a tunnelled transport, however, is that there will be extra data copies
involved on both the source and destinations hosts as the data is moved between libvirtd
and the hypervisor. This is likely to be a more significant problem for guests with
very large RAM sizes, which dirty memory pages quickly. On the deployment side, tunnelled
transports do not require any extra network configuration over and above what's already
required for general libvirtd <a href="remote.html">remote access</a>, and there is only
need for a single port to be open on the firewall to support multiple concurrent
migration operations.
</p>
<p>
<img class="diagram" src="migration-tunnel.png" alt="Migration tunnel path">
</p>
<h2><a id="flow">Communication control paths/flows</a></h2>
<p>
Migration of virtual machines requires close co-ordination of the two
hosts involved, as well as the application invoking the migration,
which may be on the source, the destination, or a third host.
</p>
<h3><a id="flowmanageddirect">Managed direct migration</a></h3>
<p>
With <em>managed direct</em> migration, the libvirt client process
controls the various phases of migration. The client application must
be able to connect and authenticate with the libvirtd daemons on both
the source and destination hosts. There is no need for the two libvirtd
daemons to communicate with each other. If the client application
crashes, or otherwise loses its connection to libvirtd during the
migration process, an attempt will be made to abort the migration and
restart the guest CPUs on the source host. There may be scenarios
where this cannot be safely done, in which cases the guest will be
left paused on one or both of the hosts.
</p>
<p>
<img class="diagram" src="migration-managed-direct.png" alt="Migration direct, managed">
</p>
<h3><a id="flowpeer2peer">Managed peer to peer migration</a></h3>
<p>
With <em>peer to peer</em> migration, the libvirt client process only
talks to the libvirtd daemon on the source host. The source libvirtd
daemon controls the entire migration process itself, by directly
connecting the destination host libvirtd. If the client application crashes,
or otherwise loses its connection to libvirtd, the migration process
will continue uninterrupted until completion.
</p>
<p>
<img class="diagram" src="migration-managed-p2p.png" alt="Migration peer-to-peer">
</p>
<h3><a id="flowunmanageddirect">Unmanaged direct migration</a></h3>
<p>
With <em>unmanaged direct</em> migration, neither the libvirt client
or libvirtd daemon control the migration process. Control is instead
delegated to the hypervisor's over management services (if any). The
libvirt client merely initiates the migration via the hypervisor's
management layer. If the libvirt client or libvirtd crash, the
migration process will continue uninterrupted until completion.
</p>
<p>
<img class="diagram" src="migration-unmanaged-direct.png" alt="Migration direct, unmanaged">
</p>
<h2><a id="security">Data security</a></h2>
<p>
Since the migration data stream includes a complete copy of the guest
OS RAM, snooping of the migration data stream may allow compromise
of sensitive guest information. If the virtualization hosts have
multiple network interfaces, or if the network switches support
tagged VLANs, then it is very desirable to separate guest network
traffic from migration or management traffic.
</p>
<p>
In some scenarios, even a separate network for migration data may
not offer sufficient security. In this case it is possible to apply
encryption to the migration data stream. If the hypervisor does not
itself offer encryption, then the libvirt tunnelled migration
facility should be used.
</p>
<h2><a id="uris">Migration URIs</a></h2>
<p>
Initiating a guest migration requires the client application to
specify up to three URIs, depending on the choice of control
flow and/or APIs used. The first URI is that of the libvirt
connection to the source host, where the virtual guest is
currently running. The second URI is that of the libvirt
connection to the destination host, where the virtual guest
will be moved to. The third URI is a hypervisor specific
URI used to control how the guest will be migrated. With
any managed migration flow, the first and second URIs are
compulsory, while the third URI is optional. With the
unmanaged direct migration mode, the first and third URIs are
compulsory and the second URI is not used.
</p>
<p>
Ordinarily management applications only need to care about the
first and second URIs, which are both in the normal libvirt
connection URI format. Libvirt will then automatically determine
the hypervisor specific URI, by looking up the target host's
configured hostname. There are a few scenarios where the management
application may wish to have direct control over the third URI.
</p>
<ol>
<li>The configured hostname is incorrect, or DNS is broken. If a
host has a hostname which will not resolve to match one of its
public IP addresses, then libvirt will generate an incorrect
URI. In this case the management application should specify the
hypervisor specific URI explicitly, using an IP address, or a
correct hostname.</li>
<li>The host has multiple network interaces. If a host has multiple
network interfaces, it might be desirable for the migration data
stream to be sent over a specific interface for either security
or performance reasons. In this case the management application
should specify the hypervisor specific URI, using an IP address
associated with the network to be used.</li>
<li>The firewall restricts what ports are available. When libvirt
generates a migration URI will pick a port number using hypervisor
specific rules. Some hypervisors only require a single port to be
open in the firewalls, while others require a whole range of port
numbers. In the latter case the management application may wish
to choose a specific port number outside the default range in order
to comply with local firewall policies</li>
</ol>
<h2><a id="config">Configuration file handling</a></h2>
<p>
There are two types of virtual machine known to libvirt. A <em>transient</em>
guest only exists while it is running, and has no configuration file stored
on disk. A <em>persistent</em> guest maintains a configuration file on disk
even when it is not running.
</p>
<p>
By default, a migration operation will not attempt to change any configuration
files that may be stored on either the source or destination host. It is the
administrator, or management application's, responsibility to manage distribution
of configuration files (if desired). It is important to note that the <code>/etc/libvirt</code>
directory <strong>MUST NEVER BE SHARED BETWEEN HOSTS</strong>. There are some
typical scenarios that might be applicable:
</p>
<ul>
<li>Centralized configuration files outside libvirt, in shared storage. A cluster
aware management application may maintain all the master guest configuration
files in a cluster filesystem. When attempting to start a guest, the config
will be read from the cluster FS and used to deploy a persistent guest.
For migration the configuration will need to be copied to the destination
host and removed on the original.
</li>
<li>Centralized configuration files outside libvirt, in a database. A data center
management application may not storage configuration files at all. Instead it
may generate libvirt XML on the fly when a guest is booted. It will typically
use transient guests, and thus not have to consider configuration files during
migration.
</li>
<li>Distributed configuration inside libvirt. The configuration file for each
guest is copied to every host where the guest is able to run. Upon migration
the existing config merely needs to be updated with any changes
</li>
<li>Ad-hoc configuration management inside libvirt. Each guest is tied to a
specific host and rarely migrated. When migration is required, the config
is moved from one host to the other.
</li>
</ul>
<p>
As mentioned above, libvirt will not touch configuration files during
migration by default. The <code>virsh</code> command has two flags to
influence this behaviour. The <code>--undefine-source</code> flag
will cause the configuration file to be removed on the source host
after a successful migration. The <code>--persist</code> flag will
cause a configuration file to be created on the destination host
after a successful migration. The following table summarizes the
configuration file handling in all possible state and flag
combinations.
</p>
<table class="data">
<thead>
<tr class="head">
<th colspan="3">Before migration</th>
<th colspan="2">Flags</th>
<th colspan="3">After migration</th>
</tr>
<tr class="subhead">
<th>Guest type</th>
<th>Source config</th>
<th>Dest config</th>
<th>--undefine-source</th>
<th>--persist</th>
<th>Guest type</th>
<th>Source config</th>
<th>Dest config</th>
</tr>
</thead>
<tbody>
<!-- src:N, dst:N -->
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="n">N</td>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="n">N</td>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<!-- src:N, dst:Y -->
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="n">N</td>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="n">N</td>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Transient</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<!-- src:Y dst:N -->
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="n">N</td>
<td>Transient</td>
<td class="y">Y</td>
<td class="n">N</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="n">N</td>
<td>Transient</td>
<td class="n">N</td>
<td class="n">N</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="n">N</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<!-- src:Y dst:Y -->
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="n">N</td>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="n">N</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="n">N</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
</tr>
<tr>
<td>Persistent</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td class="y">Y</td>
<td>Persistent</td>
<td class="n">N</td>
<td class="y">Y</td>
</tr>
</tbody>
</table>
<h2><a id="scenarios">Migration scenarios</a></h2>
<h3><a id="scenarionativedirect">Native migration, client to two libvirtd servers</a></h3>
<p>
At an API level this requires use of virDomainMigrate, without the
VIR_MIGRATE_PEER2PEER flag set. The destination libvirtd server
will automatically determine the native hypervisor URI for migration
based off the primary hostname. To force migration over an alternate
network interface the optional hypervisor specific URI must be provided
</p>
<pre>
syntax: virsh migrate GUESTNAME DEST-LIBVIRT-URI [HV-URI]
eg using default network interface
virsh migrate web1 qemu+ssh://desthost/system
virsh migrate web1 xen+tls://desthost/system
eg using secondary network interface
virsh migrate web1 qemu://desthost/system tcp://10.0.0.1/
virsh migrate web1 xen+tcp://desthost/system xenmigr:10.0.0.1/
</pre>
<p>
Supported by Xen, QEMU, VMWare and VirtualBox drivers
</p>
<h3><a id="scenarionativepeer2peer">Native migration, client to and peer2peer between, two libvirtd servers</a></h3>
<p>
virDomainMigrate, with the VIR_MIGRATE_PEER2PEER flag set,
using the libvirt URI format for the 'uri' parameter. The
destination libvirtd server will automatically determine
the native hypervisor URI for migration, based off the
primary hostname. The optional uri parameter controls how
the source libvirtd connects to the destination libvirtd,
in case it is not accessible using the same address that
the client uses to connect to the destination, or a different
encryption/auth scheme is required. There is no
scope for forcing an alternative network interface for the
native migration data with this method.
</p>
<p>
This mode cannot be invoked from virsh
</p>
<p>
Supported by QEMU driver
</p>
<h3><a id="scenariotunnelpeer2peer1">Tunnelled migration, client and peer2peer between two libvirtd servers</a></h3>
<p>
virDomainMigrate, with the VIR_MIGRATE_PEER2PEER &amp; VIR_MIGRATE_TUNNELLED
flags set, using the libvirt URI format for the 'uri' parameter. The
destination libvirtd server will automatically determine
the native hypervisor URI for migration, based off the
primary hostname. The optional uri parameter controls how
the source libvirtd connects to the destination libvirtd,
in case it is not accessible using the same address that
the client uses to connect to the destination, or a different
encryption/auth scheme is required. The native hypervisor URI
format is not used at all.
</p>
<p>
This mode cannot be invoked from virsh
</p>
<p>
Supported by QEMU driver
</p>
<h3><a id="nativedirectunmanaged">Native migration, client to one libvirtd server</a></h3>
<p>
virDomainMigrateToURI, without the VIR_MIGRATE_PEER2PEER flag set,
using a hypervisor specific URI format for the 'uri' parameter.
There is no use or requirement for a destination libvirtd instance
at all. This is typically used when the hypervisor has its own
native management daemon available to handle incoming migration
attempts on the destination.
</p>
<pre>
syntax: virsh migrate GUESTNAME HV-URI
eg using same libvirt URI for all connections
virsh migrate --direct web1 xenmigr://desthost/
</pre>
<p>
Supported by Xen driver
</p>
<h3><a id="nativepeer2peer">Native migration, peer2peer between two libvirtd servers</a></h3>
<p>
virDomainMigrateToURI, with the VIR_MIGRATE_PEER2PEER flag set,
using the libvirt URI format for the 'uri' parameter. The
destination libvirtd server will automatically determine
the native hypervisor URI for migration, based off the
primary hostname. There is no scope for forcing an alternative
network interface for the native migration data with this method.
</p>
<pre>
syntax: virsh migrate GUESTNAME DEST-LIBVIRT-URI [ALT-DEST-LIBVIRT-URI]
eg using same libvirt URI for all connections
virsh migrate --p2p web1 qemu+ssh://desthost/system
eg using different libvirt URI auth scheme for peer2peer connections
virsh migrate --p2p web1 qemu+ssh://desthost/system qemu+tls:/desthost/system
eg using different libvirt URI hostname for peer2peer connections
virsh migrate --p2p web1 qemu+ssh://desthost/system qemu+ssh://10.0.0.1/system
</pre>
<p>
Supported by the QEMU driver
</p>
<h3><a id="scenariotunnelpeer2peer2">Tunnelled migration, peer2peer between two libvirtd servers</a></h3>
<p>
virDomainMigrateToURI, with the VIR_MIGRATE_PEER2PEER &amp; VIR_MIGRATE_TUNNELLED
flags set, using the libvirt URI format for the 'uri' parameter. The
destination libvirtd server will automatically determine
the native hypervisor URI for migration, based off the
primary hostname. The optional uri parameter controls how
the source libvirtd connects to the destination libvirtd,
in case it is not accessible using the same address that
the client uses to connect to the destination, or a different
encryption/auth scheme is required. The native hypervisor URI
format is not used at all.
</p>
<pre>
syntax: virsh migrate GUESTNAME DEST-LIBVIRT-URI [ALT-DEST-LIBVIRT-URI]
eg using same libvirt URI for all connections
virsh migrate --p2p --tunnelled web1 qemu+ssh://desthost/system
eg using different libvirt URI auth scheme for peer2peer connections
virsh migrate --p2p --tunnelled web1 qemu+ssh://desthost/system qemu+tls:/desthost/system
eg using different libvirt URI hostname for peer2peer connections
virsh migrate --p2p --tunnelled web1 qemu+ssh://desthost/system qemu+ssh://10.0.0.1/system
</pre>
<p>
Supported by QEMU driver
</p>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -20,7 +20,7 @@ lower case, for example the C functions:</p>
</p>
<p>become</p>
<p>
<code>virConnect::numOfDomains(self)</code>
<code>virConn::numOfDomains(self)</code>
</p>
<p>
<code>virDomain::setMaxMemory(self, memory)</code>

View File

@@ -738,7 +738,7 @@ Blank lines and comments beginning with <code>#</code> are ignored.
</tr>
<tr>
<td> mdns_adv <i>[0|1]</i> </td>
<td> 0 (advertise with mDNS) </td>
<td> 1 (advertise with mDNS) </td>
<td>
If set to 1 then the virtualization service will be advertised over
mDNS to hosts on the local LAN segment.

View File

@@ -8,11 +8,6 @@
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='unsignedLong'>
<data type='unsignedLong'>
<param name='pattern'>[0-9]+</param>
</data>
</define>
<define name="positiveInteger">
<data type="positiveInteger">
@@ -55,24 +50,9 @@
</define>
<!-- a 6 byte MAC address in ASCII-hex format, eg "12:34:56:78:9A:BC" -->
<!-- The lowest bit of the 1st byte is the "multicast" bit. a -->
<!-- uniMacAddr requires that bit to be 0, and a multiMacAddr -->
<!-- requires it to be 1. Plain macAddr will accept either. -->
<!-- Currently there is no use of multiMacAddr in libvirt, it -->
<!-- is included here for documentation/comparison purposes. -->
<define name="uniMacAddr">
<data type="string">
<param name="pattern">[a-fA-F0-9][02468aAcCeE](:[a-fA-F0-9]{2}){5}</param>
</data>
</define>
<define name="multiMacAddr">
<data type="string">
<param name="pattern">[a-fA-F0-9][13579bBdDfF](:[a-fA-F0-9]{2}){5}</param>
</data>
</define>
<define name="macAddr">
<data type="string">
<param name="pattern">[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}</param>
<param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
</data>
</define>
@@ -117,12 +97,6 @@
</choice>
</define>
<define name="genericName">
<data type="string">
<param name="pattern">[a-zA-Z0-9_\+\-]+</param>
</data>
</define>
<define name="dnsName">
<data type="string">
<param name="pattern">[a-zA-Z0-9\.\-]+</param>
@@ -143,7 +117,7 @@
<define name="absFilePath">
<data type="string">
<param name="pattern">/[a-zA-Z0-9_\.\+\-\\&amp;&quot;&apos;&lt;&gt;/%,]+</param>
<param name="pattern">/[a-zA-Z0-9_\.\+\-\\&amp;&quot;&apos;&lt;&gt;/%]+</param>
</data>
</define>
@@ -153,18 +127,4 @@
</data>
</define>
<define name='unit'>
<data type='string'>
<param name='pattern'>([bB]([yY][tT][eE][sS]?)?)|([kKmMgGtTpPeE]([iI]?[bB])?)</param>
</data>
</define>
<define name='scaledInteger'>
<optional>
<attribute name='unit'>
<ref name='unit'/>
</attribute>
</optional>
<ref name='unsignedLong'/>
</define>
</grammar>

View File

@@ -1,7 +1,6 @@
<!-- A Relax NG schema for the libvirt capabilities XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<start>
<ref name='capabilities'/>
</start>
@@ -35,9 +34,6 @@
<ref name='cpuspec'/>
</optional>
</element>
<optional>
<ref name='power_management'/>
</optional>
<optional>
<ref name='migration'/>
</optional>
@@ -109,28 +105,6 @@
</zeroOrMore>
</define>
<define name='power_management'>
<element name='power_management'>
<interleave>
<optional>
<element name='suspend_mem'>
<empty/>
</element>
</optional>
<optional>
<element name='suspend_disk'>
<empty/>
</element>
</optional>
<optional>
<element name='suspend_hybrid'>
<empty/>
</element>
</optional>
</interleave>
</element>
</define>
<define name='migration'>
<element name='migration_features'>
<optional>
@@ -158,7 +132,7 @@
<element name='topology'>
<element name='cells'>
<attribute name='num'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</attribute>
<oneOrMore>
<ref name='cell'/>
@@ -170,13 +144,13 @@
<define name='cell'>
<element name='cell'>
<attribute name='id'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</attribute>
<optional>
<element name='cpus'>
<attribute name='num'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</attribute>
<oneOrMore>
<ref name='cpu'/>
@@ -189,7 +163,7 @@
<define name='cpu'>
<element name='cpu'>
<attribute name='id'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</attribute>
</element>
</define>
@@ -239,13 +213,13 @@
<define name='emulator'>
<element name='emulator'>
<ref name='absFilePath'/>
<ref name='path'/>
</element>
</define>
<define name='loader'>
<element name='loader'>
<ref name='absFilePath'/>
<ref name='path'/>
</element>
</define>
@@ -328,11 +302,6 @@
<empty/>
</element>
</optional>
<optional>
<element name='deviceboot'>
<empty/>
</element>
</optional>
</element>
</define>
@@ -368,9 +337,39 @@
</choice>
</define>
<define name='positiveInteger'>
<data type='positiveInteger'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='uint'>
<data type='unsignedInt'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='path'>
<data type='string'>
<param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
</data>
</define>
<define name='featureName'>
<data type='string'>
<param name='pattern'>[a-zA-Z0-9\-_]+</param>
</data>
</define>
<define name="UUID">
<choice>
<data type="string">
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type="string">
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
</grammar>

File diff suppressed because it is too large Load Diff

View File

@@ -183,12 +183,12 @@
<choice>
<element name="miimon">
<!-- miimon frequency in ms -->
<attribute name="freq"><ref name="unsignedInt"/></attribute>
<attribute name="freq"><ref name="uint"/></attribute>
<optional>
<attribute name="downdelay"><ref name="unsignedInt"/></attribute>
<attribute name="downdelay"><ref name="uint"/></attribute>
</optional>
<optional>
<attribute name="updelay"><ref name="unsignedInt"/></attribute>
<attribute name="updelay"><ref name="uint"/></attribute>
</optional>
<optional>
<!-- use_carrier -->
@@ -203,7 +203,7 @@
</optional>
</element>
<element name="arpmon">
<attribute name="interval"><ref name="unsignedInt"/></attribute>
<attribute name="interval"><ref name="uint"/></attribute>
<attribute name="target"><ref name="ipv4Addr"/></attribute>
<optional>
<attribute name="validate">
@@ -252,7 +252,7 @@
<define name="mtu">
<optional>
<element name="mtu">
<attribute name="size"><ref name="unsignedInt"/></attribute>
<attribute name="size"><ref name="uint"/></attribute>
</element>
</optional>
</define>
@@ -407,6 +407,12 @@
<!-- Type library -->
<define name='uint'>
<data type='unsignedInt'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name="timeval">
<data type="double">
<param name="minInclusive">0</param>

View File

@@ -57,7 +57,7 @@
<!-- <mac> element -->
<optional>
<element name="mac">
<attribute name="address"><ref name="uniMacAddr"/></attribute>
<attribute name="address"><ref name="macAddr"/></attribute>
<empty/>
</element>
</optional>
@@ -85,22 +85,13 @@
</choice>
</attribute>
</optional>
<interleave>
<zeroOrMore>
<element name='interface'>
<attribute name='dev'>
<ref name='deviceName'/>
</attribute>
</element>
</zeroOrMore>
<optional>
<element name='pf'>
<attribute name='dev'>
<ref name='deviceName'/>
</attribute>
</element>
</optional>
</interleave>
<zeroOrMore>
<element name='interface'>
<attribute name='dev'>
<ref name='deviceName'/>
</attribute>
</element>
</zeroOrMore>
</element>
</optional>
@@ -146,19 +137,6 @@
<attribute name="value"><text/></attribute>
</element>
</zeroOrMore>
<zeroOrMore>
<element name="srv">
<attribute name="service"><text/></attribute>
<attribute name="protocol"><ref name="protocol"/></attribute>
<optional>
<attribute name="domain"><ref name="dnsName"/></attribute>
<attribute name="target"><text/></attribute>
<attribute name="port"><ref name="unsignedShort"/></attribute>
<attribute name="priority"><ref name="unsignedShort"/></attribute>
<attribute name="weight"><ref name="unsignedShort"/></attribute>
</optional>
</element>
</zeroOrMore>
<zeroOrMore>
<element name="host">
<attribute name="ip"><ref name="ipv4Addr"/></attribute>
@@ -218,7 +196,7 @@
</zeroOrMore>
<zeroOrMore>
<element name="host">
<attribute name="mac"><ref name="uniMacAddr"/></attribute>
<attribute name="mac"><ref name="macAddr"/></attribute>
<attribute name="name"><text/></attribute>
<attribute name="ip"><ref name="ipv4Addr"/></attribute>
</element>
@@ -238,4 +216,11 @@
</interleave>
</element>
</define>
<define name='addr-family'>
<data type='string'>
<param name="pattern">(ipv4)|(ipv6)</param>
</data>
</define>
</grammar>

View File

@@ -95,21 +95,4 @@
<param name="minInclusive">1</param>
</data>
</define>
<define name='unsignedShort'>
<data type='integer'>
<param name="minInclusive">0</param>
<param name="maxInclusive">65535</param>
</data>
</define>
<define name='protocol'>
<data type='string'>
<param name='pattern'>(tcp)|(udp)</param>
</data>
</define>
<define name='addr-family'>
<data type='string'>
<param name="pattern">(ipv4)|(ipv6)</param>
</data>
</define>
</grammar>

View File

@@ -1,7 +1,6 @@
<!-- A Relax NG schema for the libvirt node device XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<start>
<ref name='device'/>
</start>
@@ -57,7 +56,7 @@
</optional>
<element name='uuid'>
<ref name='UUID'/>
<ref name='uuid'/>
</element>
</element>
@@ -81,16 +80,16 @@
</attribute>
<element name='domain'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='bus'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='slot'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='function'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='product'>
@@ -123,10 +122,10 @@
</attribute>
<element name='bus'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='device'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='product'>
@@ -158,16 +157,16 @@
</attribute>
<element name='number'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='class'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='subclass'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='protocol'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<optional>
@@ -217,35 +216,6 @@
</attribute>
</define>
<define name='wwn'>
<data type='string'>
<param name='pattern'>(0-9a-fA-F){16}</param>
</data>
</define>
<define name='capsfchost'>
<attribute name='type'>
<value>fc_host</value>
</attribute>
<element name='wwnn'>
<ref name='wwn'/>
</element>
<element name='wwpn'>
<ref name='wwn'/>
</element>
<element name='fabric_wwn'>
<ref name='wwn'/>
</element>
</define>
<define name='capsvports'>
<attribute name='type'>
<value>vports_ops</value>
</attribute>
</define>
<define name='capscsihost'>
<attribute name='type'>
@@ -253,19 +223,8 @@
</attribute>
<element name='host'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<optional>
<zeroOrMore>
<element name='capability'>
<choice>
<ref name='capsfchost'/>
<ref name='capsvports'/>
</choice>
</element>
</zeroOrMore>
</optional>
</define>
<define name='capscsi'>
@@ -274,16 +233,16 @@
</attribute>
<element name='host'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='bus'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='target'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='lun'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<element name='type'>
@@ -353,7 +312,7 @@
</element>
<element name='media_size'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
<optional>
<element name='media_label'>
@@ -365,10 +324,27 @@
<define name='capstoragefixed'>
<element name='size'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</element>
</define>
<define name='uuid'>
<choice>
<data type='string'>
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type='string'>
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
<define name='uint'>
<data type='string'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='hexuint'>
<data type='string'>
<param name="pattern">(0x)?[0-9a-f]+</param>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<start>
<ref name="filter"/>
</start>
@@ -29,26 +28,6 @@
</element>
</zeroOrMore>
</optional>
<optional>
<zeroOrMore>
<element name="vlan">
<ref name="match-attribute"/>
<ref name="common-l2-attributes"/>
<ref name="vlan-attributes"/>
<ref name="comment-attribute"/>
</element>
</zeroOrMore>
</optional>
<optional>
<zeroOrMore>
<element name="stp">
<ref name="match-attribute"/>
<ref name="srcmacandmask-attributes"/>
<ref name="stp-attributes"/>
<ref name="comment-attribute"/>
</element>
</zeroOrMore>
</optional>
<optional>
<zeroOrMore>
<element name="arp">
@@ -307,42 +286,20 @@
<attribute name="chain">
<choice>
<value>root</value>
<data type="string">
<param name="pattern">mac[a-zA-Z0-9_\.:-]{0,9}</param>
</data>
<data type="string">
<param name="pattern">stp[a-zA-Z0-9_\.:-]{0,9}</param>
</data>
<data type="string">
<param name="pattern">vlan[a-zA-Z0-9_\.:-]{0,8}</param>
</data>
<data type="string">
<param name="pattern">arp[a-zA-Z0-9_\.:-]{0,9}</param>
</data>
<data type="string">
<param name="pattern">rarp[a-zA-Z0-9_\.:-]{0,8}</param>
</data>
<data type="string">
<param name="pattern">ipv4[a-zA-Z0-9_\.:-]{0,8}</param>
</data>
<data type="string">
<param name="pattern">ipv6[a-zA-Z0-9_\.:-]{0,8}</param>
</data>
<value>arp</value>
<value>rarp</value>
<value>ipv4</value>
<value>ipv6</value>
</choice>
</attribute>
</optional>
<optional>
<attribute name="priority">
<ref name='priority-type'/>
</attribute>
</optional>
</define>
<define name="filterref-node-attributes">
<attribute name="filter">
<data type="NCName"/>
</attribute>
<zeroOrMore>
<optional>
<element name="parameter">
<attribute name="name">
<ref name="filter-param-name"/>
@@ -351,7 +308,7 @@
<ref name="filter-param-value"/>
</attribute>
</element>
</zeroOrMore>
</optional>
</define>
<define name="rule-node-attributes">
@@ -396,7 +353,7 @@
</interleave>
</define>
<define name="srcmacandmask-attributes">
<define name="common-l2-attributes">
<interleave>
<ref name="srcmac-attribute"/>
<optional>
@@ -404,12 +361,6 @@
<ref name="addrMAC"/>
</attribute>
</optional>
</interleave>
</define>
<define name="common-l2-attributes">
<interleave>
<ref name="srcmacandmask-attributes"/>
<optional>
<attribute name="dstmacaddr">
<ref name="addrMAC"/>
@@ -593,134 +544,6 @@
</interleave>
</define>
<define name="vlan-attributes">
<interleave>
<optional>
<attribute name="vlanid">
<ref name="vlan-vlanid"/>
</attribute>
</optional>
<optional>
<attribute name="encap-protocol">
<ref name="mac-protocolid"/>
</attribute>
</optional>
</interleave>
</define>
<define name="stp-attributes">
<optional>
<attribute name="type">
<ref name="uint8range"/>
</attribute>
</optional>
<optional>
<attribute name="flags">
<ref name="uint8range"/>
</attribute>
</optional>
<optional>
<attribute name="root-priority">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="root-priority-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="root-address">
<ref name="addrMAC"/>
</attribute>
</optional>
<optional>
<attribute name="root-address-mask">
<ref name="addrMAC"/>
</attribute>
</optional>
<optional>
<attribute name="root-cost">
<ref name="uint32range"/>
</attribute>
</optional>
<optional>
<attribute name="root-cost-hi">
<ref name="uint32range"/>
</attribute>
</optional>
<optional>
<attribute name="sender-priority">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="sender-priority-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="sender-address">
<ref name="addrMAC"/>
</attribute>
</optional>
<optional>
<attribute name="sender-address-mask">
<ref name="addrMAC"/>
</attribute>
</optional>
<optional>
<attribute name="port">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="port-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="age">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="age-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="max-age">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="max-age-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="hello-time">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="hello-time-hi">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="forward-delay">
<ref name="uint16range"/>
</attribute>
</optional>
<optional>
<attribute name="forward-delay-hi">
<ref name="uint16range"/>
</attribute>
</optional>
</define>
<define name="arp-attributes">
<interleave>
<optional>
@@ -800,15 +623,24 @@
<!-- ################ type library ################ -->
<define name="variable-name-type">
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+(\[[ ]*[@]?[0-9]+[ ]*\])?</param>
</data>
<define name="UUID">
<choice>
<data type="string">
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type="string">
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
<define name="addrMAC">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">([a-fA-F0-9]{1,2}:){5}[a-fA-F0-9]{1,2}</param>
@@ -818,7 +650,10 @@
<define name="addrIP">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9]</param>
@@ -828,7 +663,10 @@
<define name="addrIPv6">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">([a-fA-F0-9]{0,4}:){2,7}([a-fA-F0-9]*)(([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9])?</param>
@@ -838,7 +676,10 @@
<define name="addrMask">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
@@ -853,7 +694,10 @@
<define name="addrMaskv6">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
@@ -872,7 +716,10 @@
<param name="pattern">0x([0-3][0-9a-fA-F]|[0-9a-fA-F])</param>
</data>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
@@ -883,7 +730,10 @@
<define name="mac-protocolid">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">0x([6-9a-fA-F][0-9a-fA-F]{2}|[0-9a-fA-F]{4})</param>
@@ -899,29 +749,34 @@
<value>rarp</value>
<value>ipv4</value>
<value>ipv6</value>
<value>vlan</value>
</choice>
</choice>
</define>
<define name="vlan-vlanid">
<define name="uint8range">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">0x([0-9a-fA-F]{1,3})</param>
<param name="pattern">0x[0-9a-fA-F]{1,2}</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
<param name="maxInclusive">4095</param>
<param name="maxInclusive">255</param>
</data>
</choice>
</define>
<define name="uint16range">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">0x[0-9a-fA-F]{1,4}</param>
@@ -934,21 +789,6 @@
</choice>
</define>
<define name="uint32range">
<choice>
<ref name="variable-name-type"/>
<data type="string">
<param name="pattern">0x[0-9a-fA-F]{1,8}</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
<param name="maxInclusive">4294967295</param>
</data>
</choice>
</define>
<define name="boolean">
<choice>
<value>yes</value>
@@ -962,7 +802,10 @@
<define name="arpOpcodeType">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="int">
<param name="minInclusive">0</param>
@@ -978,7 +821,10 @@
<define name="ipProtocolType">
<choice>
<ref name="variable-name-type"/>
<!-- variable -->
<data type="string">
<param name="pattern">$[a-zA-Z0-9_]+</param>
</data>
<data type="string">
<param name="pattern">0x[0-9a-fA-F]{1,2}</param>
@@ -1020,8 +866,6 @@
<value>drop</value>
<value>accept</value>
<value>reject</value>
<value>continue</value>
<value>return</value>
</choice>
</define>
@@ -1035,7 +879,7 @@
<define name='priority-type'>
<data type="int">
<param name="minInclusive">-1000</param>
<param name="minInclusive">0</param>
<param name="maxInclusive">1000</param>
</data>
</define>

View File

@@ -1,12 +1,9 @@
<?xml version="1.0"?>
<!-- A Relax NG schema for the libvirt secret properties XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<ref name='secret'/>
</start>
<include href='basictypes.rng'/>
<define name='secret'>
<element name='secret'>
<optional>
@@ -40,7 +37,6 @@
<element name='usage'>
<choice>
<ref name='usagevolume'/>
<ref name='usageceph'/>
<!-- More choices later -->
</choice>
</element>
@@ -58,13 +54,21 @@
</element>
</define>
<define name='usageceph'>
<attribute name='type'>
<value>ceph</value>
</attribute>
<element name='name'>
<ref name='genericName'/>
</element>
<define name="UUID">
<choice>
<data type="string">
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type="string">
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
<define name="absFilePath">
<data type="string">
<param name="pattern">/[a-zA-Z0-9_\.\+\-&amp;/%]+</param>
</data>
</define>
</grammar>

View File

@@ -2,7 +2,6 @@
<!-- A Relax NG schema for the libvirt storage pool XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<start>
<ref name='pool'/>
</start>
@@ -128,7 +127,7 @@
</element>
<optional>
<element name='uuid'>
<ref name='UUID'/>
<ref name='uuid'/>
</element>
</optional>
</define>
@@ -136,17 +135,17 @@
<define name='sizing'>
<optional>
<element name='capacity'>
<ref name='scaledInteger'/>
<ref name='uint'/>
</element>
</optional>
<optional>
<element name='allocation'>
<ref name='scaledInteger'/>
<ref name='uint'/>
</element>
</optional>
<optional>
<element name='available'>
<ref name='scaledInteger'/>
<ref name='uint'/>
</element>
</optional>
</define>
@@ -155,13 +154,13 @@
<optional>
<element name='permissions'>
<element name='mode'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<element name='owner'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<element name='group'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<optional>
<element name='label'>
@@ -176,7 +175,7 @@
<element name='target'>
<optional>
<element name='path'>
<ref name='absFilePath'/>
<ref name='path'/>
</element>
</optional>
<ref name='permissions'/>
@@ -201,7 +200,7 @@
<element name='device'>
<attribute name='path'>
<choice>
<ref name='absFilePath'/>
<ref name='path'/>
<ref name='name'/>
</choice>
</attribute>
@@ -227,10 +226,10 @@
<oneOrMore>
<element name='freeExtent'>
<attribute name='start'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</attribute>
<attribute name='end'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</attribute>
</element>
</oneOrMore>
@@ -239,7 +238,7 @@
<define name='sourceinfodir'>
<element name='dir'>
<attribute name='path'>
<ref name='absFilePath'/>
<ref name='path'/>
</attribute>
<empty/>
</element>
@@ -455,6 +454,28 @@
<param name="pattern">[a-zA-Z0-9_\+\-]+</param>
</data>
</define>
<define name='uuid'>
<choice>
<data type='string'>
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type='string'>
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
<define name='uint'>
<data type='string'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='path'>
<data type='string'>
<param name="pattern">/[a-zA-Z0-9_\+\-/%]+</param>
</data>
</define>
<define name="PortNumber">
<data type="short">

View File

@@ -1,8 +1,6 @@
<?xml version="1.0"?>
<!-- A Relax NG schema for the libvirt storage volume XML format -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<include href='basictypes.rng'/>
<start>
<ref name='vol'/>
</start>
@@ -32,12 +30,17 @@
<define name='sizing'>
<optional>
<element name='capacity'>
<ref name='scaledInteger'/>
<optional>
<attribute name='unit'>
<ref name='unit'/>
</attribute>
</optional>
<ref name='uint'/>
</element>
</optional>
<optional>
<element name='allocation'>
<ref name='scaledInteger'/>
<ref name='uint'/>
</element>
</optional>
</define>
@@ -46,13 +49,13 @@
<optional>
<element name='permissions'>
<element name='mode'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<element name='owner'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<element name='group'>
<ref name='unsignedInt'/>
<ref name='uint'/>
</element>
<optional>
<element name='label'>
@@ -67,7 +70,7 @@
<element name='target'>
<optional>
<element name='path'>
<ref name='absFilePath'/>
<ref name='path'/>
</element>
</optional>
<ref name='format'/>
@@ -81,7 +84,7 @@
<define name='backingStore'>
<element name='backingStore'>
<element name='path'>
<ref name='absFilePath'/>
<ref name='path'/>
</element>
<ref name='format'/>
<ref name='permissions'/>
@@ -100,7 +103,7 @@
<define name='sourcedev'>
<element name='device'>
<attribute name='path'>
<ref name='absFilePath'/>
<ref name='path'/>
</attribute>
<choice>
<empty/>
@@ -113,10 +116,10 @@
<oneOrMore>
<element name='extent'>
<attribute name='start'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</attribute>
<attribute name='end'>
<ref name='unsignedLong'/>
<ref name='uint'/>
</attribute>
</element>
</oneOrMore>
@@ -177,4 +180,33 @@
</data>
</define>
<define name='uint'>
<data type='string'>
<param name="pattern">[0-9]+</param>
</data>
</define>
<define name='path'>
<data type='string'>
<param name="pattern">/[a-zA-Z0-9_\+\-\./%]+</param>
</data>
</define>
<define name='unit'>
<data type='string'>
<param name="pattern">[kKmMgGtTpPyYzZ]</param>
</data>
</define>
<define name="UUID">
<choice>
<data type="string">
<param name="pattern">[a-fA-F0-9]{32}</param>
</data>
<data type="string">
<param name="pattern">[a-fA-F0-9]{8}\-([a-fA-F0-9]{4}\-){3}[a-fA-F0-9]{12}</param>
</data>
</choice>
</define>
</grammar>

View File

@@ -60,10 +60,6 @@
<a href="auth.html">Authentication</a>
<span>Configure authentication for the libvirt daemon</span>
</li>
<li>
<a href="migration.html">Migration</a>
<span>Migrating guests between machines</span>
</li>
<li>
<a href="windows.html">Windows port</a>
<span>Access the libvirt daemon from a native Windows client</span>

View File

@@ -3,85 +3,9 @@
<body>
<h1 >Storage Management</h1>
<p>
Libvirt provides storage management on the physical host through
storage pools and volumes.
</p>
<p>
A storage pool is a quantity of storage set aside by an
administrator, often a dedicated storage administrator, for use
by virtual machines. Storage pools are divided into storage
volumes either by the storage administrator or the system
administrator, and the volumes are assigned to VMs as block
devices.
</p>
<p>
For example, the storage administrator responsible for an NFS
server creates a share to store virtual machines' data. The
system administrator defines a pool on the virtualization host
with the details of the share
(e.g. nfs.example.com:/path/to/share should be mounted on
/vm_data). When the pool is started, libvirt mounts the share
on the specified directory, just as if the system administrator
logged in and executed 'mount nfs.example.com:/path/to/share
/vmdata'. If the pool is configured to autostart, libvirt
ensures that the NFS share is mounted on the directory specified
when libvirt is started.
</p>
<p>
Once the pool is started, the files in the NFS share are
reported as volumes, and the storage volumes' paths may be
queried using the libvirt APIs. The volumes' paths can then be
copied into the section of a VM's XML definition describing the
source storage for the VM's block devices. In the case of NFS,
an application using the libvirt APIs can create and delete
volumes in the pool (files in the NFS share) up to the limit of
the size of the pool (the storage capacity of the share). Not
all pool types support creating and deleting volumes. Stopping
the pool (somewhat unfortunately referred to by virsh and the
API as "pool-destroy") undoes the start operation, in this case,
unmounting the NFS share. The data on the share is not modified
by the destroy operation, despite the name. See man virsh for
more details.
</p>
<p>
A second example is an iSCSI pool. A storage administrator
provisions an iSCSI target to present a set of LUNs to the host
running the VMs. When libvirt is configured to manage that
iSCSI target as a pool, libvirt will ensure that the host logs
into the iSCSI target and libvirt can then report the available
LUNs as storage volumes. The volumes' paths can be queried and
used in VM's XML definitions as in the NFS example. In this
case, the LUNs are defined on the iSCSI server, and libvirt
cannot create and delete volumes.
</p>
<p>
Storage pools and volumes are not required for the proper
operation of VMs. Pools and volumes provide a way for libvirt
to ensure that a particular piece of storage will be available
for a VM, but some administrators will prefer to manage their
own storage and VMs will operate properly without any pools or
volumes defined. On systems that do not use pools, system
administrators must ensure the availability of the VMs' storage
using whatever tools they prefer, for example, adding the NFS
share to the host's fstab so that the share is mounted at boot
time.
</p>
<p>
If at this point the value of pools and volumes over traditional
system administration tools is unclear, note that one of the
features of libvirt is its remote protocol, so it's possible to
manage all aspects of a virtual machine's lifecycle as well as
the configuration of the resources required by the VM. These
operations can be performed on a remote host entirely within the
libvirt API. In other words, a management application using
libvirt can enable a user to perform all the required tasks for
configuring the host for a VM: allocating resources, running the
VM, shutting it down and deallocating the resources, without
requiring shell access or any other control channel.
</p>
<p>
Libvirt supports the following storage pool types:
</p>
This page describes the backends for the storage management capabilities in
libvirt.
</p>
<ul>
<li>
<a href="#StorageBackendDir">Directory backend</a>

View File

@@ -2,7 +2,7 @@
Landscape
Center
Inches
Letter
Letter
100.00
Single
-2

View File

@@ -2,8 +2,6 @@
<html>
<body>
<h1 >Connection URIs</h1>
<ul id="toc"></ul>
<p>
Since libvirt supports many different kinds of virtualization
(often referred to as "drivers" or "hypervisors"), we need a
@@ -15,59 +13,41 @@ machine over the network.
To this end, libvirt uses URIs as used on the Web and as defined in <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>. This page
documents libvirt URIs.
</p>
<h2><a name="URI_libvirt">Specifying URIs to libvirt</a></h2>
<ul>
<li>
<a href="#URI_libvirt">Specifying URIs to libvirt</a>
</li>
<li>
<a href="#URI_virsh">Specifying URIs to virsh, virt-manager and virt-install</a>
</li>
<li>
<a href="#URI_xen">xen:/// URI</a>
</li>
<li>
<a href="#URI_qemu">qemu:///... QEMU and KVM URIs</a>
</li>
<li>
<a href="#URI_remote">Remote URIs</a>
</li>
<li>
<a href="#URI_test">test:///... Test URIs</a>
</li>
<li>
<a href="#URI_legacy">Other &amp; legacy URI formats</a>
</li>
</ul>
<h3>
<a name="URI_libvirt">Specifying URIs to libvirt</a>
</h3>
<p>
The URI is passed as the <code>name</code> parameter to <a href="html/libvirt-libvirt.html#virConnectOpen"><code>virConnectOpen</code></a> or <a href="html/libvirt-libvirt.html#virConnectOpenReadOnly"><code>virConnectOpenReadOnly</code></a>. For example:
</p>
<pre>
virConnectPtr conn = virConnectOpenReadOnly (<b>"test:///default"</b>);
</pre>
<h2>
<a name="URI_config">Configuring URI aliases</a>
</h2>
<p>
To simplify life for administrators, it is possible to setup URI aliases in a
libvirt client configuration file. The configuration file is <code>/etc/libvirt/libvirt.conf</code>
for the root user, or <code>$HOME/.libvirt/libvirt.conf</code> for any unprivileged user.
In this file, the following syntax can be used to setup aliases
</p>
<pre>
uri_aliases = [
"hail=qemu+ssh://root@hail.cloud.example.com/system",
"sleet=qemu+ssh://root@sleet.cloud.example.com/system",
]
</pre>
<p>
A URI alias should be a string made up from the characters
<code>a-Z, 0-9, _, -</code>. Following the <code>=</code>
can be any libvirt URI string, including arbitrary URI parameters.
URI aliases will apply to any application opening a libvirt
connection, unless it has explicitly passed the <code>VIR_CONNECT_NO_ALIASES</code>
parameter to <code>virConnectOpenAuth</code>. If the passed in
URI contains characters outside the allowed alias character
set, no alias lookup will be attempted.
</p>
<h2><a name="URI_default">Default URI choice</a></h2>
<p>
If the URI passed to <code>virConnectOpen*</code> is NULL, then libvirt will use the following
logic to determine what URI to use.
</p>
<ol>
<li>The environment variable <code>LIBVIRT_DEFAULT_URI</code></li>
<li>The client configuration file <code>uri_default</code> parameter</li>
<li>Probe each hypervisor in turn until one that works is found</li>
</ol>
<h2>
<h3>
<a name="URI_virsh">Specifying URIs to virsh, virt-manager and virt-install</a>
</h2>
</h3>
<p>
In virsh use the <code>-c</code> or <code>--connect</code> option:
</p>
@@ -77,8 +57,7 @@ virsh <b>-c test:///default</b> list
<p>
If virsh finds the environment variable
<code>VIRSH_DEFAULT_CONNECT_URI</code> set, it will try this URI by
default. Use of this environment variable is, however, deprecated
now that libvirt supports <code>LIBVIRT_DEFAULT_URI</code> itself.
default.
</p>
<p>
When using the interactive virsh shell, you can also use the
@@ -97,9 +76,9 @@ In virt-install use the <code>--connect=</code><i>URI</i> option:
<pre>
virt-install <b>--connect=test:///default</b> <i>[other options]</i>
</pre>
<h2>
<h3>
<a name="URI_xen">xen:/// URI</a>
</h2>
</h3>
<p>
<i>This section describes a feature which is new in libvirt &gt;
0.2.3. For libvirt &#x2264; 0.2.3 use <a href="#URI_legacy_xen"><code>"xen"</code></a>.</i>
@@ -108,9 +87,9 @@ virt-install <b>--connect=test:///default</b> <i>[other options]</i>
To access a Xen hypervisor running on the local machine
use the URI <code>xen:///</code>.
</p>
<h2>
<h3>
<a name="URI_qemu">qemu:///... QEMU and KVM URIs</a>
</h2>
</h3>
<p>
To use QEMU support in libvirt you must be running the
<code>libvirtd</code> daemon (named <code>libvirt_qemud</code>
@@ -140,9 +119,9 @@ KVM URIs are identical. You select between qemu, qemu accelerated and
KVM guests in the <a href="format.html#KVM1">guest XML as described
here</a>.
</p>
<h2>
<h3>
<a name="URI_remote">Remote URIs</a>
</h2>
</h3>
<p>
Remote URIs are formed by taking ordinary local URIs and adding a
hostname and/or transport name. As a special case, using a URI
@@ -203,9 +182,9 @@ We refer you to <a href="remote.html#Remote_URI_reference">the libvirt
remote URI reference</a> and <a href="remote.html">full documentation
for libvirt remote support</a>.
</p>
<h2>
<h3>
<a name="URI_test">test:///... Test URIs</a>
</h2>
</h3>
<p>
The test driver is a dummy hypervisor for test purposes.
The URIs supported are:
@@ -217,12 +196,12 @@ host definitions built into the driver. </li>
a set of host definitions held in the named file.
</li>
</ul>
<h2>
<a name="URI_legacy">Other &amp; legacy URI formats</a>
</h2>
<h3>
<a name="URI_NULL">NULL and empty string URIs</a>
<a name="URI_legacy">Other &amp; legacy URI formats</a>
</h3>
<h4>
<a name="URI_NULL">NULL and empty string URIs</a>
</h4>
<p>
Libvirt allows you to pass a <code>NULL</code> pointer to
<code>virConnectOpen*</code>. Empty string (<code>""</code>) acts in
@@ -244,9 +223,9 @@ the user to type a URI in directly (if that is appropriate). If your
application wishes to connect specifically to a Xen hypervisor, then
for future proofing it should choose a full <a href="#URI_xen"><code>xen:///</code> URI</a>.
</p>
<h3>
<h4>
<a name="URI_file">File paths (xend-unix-server)</a>
</h3>
</h4>
<p>
If XenD is running and configured in <code>/etc/xen/xend-config.sxp</code>:
</p>
@@ -261,9 +240,9 @@ using a file URI such as:
<pre>
virsh -c ///var/run/xend/xend-socket
</pre>
<h3>
<h4>
<a name="URI_http">Legacy: <code>http://...</code> (xend-http-server)</a>
</h3>
</h4>
<p>
If XenD is running and configured in <code>/etc/xen/xend-config.sxp</code>:
@@ -297,17 +276,17 @@ Notes:
libvirt, only the old-style sexpr interface known in the Xen
documentation as "unix server" or "http server".</li>
</ol>
<h3>
<h4>
<a name="URI_legacy_xen">Legacy: <code>"xen"</code></a>
</h3>
</h4>
<p>
Another legacy URI is to specify name as the string
<code>"xen"</code>. This will continue to refer to the Xen
hypervisor. However you should prefer a full <a href="#URI_xen"><code>xen:///</code> URI</a> in all future code.
</p>
<h3>
<h4>
<a name="URI_legacy_proxy">Legacy: Xen proxy</a>
</h3>
</h4>
<p>
Libvirt continues to support connections to a separately running Xen
proxy daemon. This provides a way to allow non-root users to make a

View File

@@ -0,0 +1,6 @@
Makefile
Makefile.in
*.exe
.deps
.libs
event-test

View File

@@ -40,7 +40,7 @@ void usage(const char *pname);
const char *eventToString(int event) {
const char *ret = "";
switch ((virDomainEventType) event) {
switch(event) {
case VIR_DOMAIN_EVENT_DEFINED:
ret ="Defined";
break;
@@ -59,16 +59,13 @@ const char *eventToString(int event) {
case VIR_DOMAIN_EVENT_STOPPED:
ret ="Stopped";
break;
case VIR_DOMAIN_EVENT_SHUTDOWN:
ret = "Shutdown";
break;
}
return ret;
}
static const char *eventDetailToString(int event, int detail) {
const char *ret = "";
switch ((virDomainEventType) event) {
switch(event) {
case VIR_DOMAIN_EVENT_DEFINED:
if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED)
ret = "Added";
@@ -80,7 +77,7 @@ static const char *eventDetailToString(int event, int detail) {
ret = "Removed";
break;
case VIR_DOMAIN_EVENT_STARTED:
switch ((virDomainEventStartedDetailType) detail) {
switch (detail) {
case VIR_DOMAIN_EVENT_STARTED_BOOTED:
ret = "Booted";
break;
@@ -93,13 +90,10 @@ static const char *eventDetailToString(int event, int detail) {
case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT:
ret = "Snapshot";
break;
case VIR_DOMAIN_EVENT_STARTED_WAKEUP:
ret = "Event wakeup";
break;
}
break;
case VIR_DOMAIN_EVENT_SUSPENDED:
switch ((virDomainEventSuspendedDetailType) detail) {
switch (detail) {
case VIR_DOMAIN_EVENT_SUSPENDED_PAUSED:
ret = "Paused";
break;
@@ -121,7 +115,7 @@ static const char *eventDetailToString(int event, int detail) {
}
break;
case VIR_DOMAIN_EVENT_RESUMED:
switch ((virDomainEventResumedDetailType) detail) {
switch (detail) {
case VIR_DOMAIN_EVENT_RESUMED_UNPAUSED:
ret = "Unpaused";
break;
@@ -134,7 +128,7 @@ static const char *eventDetailToString(int event, int detail) {
}
break;
case VIR_DOMAIN_EVENT_STOPPED:
switch ((virDomainEventStoppedDetailType) detail) {
switch (detail) {
case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
ret = "Shutdown";
break;
@@ -158,13 +152,6 @@ static const char *eventDetailToString(int event, int detail) {
break;
}
break;
case VIR_DOMAIN_EVENT_SHUTDOWN:
switch ((virDomainEventShutdownDetailType) detail) {
case VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED:
ret = "Finished";
break;
}
break;
}
return ret;
}
@@ -298,61 +285,6 @@ static int myDomainEventControlErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED
}
const char *diskChangeReasonStrings[] = {
"startupPolicy", /* 0 */
/* add new reason here */
};
static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
virDomainPtr dom,
const char *oldSrcPath,
const char *newSrcPath,
const char *devAlias,
int reason,
void *opaque ATTRIBUTE_UNUSED)
{
printf("%s EVENT: Domain %s(%d) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s\n",
__func__, virDomainGetName(dom), virDomainGetID(dom),
oldSrcPath, newSrcPath, devAlias, diskChangeReasonStrings[reason]);
return 0;
}
const char *trayChangeReasonStrings[] = {
"open",
"close",
};
static int myDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
virDomainPtr dom,
const char *devAlias,
int reason,
void *opaque ATTRIBUTE_UNUSED)
{
printf("%s EVENT: Domain %s(%d) removable disk's tray change devAlias: %s reason: %s\n",
__func__, virDomainGetName(dom), virDomainGetID(dom),
devAlias, trayChangeReasonStrings[reason]);
return 0;
}
static int myDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
virDomainPtr dom,
int reason ATTRIBUTE_UNUSED,
void *opaque ATTRIBUTE_UNUSED)
{
printf("%s EVENT: Domain %s(%d) system pmwakeup",
__func__, virDomainGetName(dom), virDomainGetID(dom));
return 0;
}
static int myDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
virDomainPtr dom,
int reason ATTRIBUTE_UNUSED,
void *opaque ATTRIBUTE_UNUSED)
{
printf("%s EVENT: Domain %s(%d) system pmsuspend",
__func__, virDomainGetName(dom), virDomainGetID(dom));
return 0;
}
static void myFreeFunc(void *opaque)
{
char *str = opaque;
@@ -387,13 +319,9 @@ int main(int argc, char **argv)
int callback6ret = -1;
int callback7ret = -1;
int callback8ret = -1;
int callback9ret = -1;
int callback10ret = -1;
int callback11ret = -1;
int callback12ret = -1;
struct sigaction action_stop;
memset(&action_stop, 0, sizeof(action_stop));
memset(&action_stop, 0, sizeof action_stop);
action_stop.sa_handler = stop;
@@ -405,9 +333,7 @@ int main(int argc, char **argv)
virEventRegisterDefaultImpl();
virConnectPtr dconn = NULL;
dconn = virConnectOpenAuth(argc > 1 ? argv[1] : NULL,
virConnectAuthPtrDefault,
VIR_CONNECT_RO);
dconn = virConnectOpenReadOnly (argv[1] ? argv[1] : NULL);
if (!dconn) {
printf("error opening\n");
return -1;
@@ -456,45 +382,15 @@ int main(int argc, char **argv)
VIR_DOMAIN_EVENT_ID_CONTROL_ERROR,
VIR_DOMAIN_EVENT_CALLBACK(myDomainEventControlErrorCallback),
strdup("callback control error"), myFreeFunc);
callback9ret = virConnectDomainEventRegisterAny(dconn,
NULL,
VIR_DOMAIN_EVENT_ID_DISK_CHANGE,
VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDiskChangeCallback),
strdup("disk change"), myFreeFunc);
callback10ret = virConnectDomainEventRegisterAny(dconn,
NULL,
VIR_DOMAIN_EVENT_ID_TRAY_CHANGE,
VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayChangeCallback),
strdup("tray change"), myFreeFunc);
callback11ret = virConnectDomainEventRegisterAny(dconn,
NULL,
VIR_DOMAIN_EVENT_ID_PMWAKEUP,
VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMWakeupCallback),
strdup("pmwakeup"), myFreeFunc);
callback12ret = virConnectDomainEventRegisterAny(dconn,
NULL,
VIR_DOMAIN_EVENT_ID_PMSUSPEND,
VIR_DOMAIN_EVENT_CALLBACK(myDomainEventPMSuspendCallback),
strdup("pmsuspend"), myFreeFunc);
if ((callback1ret != -1) &&
(callback2ret != -1) &&
(callback3ret != -1) &&
(callback4ret != -1) &&
(callback5ret != -1) &&
(callback6ret != -1) &&
(callback7ret != -1) &&
(callback9ret != -1) &&
(callback10ret != -1) &&
(callback11ret != -1) &&
(callback12ret != -1)) {
if (virConnectSetKeepAlive(dconn, 5, 3) < 0) {
virErrorPtr err = virGetLastError();
fprintf(stderr, "Failed to start keepalive protocol: %s\n",
err && err->message ? err->message : "Unknown error");
run = 0;
}
while (run && virConnectIsAlive(dconn) == 1) {
(callback7ret != -1)) {
while (run) {
if (virEventRunDefaultImpl() < 0) {
virErrorPtr err = virGetLastError();
fprintf(stderr, "Failed to run event loop: %s\n",
@@ -510,10 +406,6 @@ int main(int argc, char **argv)
virConnectDomainEventDeregisterAny(dconn, callback5ret);
virConnectDomainEventDeregisterAny(dconn, callback6ret);
virConnectDomainEventDeregisterAny(dconn, callback7ret);
virConnectDomainEventDeregisterAny(dconn, callback9ret);
virConnectDomainEventDeregisterAny(dconn, callback10ret);
virConnectDomainEventDeregisterAny(dconn, callback11ret);
virConnectDomainEventDeregisterAny(dconn, callback12ret);
if (callback8ret != -1)
virConnectDomainEventDeregisterAny(dconn, callback8ret);
}

View File

@@ -430,8 +430,7 @@ def eventToString(event):
"Started",
"Suspended",
"Resumed",
"Stopped",
"Shutdown" );
"Stopped" );
return eventStrings[event];
def detailToString(event, detail):
@@ -441,8 +440,7 @@ def detailToString(event, detail):
( "Booted", "Migrated", "Restored", "Snapshot" ),
( "Paused", "Migrated", "IOError", "Watchdog" ),
( "Unpaused", "Migrated"),
( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot"),
( "Finished" )
( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot")
)
return eventStrings[event][detail]
@@ -471,28 +469,13 @@ def myDomainEventIOErrorCallback(conn, dom, srcpath, devalias, action, opaque):
def myDomainEventGraphicsCallback(conn, dom, phase, localAddr, remoteAddr, authScheme, subject, opaque):
print "myDomainEventGraphicsCallback: Domain %s(%s) %d %s" % (dom.name(), dom.ID(), phase, authScheme)
def myDomainEventDiskChangeCallback(conn, dom, oldSrcPath, newSrcPath, devAlias, reason, opaque):
print "myDomainEventDiskChangeCallback: Domain %s(%s) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s" % (
dom.name(), dom.ID(), oldSrcPath, newSrcPath, devAlias, reason)
def myDomainEventTrayChangeCallback(conn, dom, devAlias, reason, opaque):
print "myDomainEventTrayChangeCallback: Domain %s(%s) tray change devAlias: %s reason: %s" % (
dom.name(), dom.ID(), devAlias, reason)
def myDomainEventPMWakeupCallback(conn, dom, reason, opaque):
print "myDomainEventPMWakeupCallback: Domain %s(%s) system pmwakeup" % (
dom.name(), dom.ID())
def myDomainEventPMSuspendCallback(conn, dom, reason, opaque):
print "myDomainEventPMSuspendCallback: Domain %s(%s) system pmsuspend" % (
dom.name(), dom.ID())
def usage(out=sys.stderr):
print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]"
print >>out, " uri will default to qemu:///system"
print >>out, " --help, -h Print this help message"
print >>out, " --debug, -d Print debug output"
print >>out, " --loop, -l Toggle event-loop-implementation"
def usage():
print "usage: "+os.path.basename(sys.argv[0])+" [uri]"
print " uri will default to qemu:///system"
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "hdl", ["help", "debug", "loop"])
opts, args = getopt.getopt(sys.argv[1:], "h", ["help"] )
except getopt.GetoptError, err:
# print help information and exit:
print str(err) # will print something like "option -a not recognized"
@@ -500,17 +483,11 @@ def main():
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage(sys.stdout)
usage()
sys.exit()
if o in ("-d", "--debug"):
global do_debug
do_debug = True
if o in ("-l", "--loop"):
global use_pure_python_event_loop
use_pure_python_event_loop ^= True
if len(args) >= 1:
uri = args[0]
if len(sys.argv) > 1:
uri = sys.argv[1]
else:
uri = "qemu:///system"
@@ -540,18 +517,12 @@ def main():
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_IO_ERROR, myDomainEventIOErrorCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_CHANGE, myDomainEventTrayChangeCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMWAKEUP, myDomainEventPMWakeupCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMSUSPEND, myDomainEventPMSuspendCallback, None)
vc.setKeepAlive(5, 3)
# The rest of your app would go here normally, but for sake
# of demo we'll just go to sleep. The other option is to
# run the event loop in your main thread if your app is
# totally event based.
while vc.isAlive() == 1:
while 1:
time.sleep(1)

5
examples/dominfo/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
Makefile.in
Makefile
.deps
.libs
info1

View File

@@ -1,7 +1,7 @@
## Copyright (C) 2005-2012 Red Hat, Inc.
## Copyright (C) 2005-2011 Red Hat, Inc.
## See COPYING.LIB for the License of this software
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)/include
LDADDS = $(STATIC_BINARIES) $(WARN_CFLAGS) $(top_builddir)/src/libvirt.la \
$(COVERAGE_LDFLAGS)

Some files were not shown because too many files have changed in this diff Show More