mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-10-26 07:34:04 +03:00
Compare commits
45 Commits
v1.2.14-rc
...
v1.2.1-mai
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4ecee35ae | ||
|
|
02d365dae5 | ||
|
|
614c8d4c6b | ||
|
|
73174ca1c6 | ||
|
|
871da17484 | ||
|
|
bc52fd9d0e | ||
|
|
7f6b096085 | ||
|
|
c735ddf560 | ||
|
|
1f348188e0 | ||
|
|
f7c70c2053 | ||
|
|
75dfd58284 | ||
|
|
e902cd4773 | ||
|
|
6d7ce691b3 | ||
|
|
44ee474abc | ||
|
|
fe4fc3fd03 | ||
|
|
3adae530f5 | ||
|
|
c639118634 | ||
|
|
fdde9d6a1b | ||
|
|
a73122a4ab | ||
|
|
b814222d5b | ||
|
|
60e54a5021 | ||
|
|
877388678a | ||
|
|
ce8262ff65 | ||
|
|
7adf48077f | ||
|
|
6a5de7d7a4 | ||
|
|
0a7cc10671 | ||
|
|
93394f56c4 | ||
|
|
d5a14a1a68 | ||
|
|
8b546028f9 | ||
|
|
b0ed2d94ac | ||
|
|
ee1269eecd | ||
|
|
b999782823 | ||
|
|
51a897a22e | ||
|
|
ad52184399 | ||
|
|
158b5373be | ||
|
|
7289743c01 | ||
|
|
d8074fbf29 | ||
|
|
ea16d496ac | ||
|
|
d613d44ff0 | ||
|
|
b1db6c7fe4 | ||
|
|
dac036ac95 | ||
|
|
2d92daa94d | ||
|
|
e48e414e43 | ||
|
|
c5d10b7a3d | ||
|
|
822d25b262 |
86
.gitignore
vendored
86
.gitignore
vendored
@@ -3,7 +3,6 @@
|
||||
*.a
|
||||
*.cov
|
||||
*.exe
|
||||
*.exe.manifest
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.gcov
|
||||
@@ -40,7 +39,6 @@
|
||||
/build-aux
|
||||
/build-aux/
|
||||
/build/
|
||||
/confdefs.h
|
||||
/config.cache
|
||||
/config.guess
|
||||
/config.h
|
||||
@@ -51,7 +49,6 @@
|
||||
/config.sub
|
||||
/configure
|
||||
/configure.lineno
|
||||
/conftest.*
|
||||
/daemon/*_dispatch.h
|
||||
/daemon/libvirt_qemud
|
||||
/daemon/libvirtd
|
||||
@@ -62,7 +59,6 @@
|
||||
/daemon/libvirtd.pod
|
||||
/daemon/libvirtd.policy
|
||||
/daemon/libvirtd.service
|
||||
/daemon/libvirtd.socket
|
||||
/daemon/test_libvirtd.aug
|
||||
/docs/aclperms.htmlinc
|
||||
/docs/apibuild.py.stamp
|
||||
@@ -77,8 +73,6 @@
|
||||
/examples/object-events/event-test
|
||||
/examples/dominfo/info1
|
||||
/examples/domsuspend/suspend
|
||||
/examples/dommigrate/dommigrate
|
||||
/examples/domtop/domtop
|
||||
/examples/hellolibvirt/hellolibvirt
|
||||
/examples/openauth/openauth
|
||||
/gnulib/lib/*
|
||||
@@ -88,7 +82,7 @@
|
||||
/libtool
|
||||
/libvirt-*.tar.gz
|
||||
/libvirt-[0-9]*
|
||||
/libvirt*.pc
|
||||
/libvirt.pc
|
||||
/libvirt.spec
|
||||
/ltconfig
|
||||
/ltmain.sh
|
||||
@@ -102,7 +96,6 @@
|
||||
/run
|
||||
/sc_*
|
||||
/src/.*.stamp
|
||||
/src/*.pc
|
||||
/src/access/org.libvirt.api.policy
|
||||
/src/access/viraccessapicheck.c
|
||||
/src/access/viraccessapicheck.h
|
||||
@@ -151,16 +144,79 @@
|
||||
/tests/*.log
|
||||
/tests/*.pid
|
||||
/tests/*.trs
|
||||
/tests/*xml2*test
|
||||
/tests/commandhelper
|
||||
/tests/*test
|
||||
!/tests/*schematest
|
||||
!/tests/virt-aa-helper-test
|
||||
/tests/objectlocking
|
||||
/tests/objectlocking-files.txt
|
||||
/tests/objectlocking.cm[ix]
|
||||
/tests/commandtest
|
||||
/tests/conftest
|
||||
/tests/cputest
|
||||
/tests/domainsnapshotxml2xmltest
|
||||
/tests/esxutilstest
|
||||
/tests/eventtest
|
||||
/tests/fchosttest
|
||||
/tests/fdstreamtest
|
||||
/tests/hashtest
|
||||
/tests/jsontest
|
||||
/tests/libvirtdconftest
|
||||
/tests/metadatatest
|
||||
/tests/networkxml2argvtest
|
||||
/tests/nodeinfotest
|
||||
/tests/nwfilterxml2xmltest
|
||||
/tests/objecteventtest
|
||||
/tests/object-locking
|
||||
/tests/object-locking-files.txt
|
||||
/tests/object-locking.cm[ix]
|
||||
/tests/openvzutilstest
|
||||
/tests/qemuagenttest
|
||||
/tests/qemuargv2xmltest
|
||||
/tests/qemucapabilitiestest
|
||||
/tests/qemuhelptest
|
||||
/tests/qemuhotplugtest
|
||||
/tests/qemumonitorjsontest
|
||||
/tests/qemumonitortest
|
||||
/tests/qemuxmlnstest
|
||||
/tests/qparamtest
|
||||
/tests/reconnect
|
||||
/tests/secaatest
|
||||
/tests/seclabeltest
|
||||
/tests/securityselinuxlabeltest
|
||||
/tests/securityselinuxtest
|
||||
/tests/sexpr2xmltest
|
||||
/tests/shunloadtest
|
||||
/tests/sockettest
|
||||
/tests/ssh
|
||||
/tests/statstest
|
||||
/tests/storagebackendsheepdogtest
|
||||
/tests/sysinfotest
|
||||
/tests/test_conf
|
||||
/tests/utiltest
|
||||
/tests/viratomictest
|
||||
/tests/virauthconfigtest
|
||||
/tests/virbitmaptest
|
||||
/tests/virbuftest
|
||||
/tests/vircgrouptest
|
||||
/tests/virdbustest
|
||||
/tests/virdrivermoduletest
|
||||
/tests/virendiantest
|
||||
/tests/virfiletest
|
||||
/tests/virhashtest
|
||||
/tests/viridentitytest
|
||||
/tests/virkeycodetest
|
||||
/tests/virkeyfiletest
|
||||
/tests/virlockspacetest
|
||||
/tests/virlogtest
|
||||
/tests/virnet*test
|
||||
/tests/virpcitest
|
||||
/tests/virportallocatortest
|
||||
/tests/virshtest
|
||||
/tests/virstoragetest
|
||||
/tests/virstringtest
|
||||
/tests/virsystemdtest
|
||||
/tests/virtimetest
|
||||
/tests/viruritest
|
||||
/tests/vmwarevertest
|
||||
/tests/vmx2xmltest
|
||||
/tests/xencapstest
|
||||
/tests/xmconfigtest
|
||||
/tools/*.[18]
|
||||
/tools/libvirt-guests.init
|
||||
/tools/libvirt-guests.service
|
||||
@@ -170,8 +226,6 @@
|
||||
/tools/virsh-*-edit.c
|
||||
/tools/virt-*-validate
|
||||
/tools/virt-sanlock-cleanup
|
||||
/tools/wireshark/src/plugin.c
|
||||
/tools/wireshark/src/libvirt
|
||||
/update.log
|
||||
GPATH
|
||||
GRTAGS
|
||||
|
||||
2
.gnulib
2
.gnulib
Submodule .gnulib updated: 106a3866d0...d18d1b8023
5
.mailmap
5
.mailmap
@@ -5,10 +5,7 @@
|
||||
|
||||
<bozzolan@gmail.com> <redshift@gmx.com>
|
||||
<charles_duffy@messageone.com> <charles@dyfis.net>
|
||||
<claudio.bley@gmail.com> <cbley@av-test.de>
|
||||
<dfj@redhat.com> <dfj@dfj.bne.redhat.com>
|
||||
<dpkshetty@gmail.com> <deepakcs@linux.vnet.ibm.com>
|
||||
<dpkshetty@gmail.com> <deepakcs@redhat.com>
|
||||
<eblake@redhat.com> <ebb9@byu.net>
|
||||
<gdolley@arpnetworks.com> <gdolley@ucla.edu>
|
||||
<gerhard.stenzel@de.ibm.com> <gstenzel@linux.vnet.ibm.com>
|
||||
@@ -59,5 +56,3 @@ Philipp Hahn <hahn@univention.de>
|
||||
Marco Bozzolan <bozzolan@gmail.com>
|
||||
Marco Bozzolan <redshift@gmx.com>
|
||||
Pritesh Kothari <pritesh.kothari@sun.com>
|
||||
Wang Yufei (James) <james.wangyufei@huawei.com>
|
||||
Deepak C Shetty <dpkshetty@gmail.com>
|
||||
|
||||
22
AUTHORS.in
22
AUTHORS.in
@@ -8,47 +8,43 @@ Daniel Veillard <veillard@redhat.com> or <daniel@veillard.com>
|
||||
The primary maintainers and people with commit access rights:
|
||||
|
||||
Alex Jia <ajia@redhat.com>
|
||||
Cédric Bosdonnat <cbosdonnat@suse.com>
|
||||
Anthony Liguori <aliguori@us.ibm.com>
|
||||
Chris Lalancette <clalance@redhat.com>
|
||||
Christophe Fergeau <cfergeau@redhat.com>
|
||||
Claudio Bley <claudio.bley@gmail.com>
|
||||
Claudio Bley <cbley@av-test.de>
|
||||
Cole Robinson <crobinso@redhat.com>
|
||||
Daniel Berrange <berrange@redhat.com>
|
||||
Daniel Veillard <veillard@redhat.com>
|
||||
Dave Allan <dallan@redhat.com>
|
||||
Doug Goldstein <cardoe@gentoo.org>
|
||||
Eric Blake <eblake@redhat.com>
|
||||
Erik Skultety <eskultet@redhat.com>
|
||||
Gao Feng <gaofeng@cn.fujitsu.com>
|
||||
Guannan Ren <gren@redhat.com>
|
||||
Guido Günther <agx@sigxcpu.org>
|
||||
Ján Tomko <jtomko@redhat.com>
|
||||
Jim Fehlig <jfehlig@suse.com>
|
||||
Jim Meyering <meyering@redhat.com>
|
||||
Jiří Denemark <jdenemar@redhat.com>
|
||||
John Ferlan <jferlan@redhat.com>
|
||||
John Levon <john.levon@sun.com>
|
||||
Justin Clift <jclift@redhat.com>
|
||||
Laine Stump <laine@redhat.com>
|
||||
Mark McLoughlin <markmc@redhat.com>
|
||||
Martin Kletzander <mkletzan@redhat.com>
|
||||
Matthias Bolte <matthias.bolte@googlemail.com>
|
||||
Michal Prívozník <mprivozn@redhat.com>
|
||||
Pavel Hrdina <phrdina@redhat.com>
|
||||
Osier Yang <jyang@redhat.com>
|
||||
Peter Krempa <pkrempa@redhat.com>
|
||||
Richard W.M. Jones <rjones@redhat.com>
|
||||
Roman Bogorodskiy <bogorodskiy@gmail.com>
|
||||
Stefan Berger <stefanb@us.ibm.com>
|
||||
Wen Congyang <wency@cn.fujitsu.com>
|
||||
|
||||
Previous maintainers:
|
||||
|
||||
Anthony Liguori <aliguori@us.ibm.com>
|
||||
Atsushi SAKAI <sakaia@jp.fujitsu.com>
|
||||
Chris Lalancette <clalance@redhat.com>
|
||||
Dan Smith <danms@us.ibm.com>
|
||||
Dave Allan <dallan@redhat.com>
|
||||
Dave Leskovec <dlesko@linux.vnet.ibm.com>
|
||||
Guannan Ren <gren@redhat.com>
|
||||
Jim Meyering <meyering@redhat.com>
|
||||
John Levon <john.levon@sun.com>
|
||||
Justin Clift <jclift@redhat.com>
|
||||
Karel Zak <kzak@redhat.com>
|
||||
Osier Yang <jyang@redhat.com>
|
||||
|
||||
Patches have also been contributed by:
|
||||
|
||||
|
||||
@@ -4286,7 +4286,7 @@ Wed Dec 17 21:45:39 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
Wed Dec 17 21:41:39 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* src/libvirt_sym.version.in: Remove non-existent symbols
|
||||
* src/libvirt_sym.version.in: Remove non-existant symbols
|
||||
(John Levon)
|
||||
|
||||
Wed Dec 17 21:35:39 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
|
||||
@@ -12415,7 +12415,7 @@ Thu Jul 12 11:02:17 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
Thu Jul 12 11:00:17 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* qemud/qemud.c: Add explicit checks for existence of x509
|
||||
* qemud/qemud.c: Add explicit checks for existance of x509
|
||||
certificate & key files to get better error reporting than
|
||||
GNU TLS offers when it can't load a file
|
||||
|
||||
@@ -13276,7 +13276,7 @@ Tue Apr 17 11:30:46 CEST 2007 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
Mon Apr 16 09:11:04 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* qemud/conf.c: Check for existence of QEMU binary path. Fix check
|
||||
* qemud/conf.c: Check for existance of QEMU binary path. Fix check
|
||||
for -no-kqemu flag to work with x86_64 on i386
|
||||
|
||||
Mon Apr 16 09:09:04 EST 2007 Daniel P. Berrange <berrange@redhat.com>
|
||||
@@ -15020,7 +15020,7 @@ Tue Nov 7 16:33:43 CET 2006 Daniel Veillard <veillard@redhat.com>
|
||||
Tue Oct 31 10:31:34 CET 2006 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
* src/xend_internal.c: when getting informations about a non
|
||||
existent domain, it is not a good idea to raise the HTTP
|
||||
existant domain, it is not a good idea to raise the HTTP
|
||||
404 GET error, the handling is better done somewhere up in
|
||||
the stack.
|
||||
|
||||
|
||||
122
HACKING
122
HACKING
@@ -14,11 +14,7 @@ General tips for contributing patches
|
||||
(1) Discuss any large changes on the mailing list first. Post patches early and
|
||||
listen to feedback.
|
||||
|
||||
(2) Official upstream repository is kept in git ("git://libvirt.org/libvirt.git")
|
||||
and is browsable along with other libvirt-related repositories (e.g.
|
||||
libvirt-python) online <http://libvirt.org/git/>.
|
||||
|
||||
(3) Post patches in unified diff format, with git rename detection enabled. You
|
||||
(2) Post patches in unified diff format, with git rename detection enabled. You
|
||||
need a one-time setup of:
|
||||
|
||||
git config diff.renames true
|
||||
@@ -61,16 +57,16 @@ Please follow this as close as you can, especially the rebase and git
|
||||
send-email part, as it makes life easier for other developers to review your
|
||||
patch set. One should avoid sending patches as attachments, but rather send
|
||||
them in email body along with commit message. If a developer is sending
|
||||
another version of the patch (e.g. to address review comments), they are
|
||||
advised to note differences to previous versions after the "---" line in the
|
||||
patch so that it helps reviewers but doesn't become part of git history.
|
||||
Moreover, such patch needs to be prefixed correctly with
|
||||
"--subject-prefix=PATCHv2" appended to "git send-email" (substitute "v2" with
|
||||
the correct version if needed though).
|
||||
another version of the patch (e.g. to address review comments), he is advised
|
||||
to note differences to previous versions after the "---" line in the patch so
|
||||
that it helps reviewers but doesn't become part of git history. Moreover, such
|
||||
patch needs to be prefixed correctly with "--subject-prefix=PATCHv2" appended
|
||||
to "git send-email" (substitute "v2" with the correct version if needed
|
||||
though).
|
||||
|
||||
|
||||
|
||||
(4) In your commit message, make the summary line reasonably short (60 characters
|
||||
(3) In your commit message, make the summary line reasonably short (60 characters
|
||||
is typical), followed by a blank line, followed by any longer description of
|
||||
why your patch makes sense. If the patch fixes a regression, and you know what
|
||||
commit introduced the problem, mentioning that is useful. If the patch
|
||||
@@ -82,7 +78,7 @@ is up to you if you want to include or omit them in the commit message.
|
||||
|
||||
|
||||
|
||||
(5) Split large changes into a series of smaller patches, self-contained if
|
||||
(4) Split large changes into a series of smaller patches, self-contained if
|
||||
possible, with an explanation of each patch and an explanation of how the
|
||||
sequence of patches fits together. Moreover, please keep in mind that it's
|
||||
required to be able to compile cleanly (*including* "make check" and "make
|
||||
@@ -93,10 +89,10 @@ things).
|
||||
|
||||
|
||||
|
||||
(6) Make sure your patches apply against libvirt GIT. Developers only follow GIT
|
||||
(5) Make sure your patches apply against libvirt GIT. Developers only follow GIT
|
||||
and don't care much about released versions.
|
||||
|
||||
(7) Run the automated tests on your code before submitting any changes. In
|
||||
(6) Run the automated tests on your code before submitting any changes. In
|
||||
particular, configure with compile warnings set to -Werror. This is done
|
||||
automatically for a git checkout; from a tarball, use:
|
||||
|
||||
@@ -113,7 +109,7 @@ issues, such as leaks or use of uninitialized variables.
|
||||
|
||||
Some tests are skipped by default in a development environment, based on the
|
||||
time they take in comparison to the likelihood that those tests will turn up
|
||||
problems during incremental builds. These tests default to being run when
|
||||
problems during incremental builds. These tests default to being run when when
|
||||
building from a tarball or with the configure option --enable-expensive-tests;
|
||||
you can also force a one-time toggle of these tests by setting
|
||||
VIR_TEST_EXPENSIVE to 0 or 1 at make time, as in:
|
||||
@@ -142,7 +138,7 @@ various tests under gdb or Valgrind.
|
||||
|
||||
|
||||
|
||||
(8) The Valgrind test should produce similar output to "make check". If the output
|
||||
(7) The Valgrind test should produce similar output to "make check". If the output
|
||||
has traces within libvirt API's, then investigation is required in order to
|
||||
determine the cause of the issue. Output such as the following indicates some
|
||||
sort of leak:
|
||||
@@ -218,14 +214,14 @@ to "tests/.valgrind.supp" in order to suppress the warning:
|
||||
|
||||
|
||||
|
||||
(9) Update tests and/or documentation, particularly if you are adding a new
|
||||
(8) Update tests and/or documentation, particularly if you are adding a new
|
||||
feature or changing the output of a program.
|
||||
|
||||
|
||||
|
||||
There is more on this subject, including lots of links to background reading
|
||||
on the subject, on Richard Jones' guide to working with open source projects
|
||||
<http://people.redhat.com/rjones/how-to-supply-code-to-open-source-projects/>.
|
||||
<http://et.redhat.com/~rjones/how-to-supply-code-to-open-source-projects/>.
|
||||
|
||||
|
||||
Code indentation
|
||||
@@ -236,9 +232,22 @@ but we do prefer that contributed code be formatted similarly. In short, use
|
||||
spaces-not-TABs for indentation, use 4 spaces for each indentation level, and
|
||||
other than that, follow the K&R style.
|
||||
|
||||
If you use Emacs, the project includes a file .dir-locals.el that sets up the
|
||||
preferred indentation. If you use vim, append the following to your ~/.vimrc
|
||||
file:
|
||||
If you use Emacs, add the following to one of one of your start-up files
|
||||
(e.g., ~/.emacs), to help ensure that you get indentation right:
|
||||
|
||||
;;; When editing C sources in libvirt, use this style.
|
||||
(defun libvirt-c-mode ()
|
||||
"C mode with adjusted defaults for use with libvirt."
|
||||
(interactive)
|
||||
(c-set-style "K&R")
|
||||
(setq indent-tabs-mode nil) ; indent using spaces, not TABs
|
||||
(setq c-indent-level 4)
|
||||
(setq c-basic-offset 4))
|
||||
(add-hook 'c-mode-hook
|
||||
'(lambda () (if (string-match "/libvirt" (buffer-file-name))
|
||||
(libvirt-c-mode))))
|
||||
|
||||
If you use vim, append the following to your ~/.vimrc file:
|
||||
|
||||
set nocompatible
|
||||
filetype on
|
||||
@@ -248,7 +257,7 @@ file:
|
||||
set tabstop=8
|
||||
set shiftwidth=4
|
||||
set expandtab
|
||||
set cinoptions=(0,:0,l1,t0,L3
|
||||
set cinoptions=(0,:0,l1,t0
|
||||
filetype plugin indent on
|
||||
au FileType make setlocal noexpandtab
|
||||
au BufRead,BufNewFile *.am setlocal noexpandtab
|
||||
@@ -370,23 +379,16 @@ although use of a semicolon is not currently rejected.
|
||||
|
||||
Curly braces
|
||||
============
|
||||
Omit the curly braces around an "if", "while", "for" etc. body only when both
|
||||
that body and the condition itself occupy a single line. In every other case
|
||||
we require the braces. This ensures that it is trivially easy to identify a
|
||||
single-'statement' loop: each has only one 'line' in its body.
|
||||
Omit the curly braces around an "if", "while", "for" etc. body only when that
|
||||
body occupies a single line. In every other case we require the braces. This
|
||||
ensures that it is trivially easy to identify a single-'statement' loop: each
|
||||
has only one 'line' in its body.
|
||||
|
||||
while (expr) // single line body; {} is forbidden
|
||||
Omitting braces with a single-line body is fine:
|
||||
|
||||
while (expr) // one-line body -> omitting curly braces is ok
|
||||
single_line_stmt();
|
||||
|
||||
while (expr(arg1,
|
||||
arg2)) // indentation makes it obvious it is single line,
|
||||
single_line_stmt(); // {} is optional (not enforced either way)
|
||||
|
||||
while (expr1 &&
|
||||
expr2) { // multi-line, at same indentation, {} required
|
||||
single_line_stmt();
|
||||
}
|
||||
|
||||
However, the moment your loop/if/else body extends on to a second line, for
|
||||
whatever reason (even if it's just an added comment), then you should add
|
||||
braces. Otherwise, it would be too easy to insert a statement just before that
|
||||
@@ -472,33 +474,6 @@ But if negating a complex condition is too ugly, then at least add braces:
|
||||
x = y;
|
||||
}
|
||||
|
||||
Use hanging braces for compound statements: the opening brace of a compound
|
||||
statement should be on the same line as the condition being tested. Only
|
||||
top-level function bodies, nested scopes, and compound structure declarations
|
||||
should ever have { on a line by itself.
|
||||
|
||||
void
|
||||
foo(int a, int b)
|
||||
{ // correct - function body
|
||||
int 2d[][] = {
|
||||
{ // correct - complex initialization
|
||||
1, 2,
|
||||
},
|
||||
};
|
||||
if (a)
|
||||
{ // BAD: compound brace on its own line
|
||||
do_stuff();
|
||||
}
|
||||
{ // correct - nested scope
|
||||
int tmp;
|
||||
if (a < b) { // correct - hanging brace
|
||||
tmp = b;
|
||||
b = a;
|
||||
a = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Preprocessor
|
||||
============
|
||||
@@ -515,7 +490,7 @@ Use parenthesis when checking if a macro is defined, and use indentation to
|
||||
track nesting:
|
||||
|
||||
#if defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_FALLOCATE)
|
||||
# define fallocate(a, ignored, b, c) posix_fallocate(a, b, c)
|
||||
# define fallocate(a,ignored,b,c) posix_fallocate(a,b,c)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -814,7 +789,7 @@ Variable length string buffer
|
||||
=============================
|
||||
If there is a need for complex string concatenations, avoid using the usual
|
||||
sequence of malloc/strcpy/strcat/snprintf functions and make use of the
|
||||
virBuffer API described in virbuffer.h
|
||||
virBuffer API described in buf.h
|
||||
|
||||
Typical usage is as follows:
|
||||
|
||||
@@ -832,8 +807,11 @@ Typical usage is as follows:
|
||||
|
||||
...
|
||||
|
||||
if (virBufferCheckError(&buf) < 0)
|
||||
if (virBufferError(&buf)) {
|
||||
virBufferFreeAndReset(&buf);
|
||||
virReportOOMError();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return virBufferContentAndReset(&buf);
|
||||
}
|
||||
@@ -950,16 +928,6 @@ When using goto, please use one of these standard labels if it makes sense:
|
||||
no_memory: A path only taken upon return with an OOM error code
|
||||
retry: If needing to jump upwards (e.g., retry on EINTR)
|
||||
|
||||
Top-level labels should be indented by one space (putting them on the
|
||||
beginning of the line confuses function context detection in git):
|
||||
|
||||
int foo()
|
||||
{
|
||||
/* ... do stuff ... */
|
||||
cleanup:
|
||||
/* ... do other stuff ... */
|
||||
}
|
||||
|
||||
|
||||
Libvirt committer guidelines
|
||||
============================
|
||||
|
||||
@@ -22,9 +22,7 @@ GENHTML = genhtml
|
||||
SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \
|
||||
tests po examples/object-events examples/hellolibvirt \
|
||||
examples/dominfo examples/domsuspend examples/apparmor \
|
||||
examples/xml/nwfilter examples/openauth examples/systemtap \
|
||||
tools/wireshark examples/dommigrate \
|
||||
examples/lxcconvert examples/domtop
|
||||
examples/xml/nwfilter examples/openauth examples/systemtap
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
@@ -38,8 +36,6 @@ EXTRA_DIST = \
|
||||
libvirt.spec libvirt.spec.in \
|
||||
mingw-libvirt.spec.in \
|
||||
libvirt.pc.in \
|
||||
libvirt-qemu.pc.in \
|
||||
libvirt-lxc.pc.in \
|
||||
autobuild.sh \
|
||||
Makefile.nonreentrant \
|
||||
autogen.sh \
|
||||
@@ -49,7 +45,7 @@ EXTRA_DIST = \
|
||||
$(XML_EXAMPLES)
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc
|
||||
pkgconfig_DATA = libvirt.pc
|
||||
|
||||
NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in
|
||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||
|
||||
@@ -15,7 +15,7 @@ Specific development tools and versions will be checked for and listed by
|
||||
the bootstrap script.
|
||||
|
||||
Valgrind <http://valgrind.org/> is also highly recommended, if
|
||||
Valgrind supports your architecture.
|
||||
Valgrind supports your architecture. See also README-valgrind.
|
||||
|
||||
While building from a just-cloned source tree may require installing a
|
||||
few prerequisites, later, a plain `git pull && make' should be sufficient.
|
||||
|
||||
@@ -85,7 +85,8 @@ if test -x /usr/bin/i686-w64-mingw32-gcc ; then
|
||||
--host=i686-w64-mingw32 \
|
||||
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \
|
||||
--enable-expensive-tests \
|
||||
--enable-werror
|
||||
--enable-werror \
|
||||
--without-libvirtd
|
||||
|
||||
make
|
||||
make install
|
||||
@@ -104,7 +105,8 @@ if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
|
||||
--host=x86_64-w64-mingw32 \
|
||||
--prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \
|
||||
--enable-expensive-tests \
|
||||
--enable-werror
|
||||
--enable-werror \
|
||||
--without-libvirtd
|
||||
|
||||
make
|
||||
make install
|
||||
|
||||
@@ -20,10 +20,6 @@ no_git=
|
||||
if test "x$1" = "x--no-git"; then
|
||||
no_git=" $1"
|
||||
shift
|
||||
case "$1 $2" in
|
||||
--gnulib-srcdir=*) no_git="$no_git $1"; shift ;;
|
||||
--gnulib-srcdir\ *) no_git="$no_git $1=$2"; shift; shift;;
|
||||
esac
|
||||
fi
|
||||
if test -z "$NOCONFIGURE" ; then
|
||||
if test "x$1" = "x--system"; then
|
||||
@@ -39,7 +35,7 @@ if test -z "$NOCONFIGURE" ; then
|
||||
echo "Running ./configure with $EXTRA_ARGS $@"
|
||||
else
|
||||
if test -z "$*" && test ! -f "$THEDIR/config.status"; then
|
||||
echo "I am going to run ./configure with no arguments - if you wish"
|
||||
echo "I am going to run ./configure with no arguments - if you wish "
|
||||
echo "to pass any to it, please specify them on the $0 command line."
|
||||
fi
|
||||
fi
|
||||
|
||||
47
bootstrap
47
bootstrap
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Print a version string.
|
||||
scriptversion=2014-12-08.12; # UTC
|
||||
scriptversion=2013-12-05.23; # UTC
|
||||
|
||||
# Bootstrap this package from checked-out sources.
|
||||
|
||||
# Copyright (C) 2003-2015 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2003-2014 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -42,9 +42,6 @@ export LC_ALL
|
||||
|
||||
local_gl_dir=gl
|
||||
|
||||
# Honour $PERL, but work even if there is none
|
||||
PERL="${PERL-perl}"
|
||||
|
||||
me=$0
|
||||
|
||||
usage() {
|
||||
@@ -213,17 +210,7 @@ bootstrap_sync=false
|
||||
use_git=true
|
||||
|
||||
check_exists() {
|
||||
if test "$1" = "--verbose"; then
|
||||
($2 --version </dev/null) >/dev/null 2>&1
|
||||
if test $? -ge 126; then
|
||||
# If not found, run with diagnostics as one may be
|
||||
# presented with env variables to set to find the right version
|
||||
($2 --version </dev/null)
|
||||
fi
|
||||
else
|
||||
($1 --version </dev/null) >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
($1 --version </dev/null) >/dev/null 2>&1
|
||||
test $? -lt 126
|
||||
}
|
||||
|
||||
@@ -421,7 +408,7 @@ sort_ver() { # sort -V is not generally available
|
||||
get_version() {
|
||||
app=$1
|
||||
|
||||
$app --version >/dev/null 2>&1 || { $app --version; return 1; }
|
||||
$app --version >/dev/null 2>&1 || return 1
|
||||
|
||||
$app --version 2>&1 |
|
||||
sed -n '# Move version to start of line.
|
||||
@@ -459,7 +446,6 @@ check_versions() {
|
||||
test "$appvar" = TAR && appvar=AMTAR
|
||||
case $appvar in
|
||||
GZIP) ;; # Do not use $GZIP: it contains gzip options.
|
||||
PERL::*) ;; # Keep perl modules as-is
|
||||
*) eval "app=\${$appvar-$app}" ;;
|
||||
esac
|
||||
|
||||
@@ -477,22 +463,11 @@ check_versions() {
|
||||
ret=1
|
||||
continue
|
||||
} ;;
|
||||
# Another check is for perl modules. These can be written as
|
||||
# e.g. perl::XML::XPath in case of XML::XPath module, etc.
|
||||
perl::*)
|
||||
# Extract module name
|
||||
app="${app#perl::}"
|
||||
if ! $PERL -m"$app" -e 'exit 0' >/dev/null 2>&1; then
|
||||
warn_ "Error: perl module '$app' not found"
|
||||
ret=1
|
||||
fi
|
||||
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.
|
||||
if ! check_exists --verbose $app; then
|
||||
if ! check_exists $app; then
|
||||
warn_ "Error: '$app' not found"
|
||||
ret=1
|
||||
fi
|
||||
@@ -623,8 +598,8 @@ case ${GNULIB_SRCDIR--} in
|
||||
# Note that $use_git is necessarily true in this case.
|
||||
if git_modules_config submodule.gnulib.url >/dev/null; then
|
||||
echo "$0: getting gnulib files..."
|
||||
git submodule init -- "$gnulib_path" || exit $?
|
||||
git submodule update -- "$gnulib_path" || exit $?
|
||||
git submodule init || exit $?
|
||||
git submodule update || exit $?
|
||||
|
||||
elif [ ! -d "$gnulib_path" ]; then
|
||||
echo "$0: getting gnulib files..."
|
||||
@@ -653,14 +628,13 @@ case ${GNULIB_SRCDIR--} in
|
||||
# This fallback allows at least git 1.5.5.
|
||||
if test -f "$gnulib_path"/gnulib-tool; then
|
||||
# Since file already exists, assume submodule init already complete.
|
||||
git submodule update -- "$gnulib_path" || exit $?
|
||||
git submodule update || exit $?
|
||||
else
|
||||
# Older git can't clone into an empty directory.
|
||||
rmdir "$gnulib_path" 2>/dev/null
|
||||
git clone --reference "$GNULIB_SRCDIR" \
|
||||
"$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \
|
||||
&& git submodule init -- "$gnulib_path" \
|
||||
&& git submodule update -- "$gnulib_path" \
|
||||
&& git submodule init && git submodule update \
|
||||
|| exit $?
|
||||
fi
|
||||
fi
|
||||
@@ -915,8 +889,7 @@ if test $use_libtool = 1; then
|
||||
esac
|
||||
fi
|
||||
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
|
||||
$gnulib_tool $gnulib_tool_options --import $gnulib_modules \
|
||||
|| die "gnulib-tool failed"
|
||||
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
|
||||
|
||||
for file in $gnulib_files; do
|
||||
symlink_to_dir "$GNULIB_SRCDIR" $file \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Bootstrap configuration.
|
||||
|
||||
# Copyright (C) 2010-2014 Red Hat, Inc.
|
||||
# Copyright (C) 2010-2013 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
|
||||
@@ -35,7 +35,6 @@ clock-time
|
||||
close
|
||||
connect
|
||||
configmake
|
||||
count-leading-zeros
|
||||
count-one-bits
|
||||
crypto/md5
|
||||
crypto/sha256
|
||||
@@ -210,7 +209,6 @@ gzip -
|
||||
libtool -
|
||||
patch -
|
||||
perl 5.5
|
||||
perl::XML::XPath -
|
||||
pkg-config -
|
||||
python-config -
|
||||
rpcgen -
|
||||
|
||||
@@ -27,20 +27,13 @@ my $ret = 0;
|
||||
my $incomment = 0;
|
||||
|
||||
foreach my $file (@ARGV) {
|
||||
# Per-file variables for multiline Curly Bracket (cb_) check
|
||||
my $cb_linenum = 0;
|
||||
my $cb_code = "";
|
||||
my $cb_scolon = 0;
|
||||
|
||||
open FILE, $file;
|
||||
|
||||
while (defined (my $line = <FILE>)) {
|
||||
my $data = $line;
|
||||
# For temporary modifications
|
||||
my $tmpdata;
|
||||
|
||||
# Kill any quoted , ; = or "
|
||||
$data =~ s/'[";,=]'/'X'/g;
|
||||
# Kill any quoted , ; or "
|
||||
$data =~ s/'[";,]'/'X'/g;
|
||||
|
||||
# Kill any quoted strings
|
||||
$data =~ s,"([^\\\"]|\\.)*","XXX",g;
|
||||
@@ -84,17 +77,13 @@ foreach my $file (@ARGV) {
|
||||
#
|
||||
# foo (*bar, wizz);
|
||||
#
|
||||
# We also don't want to spoil the $data so it can be used
|
||||
# later on.
|
||||
$tmpdata = $data;
|
||||
while ($tmpdata =~ /(\w+)\s\((?!\*)/) {
|
||||
while ($data =~ /(\w+)\s\((?!\*)/) {
|
||||
my $kw = $1;
|
||||
|
||||
# Allow space after keywords only
|
||||
if ($kw =~ /^(if|for|while|switch|return)$/) {
|
||||
$tmpdata =~ s/($kw\s\()/XXX(/;
|
||||
$data =~ s/($kw\s\()/XXX(/;
|
||||
} else {
|
||||
print "Whitespace after non-keyword:\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
@@ -103,26 +92,26 @@ foreach my $file (@ARGV) {
|
||||
|
||||
# Require whitespace immediately after keywords,
|
||||
# but none after the opening bracket
|
||||
if ($data =~ /\b(if|for|while|switch|return)\(/ ||
|
||||
$data =~ /\b(if|for|while|switch|return)\s+\(\s/) {
|
||||
print "No whitespace after keyword:\n";
|
||||
while ($data =~ /\b(if|for|while|switch|return)\(/ ||
|
||||
$data =~ /\b(if|for|while|switch|return)\s+\(\s/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
# Forbid whitespace between )( of a function typedef
|
||||
if ($data =~ /\(\*\w+\)\s+\(/) {
|
||||
print "Whitespace between ')' and '(':\n";
|
||||
while ($data =~ /\(\*\w+\)\s+\(/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
# Forbid whitespace following ( or prior to )
|
||||
if ($data =~ /\S\s+\)/ ||
|
||||
$data =~ /\(\s+\S/) {
|
||||
print "Whitespace after '(' or before ')':\n";
|
||||
while ($data =~ /\S\s+\)/ ||
|
||||
$data =~ /\(\s+\S/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
# Forbid whitespace before ";" or ",". Things like below are allowed:
|
||||
@@ -135,67 +124,25 @@ foreach my $file (@ARGV) {
|
||||
# errno == EINTR)
|
||||
# ;
|
||||
#
|
||||
if ($data =~ /[^;\s]\s+[;,]/) {
|
||||
print "Whitespace before (semi)colon:\n";
|
||||
while ($data =~ /[^;\s]\s+[;,]/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
# Require EOL, macro line continuation, or whitespace after ";".
|
||||
# Allow "for (;;)" as an exception.
|
||||
if ($data =~ /;[^ \\\n;)]/) {
|
||||
print "Invalid character after semicolon:\n";
|
||||
while ($data =~ /;[^ \\\n;)]/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
# Require EOL, space, or enum/struct end after comma.
|
||||
if ($data =~ /,[^ \\\n)}]/) {
|
||||
print "Invalid character after comma:\n";
|
||||
while ($data =~ /,[^ \\\n)}]/) {
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
}
|
||||
|
||||
# Require spaces around assignment '=', compounds and '=='
|
||||
# with the exception of virAssertCmpInt()
|
||||
$tmpdata = $data;
|
||||
$tmpdata =~ s/(virAssertCmpInt\(.* ).?=,/$1op,/;
|
||||
if ($tmpdata =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=[^=]/ ||
|
||||
$tmpdata =~ /=[^= \\\n]/) {
|
||||
print "Spacing around '=' or '==':\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
}
|
||||
|
||||
# One line conditional statements with one line bodies should
|
||||
# not use curly brackets.
|
||||
if ($data =~ /^\s*(if|while|for)\b.*\{$/) {
|
||||
$cb_linenum = $.;
|
||||
$cb_code = $line;
|
||||
$cb_scolon = 0;
|
||||
}
|
||||
|
||||
# We need to check for exactly one semicolon inside the body,
|
||||
# because empty statements (e.g. with comment only) are
|
||||
# allowed
|
||||
if ($cb_linenum == $. - 1 && $data =~ /^[^;]*;[^;]*$/) {
|
||||
$cb_code .= $line;
|
||||
$cb_scolon = 1;
|
||||
}
|
||||
|
||||
if ($data =~ /^\s*}\s*$/ &&
|
||||
$cb_linenum == $. - 2 &&
|
||||
$cb_scolon) {
|
||||
|
||||
print "Curly brackets around single-line body:\n";
|
||||
print "$file:$cb_linenum-$.:\n$cb_code$line";
|
||||
$ret = 1;
|
||||
|
||||
# There _should_ be no need to reset the values; but to
|
||||
# keep my inner peace...
|
||||
$cb_linenum = 0;
|
||||
$cb_scolon = 0;
|
||||
$cb_code = "";
|
||||
last;
|
||||
}
|
||||
}
|
||||
close FILE;
|
||||
|
||||
250
cfg.mk
250
cfg.mk
@@ -1,5 +1,5 @@
|
||||
# Customize Makefile.maint. -*- makefile -*-
|
||||
# Copyright (C) 2008-2014 Red Hat, Inc.
|
||||
# Copyright (C) 2008-2013 Red Hat, Inc.
|
||||
# Copyright (C) 2003-2008 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
@@ -90,7 +90,7 @@ endif
|
||||
|
||||
# Files that should never cause syntax check failures.
|
||||
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
||||
(^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
||||
(^(HACKING|docs/(news\.html\.in|.*\.patch))|\.po)$$
|
||||
|
||||
# Functions like free() that are no-ops on NULL arguments.
|
||||
useless_free_options = \
|
||||
@@ -160,6 +160,7 @@ useless_free_options = \
|
||||
--name=virNWFilterRuleDefFree \
|
||||
--name=virNWFilterRuleInstFree \
|
||||
--name=virNetworkDefFree \
|
||||
--name=virNetworkObjFree \
|
||||
--name=virNodeDeviceDefFree \
|
||||
--name=virNodeDeviceObjFree \
|
||||
--name=virObjectUnref \
|
||||
@@ -248,6 +249,8 @@ useless_free_options = \
|
||||
# y virNetworkDefFree
|
||||
# n virNetworkFree (returns int)
|
||||
# n virNetworkFreeName (returns int)
|
||||
# y virNetworkObjFree
|
||||
# n virNetworkObjListFree FIXME
|
||||
# n virNodeDevCapsDefFree FIXME
|
||||
# y virNodeDeviceDefFree
|
||||
# n virNodeDeviceFree (returns int)
|
||||
@@ -300,7 +303,7 @@ sc_flags_debug:
|
||||
# than d). The existence of long long, and of documentation about
|
||||
# flags, makes the regex in the third test slightly harder.
|
||||
sc_flags_usage:
|
||||
@test "$$(cat $(srcdir)/include/libvirt/libvirt-domain.h \
|
||||
@test "$$(cat $(srcdir)/include/libvirt/libvirt.h.in \
|
||||
$(srcdir)/include/libvirt/virterror.h \
|
||||
$(srcdir)/include/libvirt/libvirt-qemu.h \
|
||||
$(srcdir)/include/libvirt/libvirt-lxc.h \
|
||||
@@ -418,12 +421,6 @@ sc_prohibit_gethostname:
|
||||
halt='use virGetHostname, not gethostname' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_readdir:
|
||||
@prohibit='\breaddir *\(' \
|
||||
exclude='exempt from syntax-check' \
|
||||
halt='use virDirRead, not readdir' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_gettext_noop:
|
||||
@prohibit='gettext_noop *\(' \
|
||||
halt='use N_, not gettext_noop' \
|
||||
@@ -520,11 +517,6 @@ sc_prohibit_virBufferAsprintf_with_string_literal:
|
||||
halt='use virBufferAddLit, not virBufferAsprintf, with a string literal' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_forbid_manual_xml_indent:
|
||||
@prohibit='virBuffer.*" +<' \
|
||||
halt='use virBufferAdjustIndent instead of spaces when indenting xml' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Not only do they fail to deal well with ipv6, but the gethostby*
|
||||
# functions are also not thread-safe.
|
||||
sc_prohibit_gethostby:
|
||||
@@ -565,7 +557,7 @@ sc_avoid_attribute_unused_in_header:
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_int_ijk:
|
||||
@prohibit='\<(int|unsigned) ([^(=]* )*(i|j|k)\>(\s|,|;)' \
|
||||
@prohibit='\<(int|unsigned) ([^(]* )*(i|j|k)\>(\s|,|;)' \
|
||||
halt='use size_t, not int/unsigned int for loop vars i, j, k' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
@@ -581,12 +573,6 @@ sc_prohibit_loop_var_decl:
|
||||
halt='declare loop iterators outside the for statement' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Use 'bool', not 'int', when assigning true or false
|
||||
sc_prohibit_int_assign_bool:
|
||||
@prohibit='\<int\>.*= *(true|false)' \
|
||||
halt='use bool type for boolean values' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Many of the function names below came from this filter:
|
||||
# git grep -B2 '\<_('|grep -E '\.c- *[[:alpha:]_][[:alnum:]_]* ?\(.*[,;]$' \
|
||||
# |sed 's/.*\.c- *//'|perl -pe 's/ ?\(.*//'|sort -u \
|
||||
@@ -599,6 +585,16 @@ msg_gen_function += regerror
|
||||
msg_gen_function += vah_error
|
||||
msg_gen_function += vah_warning
|
||||
msg_gen_function += virGenericReportError
|
||||
msg_gen_function += virLibConnError
|
||||
msg_gen_function += virLibDomainError
|
||||
msg_gen_function += virLibDomainSnapshotError
|
||||
msg_gen_function += virLibInterfaceError
|
||||
msg_gen_function += virLibNetworkError
|
||||
msg_gen_function += virLibNodeDeviceError
|
||||
msg_gen_function += virLibNWFilterError
|
||||
msg_gen_function += virLibSecretError
|
||||
msg_gen_function += virLibStoragePoolError
|
||||
msg_gen_function += virLibStorageVolError
|
||||
msg_gen_function += virRaiseError
|
||||
msg_gen_function += virReportError
|
||||
msg_gen_function += virReportErrorHelper
|
||||
@@ -628,7 +624,7 @@ sc_libvirt_unmarked_diagnostics:
|
||||
$(_sc_search_regexp)
|
||||
@{ grep -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT)); \
|
||||
grep -A1 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
|
||||
| $(SED) 's/_("\([^\"]\|\\.\)\+"//;s/[ ]"%s"//' \
|
||||
| sed 's/_("\([^\"]\|\\.\)\+"//;s/[ ]"%s"//' \
|
||||
| grep '[ ]"' && \
|
||||
{ echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
|
||||
exit 1; } || :
|
||||
@@ -653,7 +649,7 @@ sc_prohibit_newline_at_end_of_diagnostic:
|
||||
sc_prohibit_diagnostic_without_format:
|
||||
@{ grep -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT)); \
|
||||
grep -A2 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
|
||||
| $(SED) -rn -e ':l; /[,"]$$/ {N;b l;}' \
|
||||
| sed -rn -e ':l; /[,"]$$/ {N;b l;}' \
|
||||
-e '/(xenapiSessionErrorHandler|vah_(error|warning))/d' \
|
||||
-e '/\<$(func_re) *\([^"]*"([^%"]|"\n[^"]*")*"[,)]/p' \
|
||||
| grep -vE 'VIR_ERROR' && \
|
||||
@@ -675,7 +671,7 @@ sc_prohibit_useless_translation:
|
||||
# or \n on one side of the split.
|
||||
sc_require_whitespace_in_translation:
|
||||
@grep -n -A1 '"$$' $$($(VC_LIST_EXCEPT)) \
|
||||
| $(SED) -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g' \
|
||||
| sed -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g' \
|
||||
-e '/_(.*[^\ ]""[^\ ]/p' | grep . && \
|
||||
{ echo '$(ME): missing whitespace at line split' 1>&2; \
|
||||
exit 1; } || :
|
||||
@@ -683,7 +679,7 @@ sc_require_whitespace_in_translation:
|
||||
# Enforce recommended preprocessor indentation style.
|
||||
sc_preprocessor_indentation:
|
||||
@if cppi --version >/dev/null 2>&1; then \
|
||||
$(VC_LIST_EXCEPT) | grep -E '\.[ch](\.in)?$$' | xargs cppi -a -c \
|
||||
$(VC_LIST_EXCEPT) | grep '\.[ch]$$' | xargs cppi -a -c \
|
||||
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
|
||||
exit 1; }; \
|
||||
else \
|
||||
@@ -695,11 +691,11 @@ sc_preprocessor_indentation:
|
||||
sc_spec_indentation:
|
||||
@if cppi --version >/dev/null 2>&1; then \
|
||||
for f in $$($(VC_LIST_EXCEPT) | grep '\.spec\.in$$'); do \
|
||||
$(SED) -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |' \
|
||||
sed -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |' \
|
||||
-e 's/%\(else\|endif\|define\)/#\1/' \
|
||||
-e 's/^\( *\)\1\1\1#/#\1/' \
|
||||
-e 's|^\( *[^#/ ]\)|// \1|; s|^\( */[^/]\)|// \1|' $$f \
|
||||
| cppi -a -c 2>&1 | $(SED) "s|standard input|$$f|"; \
|
||||
| cppi -a -c 2>&1 | sed "s|standard input|$$f|"; \
|
||||
done | { if grep . >&2; then false; else :; fi; } \
|
||||
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
|
||||
exit 1; }; \
|
||||
@@ -769,17 +765,16 @@ sc_prohibit_gettext_markup:
|
||||
# lower-level code must not include higher-level headers.
|
||||
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
|
||||
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
|
||||
mid_dirs=access|conf|cpu|locking|network|node_device|rpc|security|storage
|
||||
sc_prohibit_cross_inclusion:
|
||||
@for dir in $(cross_dirs); do \
|
||||
case $$dir in \
|
||||
util/) safe="util";; \
|
||||
access/ | conf/) safe="($$dir|conf|util)";; \
|
||||
locking/) safe="($$dir|util|conf|rpc)";; \
|
||||
cpu/| network/| node_device/| rpc/| security/| storage/) \
|
||||
safe="($$dir|util|conf|storage)";; \
|
||||
xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \
|
||||
*) safe="($$dir|$(mid_dirs)|util)";; \
|
||||
locking/) \
|
||||
safe="($$dir|util|conf|rpc)";; \
|
||||
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)' \
|
||||
@@ -792,7 +787,7 @@ sc_prohibit_cross_inclusion:
|
||||
# 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' \
|
||||
| sed -ne '/VIR_ENUM_IMPL[^,]*,$$/N' \
|
||||
-e '/VIR_ENUM_IMPL[^,]*,[^,]*[^_,][^L,][^A,][^S,][^T,],/p' \
|
||||
-e '/VIR_ENUM_IMPL[^,]*,[^,]\{0,4\},/p' \
|
||||
| grep . && \
|
||||
@@ -877,138 +872,10 @@ sc_prohibit_atoi:
|
||||
halt='Use virStrToLong* instead of atoi, atol, atof, atoq, atoll' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_wrong_filename_in_comment:
|
||||
@fail=0; \
|
||||
awk 'BEGIN { \
|
||||
fail=0; \
|
||||
} FNR < 3 { \
|
||||
n=match($$0, /[[:space:]][^[:space:]]*[.][ch][[:space:]:]/); \
|
||||
if (n > 0) { \
|
||||
A=substr($$0, RSTART+1, RLENGTH-2); \
|
||||
n=split(FILENAME, arr, "/"); \
|
||||
if (A != arr[n]) { \
|
||||
print "in " FILENAME ": " A " mentioned in comments "; \
|
||||
fail=1; \
|
||||
} \
|
||||
} \
|
||||
} END { \
|
||||
if (fail == 1) { \
|
||||
exit 1; \
|
||||
} \
|
||||
}' $$($(VC_LIST_EXCEPT) | grep '\.[ch]$$') || fail=1; \
|
||||
if test $$fail -eq 1; then \
|
||||
{ echo '$(ME): The file name in comments must match the' \
|
||||
'actual file name' 1>&2; exit 1; } \
|
||||
fi;
|
||||
|
||||
sc_prohibit_virConnectOpen_in_virsh:
|
||||
@prohibit='\bvirConnectOpen[a-zA-Z]* *\(' \
|
||||
in_vc_files='^tools/virsh-.*\.[ch]$$' \
|
||||
halt='Use vshConnect() in virsh instead of virConnectOpen*' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_require_space_before_label:
|
||||
@prohibit='^( ?)?[_a-zA-Z0-9]+:$$' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt="Top-level labels should be indented by one space" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Doesn't catch all cases of mismatched braces across if-else, but it helps
|
||||
sc_require_if_else_matching_braces:
|
||||
@prohibit='( else( if .*\))? {|} else( if .*\))?$$)' \
|
||||
in_vc_files='\.[chx]$$' \
|
||||
halt="if one side of if-else uses {}, both sides must use it" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_curly_braces_style:
|
||||
@files=$$($(VC_LIST_EXCEPT) | grep '\.[ch]$$'); \
|
||||
if $(GREP) -nHP \
|
||||
'^\s*(?!([a-zA-Z_]*for_?each[a-zA-Z_]*) ?\()([_a-zA-Z0-9]+( [_a-zA-Z0-9]+)* ?\()?(\*?[_a-zA-Z0-9]+(,? \*?[_a-zA-Z0-9\[\]]+)+|void)\) ?\{' \
|
||||
$$files; then \
|
||||
echo '$(ME): Non-K&R style used for curly braces around' \
|
||||
'function body, see HACKING' 1>&2; exit 1; \
|
||||
fi; \
|
||||
if $(GREP) -A1 -En ' ((if|for|while|switch) \(|(else|do)\b)[^{]*$$'\
|
||||
$$files | $(GREP) '^[^ ]*- *{'; then \
|
||||
echo '$(ME): Use hanging braces for compound statements,' \
|
||||
'see HACKING' 1>&2; exit 1; \
|
||||
fi
|
||||
|
||||
sc_prohibit_windows_special_chars_in_filename:
|
||||
@files=$$($(VC_LIST_EXCEPT) | grep '[:*?"<>|]'); \
|
||||
test -n "$$files" && { echo '$(ME): Windows special chars' \
|
||||
'in filename not allowed:' 1>&2; echo $$files 1>&2; exit 1; } || :
|
||||
|
||||
sc_prohibit_mixed_case_abbreviations:
|
||||
@prohibit='Pci|Usb|Scsi' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt='Use PCI, USB, SCSI, not Pci, Usb, Scsi' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Require #include <locale.h> in all files that call setlocale()
|
||||
sc_require_locale_h:
|
||||
@require='include.*locale\.h' \
|
||||
containing='setlocale *(' \
|
||||
halt='setlocale() requires <locale.h>' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_empty_first_line:
|
||||
@awk 'BEGIN { fail=0; } \
|
||||
FNR == 1 { if ($$0 == "") { print FILENAME ":1:"; fail=1; } } \
|
||||
END { if (fail == 1) { \
|
||||
print "$(ME): Prohibited empty first line" > "/dev/stderr"; \
|
||||
} exit fail; }' $$($(VC_LIST_EXCEPT));
|
||||
|
||||
sc_prohibit_paren_brace:
|
||||
@prohibit='\)\{$$' \
|
||||
in_vc_files='\.[chx]$$' \
|
||||
halt='Put space between closing parenthesis and opening brace' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# C guarantees that static variables are zero initialized, and some compilers
|
||||
# waste space by sticking explicit initializers in .data instead of .bss
|
||||
sc_prohibit_static_zero_init:
|
||||
@prohibit='\bstatic\b.*= *(0[^xX0-9]|NULL|false)' \
|
||||
in_vc_files='\.[chx](\.in)?$$' \
|
||||
halt='static variables do not need explicit zero initialization'\
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# FreeBSD exports the "devname" symbol which produces a warning.
|
||||
sc_prohibit_devname:
|
||||
@prohibit='\bdevname\b' \
|
||||
exclude='sc_prohibit_devname' \
|
||||
halt='avoid using 'devname' as FreeBSD exports the symbol' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_system_error_with_vir_err:
|
||||
@prohibit='\bvirReportSystemError *\(VIR_ERR_' \
|
||||
halt='do not use virReportSystemError with VIR_ERR_* error codes' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Rule to prohibit usage of virXXXFree within library, daemon, remote, etc.
|
||||
# functions. There's a corresponding exclude to allow usage within tests,
|
||||
# docs, examples, tools, src/libvirt-*.c, and include/libvirt/libvirt-*.h
|
||||
sc_prohibit_virXXXFree:
|
||||
@prohibit='\bvir(Domain|Network|NodeDevice|StorageVol|StoragePool|Stream|Secret|NWFilter|Interface|DomainSnapshot)Free\b' \
|
||||
exclude='sc_prohibit_virXXXFree' \
|
||||
halt='avoid using 'virXXXFree', use 'virObjectUnref' instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_sysconf_pagesize:
|
||||
@prohibit='sysconf\(_SC_PAGESIZE' \
|
||||
halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_pthread_create:
|
||||
@prohibit='\bpthread_create\b' \
|
||||
exclude='sc_prohibit_pthread_create' \
|
||||
halt="avoid using 'pthread_create', use 'virThreadCreate' instead" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# We don't use this feature of maint.mk.
|
||||
prev_version_file = /dev/null
|
||||
|
||||
ifneq ($(_gl-Makefile),)
|
||||
ifeq (0,$(MAKELEVEL))
|
||||
_curr_status = .git-module-status
|
||||
# The sed filter accommodates those who check out on a commit from which
|
||||
@@ -1021,7 +888,7 @@ ifeq (0,$(MAKELEVEL))
|
||||
# b653eda3ac4864de205419d9f41eec267cb89eeb
|
||||
#
|
||||
# Keep this logic in sync with autogen.sh.
|
||||
_submodule_hash = $(SED) 's/^[ +-]//;s/ .*//'
|
||||
_submodule_hash = sed 's/^[ +-]//;s/ .*//'
|
||||
_update_required := $(shell \
|
||||
cd '$(srcdir)'; \
|
||||
test -d .git || { echo 0; exit; }; \
|
||||
@@ -1041,7 +908,6 @@ ifeq (0,$(MAKELEVEL))
|
||||
maint.mk Makefile: _autogen
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# It is necessary to call autogen any time gnulib changes. Autogen
|
||||
# reruns configure, then we regenerate all Makefiles at once.
|
||||
@@ -1051,14 +917,12 @@ _autogen:
|
||||
./config.status
|
||||
|
||||
# regenerate HACKING as part of the syntax-check
|
||||
ifneq ($(_gl-Makefile),)
|
||||
syntax-check: $(top_srcdir)/HACKING bracket-spacing-check
|
||||
endif
|
||||
|
||||
bracket-spacing-check:
|
||||
$(AM_V_GEN)files=`$(VC_LIST) | grep '\.c$$'`; \
|
||||
$(PERL) $(top_srcdir)/build-aux/bracket-spacing.pl $$files || \
|
||||
{ echo '$(ME): incorrect formatting, see HACKING for rules' 1>&2; \
|
||||
{ echo '$(ME): incorrect whitespace, see HACKING for rules' 1>&2; \
|
||||
exit 1; }
|
||||
|
||||
# sc_po_check can fail if generated files are not built first
|
||||
@@ -1076,7 +940,7 @@ $(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\.h$$
|
||||
|
||||
_src1=libvirt-stream|fdstream|qemu/qemu_monitor|util/(vircommand|virfile)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller|locking/lock_daemon
|
||||
_src1=libvirt|fdstream|qemu/qemu_monitor|util/(vircommand|virfile)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller|locking/lock_daemon
|
||||
_test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock
|
||||
exclude_file_name_regexp--sc_avoid_write = \
|
||||
^(src/($(_src1))|daemon/libvirtd|tools/virsh-console|tests/($(_test1)))\.c$$
|
||||
@@ -1086,8 +950,7 @@ exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/
|
||||
exclude_file_name_regexp--sc_copyright_usage = \
|
||||
^COPYING(|\.LESSER)$$
|
||||
|
||||
exclude_file_name_regexp--sc_flags_usage = \
|
||||
^(docs/|src/util/virnetdevtap\.c$$|tests/vir(cgroup|pci|usb)mock\.c$$)
|
||||
exclude_file_name_regexp--sc_flags_usage = ^(docs/|src/util/virnetdevtap\.c$$|tests/vir(cgroup|pci)mock\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
||||
^(src/rpc/gendispatch\.pl$$|tests/)
|
||||
@@ -1095,7 +958,7 @@ exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
||||
exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
|
||||
^(include/libvirt/virterror\.h|daemon/dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
||||
^(include/libvirt/virterror\.h|daemon/dispatch\.c|src/util/virerror\.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_access_xok = ^src/util/virutil\.c$$
|
||||
|
||||
@@ -1103,13 +966,13 @@ exclude_file_name_regexp--sc_prohibit_asprintf = \
|
||||
^(bootstrap.conf$$|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strdup = \
|
||||
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c$$)
|
||||
^(docs/|examples/|src/util/virstring\.c|tests/virnetserverclientmock.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_close = \
|
||||
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir(cgroup|pci)mock\.c)$$)
|
||||
(\.p[yl]$$|^docs/|^(src/util/virfile\.c|src/libvirt\.c|tests/vir(cgroup|pci)mock\.c)$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
||||
(^tests/(qemuhelp|nodeinfo|virpcitest)data/|\.diff$$)
|
||||
(^tests/(qemuhelp|nodeinfo|virpcitest)data/|\.(gif|ico|png|diff)$$)
|
||||
|
||||
_src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon)
|
||||
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
||||
@@ -1124,10 +987,10 @@ exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
|
||||
^src/rpc/gendispatch\.pl$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
||||
^((po|tests)/|docs/.*(py|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl$$)
|
||||
^((po|tests)/|docs/.*(py|html\.in)|run.in$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
||||
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|vircgroupmock)\.c|tools/wireshark/src/packet-libvirt\.c)$$
|
||||
^(docs/hacking\.html\.in)|(src/util/viralloc\.[ch]|examples/.*|tests/securityselinuxhelper\.c|tests/vircgroupmock\.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_readlink = \
|
||||
^src/(util/virutil|lxc/lxc_container)\.c$$
|
||||
@@ -1135,11 +998,12 @@ exclude_file_name_regexp--sc_prohibit_readlink = \
|
||||
exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/virutil\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_sprintf = \
|
||||
(^docs/hacking\.html\.in|\.stp|\.pl)$$
|
||||
^(docs/hacking\.html\.in)|(examples/systemtap/.*stp)|(src/dtrace2systemtap\.pl)|(src/rpc/gensystemtap\.pl)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strncpy = ^src/util/virstring\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/dom.*/.*\.c$$
|
||||
exclude_file_name_regexp--sc_prohibit_strtol = \
|
||||
^(src/(util/virsexpr|(vbox|xen|xenxs)/.*)\.c)|(examples/domsuspend/suspend.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
||||
|
||||
@@ -1154,7 +1018,7 @@ exclude_file_name_regexp--sc_require_config_h_first = \
|
||||
^(examples/|tools/virsh-edit\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_trailing_blank = \
|
||||
/qemuhelpdata/|/sysinfodata/.*\.data|/nodeinfodata/.*\.cpuinfo$$
|
||||
(/qemuhelpdata/|/sysinfodata/.*\.data|\.(fig|gif|ico|png)$$)
|
||||
|
||||
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
||||
^(docs/apibuild.py|tests/virt-aa-helper-test)$$
|
||||
@@ -1167,7 +1031,7 @@ exclude_file_name_regexp--sc_correct_id_types = \
|
||||
exclude_file_name_regexp--sc_m4_quote_check = m4/virt-lib.m4
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_include_public_headers_quote = \
|
||||
^(src/internal\.h$$|tools/wireshark/src/packet-libvirt.h$$)
|
||||
^src/internal\.h$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
|
||||
^(tools/|examples/|include/libvirt/(virterror|libvirt-(qemu|lxc))\.h$$)
|
||||
@@ -1177,27 +1041,3 @@ exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_getenv = \
|
||||
^tests/.*\.[ch]$$
|
||||
|
||||
exclude_file_name_regexp--sc_avoid_attribute_unused_in_header = \
|
||||
^src/util/virlog\.h$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations = \
|
||||
^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_empty_first_line = \
|
||||
^(README|daemon/THREADS\.txt|src/esx/README|docs/library.xen|tests/vmwareverdata/fusion-5.0.3.txt|tests/nodeinfodata/linux-raspberrypi/cpu/offline)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
||||
^tests/virpolkittest.c
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_devname = \
|
||||
^(tools/virsh.pod|cfg.mk|docs/.*)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_virXXXFree = \
|
||||
^(docs/|tests/|examples/|tools/|cfg.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
|
||||
^(cfg\.mk|src/util/virutil\.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_pthread_create = \
|
||||
^(cfg\.mk|src/util/virthread\.c|tests/.*)$$
|
||||
|
||||
329
configure.ac
329
configure.ac
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
dnl Copyright (C) 2005-2015 Red Hat, Inc.
|
||||
dnl Copyright (C) 2005-2014 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
@@ -16,7 +16,7 @@ dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
|
||||
AC_INIT([libvirt], [1.2.14], [libvir-list@redhat.com], [], [http://libvirt.org])
|
||||
AC_INIT([libvirt], [1.2.1], [libvir-list@redhat.com], [], [http://libvirt.org])
|
||||
AC_CONFIG_SRCDIR([src/libvirt.c])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
@@ -175,7 +175,6 @@ case $host in
|
||||
*-*-linux*) with_linux=yes ;;
|
||||
*-*-darwin*) with_osx=yes ;;
|
||||
*-*-freebsd*) with_freebsd=yes ;;
|
||||
*-*-mingw* | *-*-msvc* ) with_win=yes ;;
|
||||
esac
|
||||
|
||||
if test $with_linux = no; then
|
||||
@@ -195,11 +194,6 @@ fi
|
||||
AM_CONDITIONAL([WITH_LINUX], [test "$with_linux" = "yes"])
|
||||
AM_CONDITIONAL([WITH_FREEBSD], [test "$with_freebsd" = "yes"])
|
||||
|
||||
# We don't support the daemon yet
|
||||
if test "$with_win" = "yes" ; then
|
||||
with_libvirtd=no
|
||||
fi
|
||||
|
||||
# The daemon requires remote support. Likewise, if we are not using
|
||||
# RPC, we don't need several libraries.
|
||||
if test "$with_remote" = "no" ; then
|
||||
@@ -245,9 +239,7 @@ LIBVIRT_CHECK_SANLOCK
|
||||
LIBVIRT_CHECK_SASL
|
||||
LIBVIRT_CHECK_SELINUX
|
||||
LIBVIRT_CHECK_SSH2
|
||||
LIBVIRT_CHECK_SYSTEMD_DAEMON
|
||||
LIBVIRT_CHECK_UDEV
|
||||
LIBVIRT_CHECK_WIRESHARK
|
||||
LIBVIRT_CHECK_YAJL
|
||||
|
||||
AC_MSG_CHECKING([for CPUID instruction])
|
||||
@@ -276,23 +268,14 @@ dnl and various less common threadsafe functions
|
||||
AC_CHECK_FUNCS_ONCE([cfmakeraw fallocate geteuid getgid getgrnam_r \
|
||||
getmntent_r getpwuid_r getuid kill mmap newlocale posix_fallocate \
|
||||
posix_memalign prlimit regexec sched_getaffinity setgroups setns \
|
||||
setrlimit symlink sysctlbyname getifaddrs sched_setscheduler])
|
||||
setrlimit symlink sysctlbyname])
|
||||
|
||||
dnl Availability of pthread functions. Because of $LIB_PTHREAD, we
|
||||
dnl cannot use AC_CHECK_FUNCS_ONCE. LIB_PTHREAD and LIBMULTITHREAD
|
||||
dnl were set during gl_INIT by gnulib.
|
||||
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.
|
||||
old_LIBS=$LIBS
|
||||
LIBS="$LIBS $LIB_PTHREAD $LIBMULTITHREAD"
|
||||
|
||||
pthread_found=yes
|
||||
AC_CHECK_FUNCS([pthread_mutexattr_init])
|
||||
AC_CHECK_HEADER([pthread.h],,[pthread_found=no])
|
||||
|
||||
if test "$ac_cv_func_pthread_mutexattr_init:$pthread_found" != "yes:yes"
|
||||
then
|
||||
AC_MSG_ERROR([A pthreads impl is required for building libvirt])
|
||||
fi
|
||||
|
||||
dnl At least mingw64-winpthreads #defines pthread_sigmask to 0,
|
||||
dnl which in turn causes compilation to complain about unused variables.
|
||||
dnl Expose this broken implementation, so we can work around it.
|
||||
@@ -302,10 +285,8 @@ AC_CACHE_CHECK([whether pthread_sigmask does anything],
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
]], [[
|
||||
#ifdef pthread_sigmask
|
||||
int (*foo)(int, const sigset_t *, sigset_t *) = &pthread_sigmask;
|
||||
return !foo;
|
||||
#endif
|
||||
int (*foo)(int, const sigset_t *, sigset_t *) = &pthread_sigmask;
|
||||
return !foo;
|
||||
]])], [lv_cv_pthread_sigmask_works=yes], [lv_cv_pthread_sigmask_works=no])])
|
||||
if test "x$lv_cv_pthread_sigmask_works" != xyes; then
|
||||
AC_DEFINE([FUNC_PTHREAD_SIGMASK_BROKEN], [1],
|
||||
@@ -384,11 +365,6 @@ AC_CHECK_TYPE([struct ifreq],
|
||||
#include <net/if.h>
|
||||
]])
|
||||
|
||||
AC_CHECK_DECLS([ETH_FLAG_TXVLAN, ETH_FLAG_NTUPLE, ETH_FLAG_RXHASH, ETH_FLAG_LRO,
|
||||
ETHTOOL_GGSO, ETHTOOL_GGRO, ETHTOOL_GFLAGS],
|
||||
[], [], [[#include <linux/ethtool.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
|
||||
dnl header could be found.
|
||||
@@ -415,8 +391,6 @@ dnl External programs that we can use if they are available.
|
||||
dnl We will hard-code paths to these programs unless we cannot
|
||||
dnl detect them, in which case we'll search for the program
|
||||
dnl along the $PATH at runtime and fail if it's not there.
|
||||
AC_PATH_PROG([DMIDECODE], [dmidecode], [dmidecode],
|
||||
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
|
||||
AC_PATH_PROG([DNSMASQ], [dnsmasq], [dnsmasq],
|
||||
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
|
||||
AC_PATH_PROG([RADVD], [radvd], [radvd],
|
||||
@@ -429,27 +403,17 @@ 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([RMMOD], [rmmod], [rmmod],
|
||||
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
|
||||
AC_PATH_PROG([MMCTL], [mm-ctl], [mm-ctl],
|
||||
[/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],
|
||||
[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
|
||||
AC_PATH_PROG([ADDR2LINE], [addr2line], [addr2line],
|
||||
[/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:$PATH])
|
||||
|
||||
AC_DEFINE_UNQUOTED([DMIDECODE],["$DMIDECODE"],
|
||||
[Location or name of the dmidecode program])
|
||||
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([TC],["$TC"],
|
||||
[Location or name of the tc program (see iproute2)])
|
||||
AC_DEFINE_UNQUOTED([MMCTL],["$MMCTL"],
|
||||
[Location or name of the mm-ctl program])
|
||||
[Location or name of the tc profram (see iproute2)])
|
||||
AC_DEFINE_UNQUOTED([OVSVSCTL],["$OVSVSCTL"],
|
||||
[Location or name of the ovs-vsctl program])
|
||||
|
||||
@@ -465,14 +429,8 @@ if test -n "$MODPROBE"; then
|
||||
AC_DEFINE_UNQUOTED([MODPROBE],["$MODPROBE"],
|
||||
[Location or name of the modprobe program])
|
||||
fi
|
||||
if test -n "$RMMOD"; then
|
||||
AC_DEFINE_UNQUOTED([RMMOD],["$RMMOD"],
|
||||
[Location or name of the rmmod program])
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([SCRUB],["$SCRUB"],
|
||||
[Location or name of the scrub program (for wiping algorithms)])
|
||||
AC_DEFINE_UNQUOTED([ADDR2LINE],["$ADDR2LINE"],
|
||||
[Location of addr2line program])
|
||||
|
||||
dnl Specific dir for HTML output ?
|
||||
AC_ARG_WITH([html-dir], [AS_HELP_STRING([--with-html-dir=path],
|
||||
@@ -579,10 +537,6 @@ AC_ARG_WITH([chrdev-lock-files],
|
||||
[location for UUCP style lock files for character devices
|
||||
(use auto for default paths on some platforms) @<:@default=auto@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_chrdev_lock_files=auto])
|
||||
AC_ARG_WITH([pm-utils],
|
||||
[AS_HELP_STRING([--with-pm-utils],
|
||||
[use pm-utils for power management @<:@default=yes@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_pm_utils=check])
|
||||
|
||||
dnl
|
||||
dnl in case someone want to build static binaries
|
||||
@@ -873,37 +827,24 @@ old_LIBS="$LIBS"
|
||||
old_CFLAGS="$CFLAGS"
|
||||
LIBXL_LIBS=""
|
||||
LIBXL_CFLAGS=""
|
||||
LIBXL_FIRMWARE_DIR=""
|
||||
LIBXL_EXECBIN_DIR=""
|
||||
|
||||
dnl search for libxl, aka libxenlight
|
||||
dnl Xen > 4.5 introduced a pkgconfig file, check for it first
|
||||
fail=0
|
||||
if test "$with_libxl" != "no" ; then
|
||||
PKG_CHECK_MODULES([LIBXL], [xenlight], [
|
||||
LIBXL_FIRMWARE_DIR=`$PKG_CONFIG --variable xenfirmwaredir xenlight`
|
||||
LIBXL_EXECBIN_DIR=`$PKG_CONFIG --variable libexec_bin xenlight`
|
||||
LIBXL_LIBS="$LIBXL_LIBS -lxenctrl"
|
||||
with_libxl=yes
|
||||
], [LIBXL_FOUND=no])
|
||||
if test "$LIBXL_FOUND" = "no"; then
|
||||
dnl No xenlight pkg-config file
|
||||
if test "$with_libxl" != "yes" && test "$with_libxl" != "check" ; then
|
||||
LIBXL_CFLAGS="-I$with_libxl/include"
|
||||
LIBXL_LIBS="-L$with_libxl"
|
||||
fi
|
||||
CFLAGS="$CFLAGS $LIBXL_CFLAGS"
|
||||
LIBS="$LIBS $LIBXL_LIBS"
|
||||
AC_CHECK_LIB([xenlight], [libxl_ctx_alloc], [
|
||||
with_libxl=yes
|
||||
LIBXL_LIBS="$LIBXL_LIBS -lxenlight -lxenctrl"
|
||||
],[
|
||||
if test "$with_libxl" = "yes"; then
|
||||
fail=1
|
||||
fi
|
||||
with_libxl=no
|
||||
])
|
||||
if test "$with_libxl" != "yes" && test "$with_libxl" != "check" ; then
|
||||
LIBXL_CFLAGS="-I$with_libxl/include"
|
||||
LIBXL_LIBS="-L$with_libxl"
|
||||
fi
|
||||
CFLAGS="$CFLAGS $LIBXL_CFLAGS"
|
||||
LIBS="$LIBS $LIBXL_LIBS"
|
||||
AC_CHECK_LIB([xenlight], [libxl_ctx_alloc], [
|
||||
with_libxl=yes
|
||||
LIBXL_LIBS="$LIBXL_LIBS -lxenlight -lxenctrl"
|
||||
],[
|
||||
if test "$with_libxl" = "yes"; then
|
||||
fail=1
|
||||
fi
|
||||
with_libxl=no
|
||||
])
|
||||
fi
|
||||
|
||||
LIBS="$old_LIBS"
|
||||
@@ -914,16 +855,7 @@ if test $fail = 1; then
|
||||
fi
|
||||
|
||||
if test "$with_libxl" = "yes"; then
|
||||
dnl If building with libxl, use the libxl utility header and lib too
|
||||
AC_CHECK_HEADERS([libxlutil.h])
|
||||
LIBXL_LIBS="$LIBXL_LIBS -lxlutil"
|
||||
AC_DEFINE_UNQUOTED([WITH_LIBXL], 1, [whether libxenlight driver is enabled])
|
||||
if test "x$LIBXL_FIRMWARE_DIR" != "x"; then
|
||||
AC_DEFINE_UNQUOTED([LIBXL_FIRMWARE_DIR], ["$LIBXL_FIRMWARE_DIR"], [directory containing Xen firmware blobs])
|
||||
fi
|
||||
if test "x$LIBXL_EXECBIN_DIR" != "x"; then
|
||||
AC_DEFINE_UNQUOTED([LIBXL_EXECBIN_DIR], ["$LIBXL_EXECBIN_DIR"], [directory containing Xen libexec binaries])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_LIBXL], [test "$with_libxl" = "yes"])
|
||||
|
||||
@@ -999,7 +931,7 @@ AM_CONDITIONAL([WITH_XEN], [test "$with_xen" = "yes"])
|
||||
AC_SUBST([XEN_CFLAGS])
|
||||
AC_SUBST([XEN_LIBS])
|
||||
|
||||
AM_CONDITIONAL([WITH_XENCONFIG], [test "$with_libxl" = "yes" || test "$with_xen" = "yes"])
|
||||
AM_CONDITIONAL([WITH_XENXS], [test "$with_libxl" = "yes" || test "$with_xen" = "yes"])
|
||||
|
||||
dnl
|
||||
dnl check for kernel headers required by xen_inotify
|
||||
@@ -1078,30 +1010,22 @@ dnl
|
||||
dnl Checks for the Parallels driver
|
||||
dnl
|
||||
|
||||
|
||||
if test "$with_parallels" = "yes" ||
|
||||
test "$with_parallels" = "check"; then
|
||||
PKG_CHECK_MODULES([PARALLELS_SDK], [parallels-sdk],
|
||||
[PARALLELS_SDK_FOUND=yes], [PARALLELS_SDK_FOUND=no])
|
||||
|
||||
if test "$with_parallels" = "yes" && test "$PARALLELS_SDK_FOUND" = "no"; then
|
||||
AC_MSG_ERROR([Parallels Virtualization SDK is needed to build the Parallels driver.])
|
||||
fi
|
||||
|
||||
with_parallels=$PARALLELS_SDK_FOUND
|
||||
if test "$with_parallels" = "yes"; then
|
||||
AC_DEFINE_UNQUOTED([WITH_PARALLELS], 1,
|
||||
[whether Parallels driver is enabled])
|
||||
if test "$with_parallels" = "check"; then
|
||||
with_parallels=$with_linux
|
||||
if test ! $host_cpu = 'x86_64'; then
|
||||
with_parallels=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$with_parallels" = "yes" && test "$with_linux" = "no"; then
|
||||
AC_MSG_ERROR([The Parallels driver can be enabled on Linux only.])
|
||||
fi
|
||||
|
||||
if test "$with_parallels" = "yes"; then
|
||||
AC_DEFINE_UNQUOTED([WITH_PARALLELS], 1, [whether Parallels driver is enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_PARALLELS], [test "$with_parallels" = "yes"])
|
||||
|
||||
dnl
|
||||
dnl Checks for bhyve driver
|
||||
dnl
|
||||
|
||||
LIBVIRT_DRIVER_CHECK_BHYVE
|
||||
|
||||
dnl
|
||||
dnl check for shell that understands <> redirection without truncation,
|
||||
dnl needed by src/qemu/qemu_monitor_{text,json}.c.
|
||||
@@ -1421,7 +1345,7 @@ AC_ARG_WITH([firewalld],
|
||||
if test "x$with_firewalld" = "xcheck" ; then
|
||||
with_firewalld=$with_dbus
|
||||
fi
|
||||
if test "x$with_firewalld" = "xyes" ; then
|
||||
if test "x$with_firewalld" == "xyes" ; then
|
||||
if test "x$with_dbus" != "xyes" ; then
|
||||
AC_MSG_ERROR([You must have dbus enabled for firewalld support])
|
||||
fi
|
||||
@@ -1445,10 +1369,8 @@ if test "$with_chrdev_lock_files" != "no"; then
|
||||
AC_MSG_ERROR([You must specify path for the lock files on this
|
||||
platform])
|
||||
fi
|
||||
if test "$with_chrdev_lock_files" != "no"; then
|
||||
AC_DEFINE_UNQUOTED([VIR_CHRDEV_LOCK_FILE_PATH], "$with_chrdev_lock_files",
|
||||
[path to directory containing UUCP device lock files])
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([VIR_CHRDEV_LOCK_FILE_PATH], "$with_chrdev_lock_files",
|
||||
[path to directory containing UUCP device lock files])
|
||||
fi
|
||||
AM_CONDITIONAL([VIR_CHRDEV_LOCK_FILE_PATH], [test "$with_chrdev_lock_files" != "no"])
|
||||
|
||||
@@ -1665,23 +1587,6 @@ fi
|
||||
|
||||
AM_CONDITIONAL([WITH_PHYP],[test "$with_phyp" = "yes"])
|
||||
|
||||
dnl
|
||||
dnl Should we build with pm-utils support?
|
||||
dnl
|
||||
if test "$with_pm_utils" = "check"; then
|
||||
with_pm_utils=yes
|
||||
if test "$with_dbus" = "yes"; then
|
||||
if test "$init_systemd" = "yes"; then
|
||||
with_pm_utils=no
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$with_pm_utils" = "yes"; then
|
||||
AC_DEFINE_UNQUOTED([WITH_PM_UTILS], 1, [whether to use pm-utils])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_PM_UTILS], [test "$with_pm_utils" = "yes"])
|
||||
|
||||
dnl virsh libraries
|
||||
VIRSH_LIBS="$VIRSH_LIBS $READLINE_LIBS"
|
||||
AC_SUBST([VIRSH_LIBS])
|
||||
@@ -1768,10 +1673,6 @@ AC_ARG_WITH([storage-gluster],
|
||||
[AS_HELP_STRING([--with-storage-gluster],
|
||||
[with Gluster backend for the storage driver @<:@default=check@:>@])],
|
||||
[],[with_storage_gluster=check])
|
||||
AC_ARG_WITH([storage-zfs],
|
||||
[AS_HELP_STRING([--with-storage-zfs],
|
||||
[with ZFS backend for the storage driver @<:@default=check@:>@])],
|
||||
[],[with_storage_zfs=check])
|
||||
|
||||
if test "$with_libvirtd" = "no"; then
|
||||
with_storage_dir=no
|
||||
@@ -1784,7 +1685,6 @@ if test "$with_libvirtd" = "no"; then
|
||||
with_storage_rbd=no
|
||||
with_storage_sheepdog=no
|
||||
with_storage_gluster=no
|
||||
with_storage_zfs=no
|
||||
fi
|
||||
if test "$with_storage_dir" = "yes" ; then
|
||||
AC_DEFINE_UNQUOTED([WITH_STORAGE_DIR], 1, [whether directory backend for storage driver is enabled])
|
||||
@@ -1918,12 +1818,8 @@ if test "$with_storage_iscsi" = "yes" || test "$with_storage_iscsi" = "check"; t
|
||||
|
||||
if test "$with_storage_iscsi" = "yes" ; then
|
||||
AC_DEFINE_UNQUOTED([WITH_STORAGE_ISCSI], 1, [whether iSCSI backend for storage driver is enabled])
|
||||
fi
|
||||
fi
|
||||
if test -z "$ISCIADM" ; then
|
||||
AC_DEFINE_UNQUOTED([ISCSIADM],["iscsiadm"],[Name of iscsiadm program])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED([ISCSIADM],["$ISCSIADM"],[Location of iscsiadm program])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_ISCSI], [test "$with_storage_iscsi" = "yes"])
|
||||
|
||||
@@ -1990,6 +1886,7 @@ fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_SHEEPDOG],
|
||||
[test "$with_storage_sheepdog" = "yes"])
|
||||
|
||||
LIBGLUSTER_LIBS=
|
||||
if test "$with_storage_gluster" = "check"; then
|
||||
with_storage_gluster=$with_glusterfs
|
||||
fi
|
||||
@@ -2002,51 +1899,6 @@ if test "$with_storage_gluster" = "yes"; then
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_GLUSTER], [test "$with_storage_gluster" = "yes"])
|
||||
|
||||
if test "$with_storage_zfs" = "check"; then
|
||||
with_storage_zfs=$with_freebsd
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "yes" && test "$with_freebsd" = "no"; then
|
||||
AC_MSG_ERROR([The ZFS storage driver can be enabled on FreeBSD only.])
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "yes" ||
|
||||
test "$with_storage_zfs" = "check"; then
|
||||
AC_PATH_PROG([ZFS], [zfs], [], [$PATH:/sbin:/usr/sbin])
|
||||
AC_PATH_PROG([ZPOOL], [zpool], [], [$PATH:/sbin:/usr/sbin])
|
||||
|
||||
if test "$with_storage_zfs" = "yes"; then
|
||||
if test -z "$ZFS" || test -z "$ZPOOL"; then
|
||||
AC_MSG_ERROR([We need zfs and zpool for ZFS storage driver])
|
||||
fi
|
||||
else
|
||||
if test -z "$ZFS" || test -z "$ZPOOL"; then
|
||||
with_storage_zfs=no
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "check"; then
|
||||
with_storage_zfs=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "yes"; then
|
||||
AC_DEFINE_UNQUOTED([WITH_STORAGE_ZFS], 1,
|
||||
[whether ZFS backend for storage driver is enabled])
|
||||
AC_DEFINE_UNQUOTED([ZFS], ["$ZFS"], [Location of zfs program])
|
||||
AC_DEFINE_UNQUOTED([ZPOOL], ["$ZPOOL"], [Location of zpool program])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_ZFS],
|
||||
[test "$with_storage_zfs" = "yes"])
|
||||
|
||||
if test "$with_storage_fs" = "yes" ||
|
||||
test "$with_storage_gluster" = "yes"; then
|
||||
AC_PATH_PROG([GLUSTER_CLI], [gluster], [], [$PATH:/sbin:/usr/sbin])
|
||||
if test "x$GLUSTER_CLI" != "x"; then
|
||||
AC_DEFINE_UNQUOTED([GLUSTER_CLI], ["$GLUSTER_CLI"],
|
||||
[Location or name of the gluster command line tool])
|
||||
fi
|
||||
fi
|
||||
|
||||
LIBPARTED_CFLAGS=
|
||||
LIBPARTED_LIBS=
|
||||
@@ -2204,19 +2056,9 @@ fi
|
||||
AM_CONDITIONAL([WITH_HYPERV], [test "$with_hyperv" = "yes"])
|
||||
|
||||
|
||||
dnl
|
||||
dnl check for kernel headers required by btrfs ioctl
|
||||
dnl
|
||||
if test "$with_linux" = "yes"; then
|
||||
AC_CHECK_HEADERS([linux/btrfs.h])
|
||||
fi
|
||||
|
||||
dnl Allow perl/python overrides
|
||||
AC_PATH_PROGS([PYTHON], [python2 python])
|
||||
AC_PATH_PROG([PERL], [perl])
|
||||
if test -z "$PERL"; then
|
||||
AC_MSG_ERROR([Failed to find perl.])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH([test-suite],
|
||||
[AS_HELP_STRING([--with-test-suite],
|
||||
@@ -2608,8 +2450,6 @@ if test "$with_virtualport" != "no"; then
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_VIRTUALPORT], [test "$with_virtualport" = "yes"])
|
||||
|
||||
dnl GET_VLAN_VID_CMD is required for virNetDevGetVLanID
|
||||
AC_CHECK_DECLS([GET_VLAN_VID_CMD], [], [], [[#include <linux/if_vlan.h>]])
|
||||
|
||||
dnl netlink library
|
||||
|
||||
@@ -2652,11 +2492,7 @@ if test "$with_linux" = "yes"; then
|
||||
[whether the netlink v1 library is available])
|
||||
], [
|
||||
if test "$with_macvtap" = "yes"; then
|
||||
if test "$LIBNL_REQUIRED" = "3.0";then
|
||||
AC_MSG_ERROR([libnl3-devel >= $LIBNL_REQUIRED is required for macvtap support])
|
||||
else
|
||||
AC_MSG_ERROR([libnl-devel >= $LIBNL_REQUIRED is required for macvtap support])
|
||||
fi
|
||||
AC_MSG_ERROR([libnl-devel >= $LIBNL_REQUIRED is required for macvtap support])
|
||||
fi
|
||||
])
|
||||
fi
|
||||
@@ -2669,8 +2505,7 @@ AC_SUBST([LIBNL_LIBS])
|
||||
# Check for Linux vs. BSD ifreq members
|
||||
AC_CHECK_MEMBERS([struct ifreq.ifr_newname,
|
||||
struct ifreq.ifr_ifindex,
|
||||
struct ifreq.ifr_index,
|
||||
struct ifreq.ifr_hwaddr],
|
||||
struct ifreq.ifr_index],
|
||||
[], [],
|
||||
[#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
@@ -2701,34 +2536,6 @@ AC_CHECK_DECLS([BRDGSFD, BRDGADD, BRDGDEL],
|
||||
#include <net/if_bridgevar.h>
|
||||
])
|
||||
|
||||
# Check for BSD CPU affinity availability
|
||||
AC_CHECK_DECLS([cpuset_getaffinity],
|
||||
[AC_DEFINE([HAVE_BSD_CPU_AFFINITY],
|
||||
[1],
|
||||
[whether BSD CPU affinity management is available])],
|
||||
[],
|
||||
[#include <sys/param.h>
|
||||
#include <sys/cpuset.h>
|
||||
])
|
||||
|
||||
# Check for BSD kvm (kernel memory interface)
|
||||
if test $with_freebsd = yes; then
|
||||
AC_CHECK_LIB([kvm], [kvm_getprocs], [],
|
||||
[AC_MSG_ERROR([BSD kernel memory interface library is required to build on FreeBSD])]
|
||||
)
|
||||
fi
|
||||
|
||||
# FreeBSD 10-STABLE requires _IFI_OQDROPS to be defined for if_data.ifi_oqdrops
|
||||
# field be available
|
||||
old_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -D_IFI_OQDROPS"
|
||||
|
||||
AC_CHECK_MEMBERS([struct if_data.ifi_oqdrops],
|
||||
[],
|
||||
[CFLAGS="$old_CFLAGS"],
|
||||
[#include <net/if.h>
|
||||
])
|
||||
|
||||
# Check if we need to look for ifconfig
|
||||
if test "$want_ifconfig" = "yes"; then
|
||||
AC_PATH_PROG([IFCONFIG_PATH], [ifconfig])
|
||||
@@ -2753,31 +2560,6 @@ test "x$lv_cv_static_analysis" = xyes && t=1
|
||||
AC_DEFINE_UNQUOTED([STATIC_ANALYSIS], [$t],
|
||||
[Define to 1 when performing static analysis.])
|
||||
|
||||
AC_ARG_WITH([default-editor],
|
||||
[AS_HELP_STRING([--with-default-editor],
|
||||
[Editor to use for interactive commands
|
||||
@<:@default=vi@:>@])],
|
||||
[DEFAULT_EDITOR=${withval}],
|
||||
[DEFAULT_EDITOR=vi])
|
||||
AC_DEFINE_UNQUOTED([DEFAULT_EDITOR], ["$DEFAULT_EDITOR"], [Default editor to use])
|
||||
|
||||
AC_ARG_WITH([loader-nvram],
|
||||
[AS_HELP_STRING([--with-loader-nvram],
|
||||
[Pass list of pairs of <loader>:<nvram> paths. Both
|
||||
pairs and list items are separated by a colon.
|
||||
@<:default=paths to OVMF and its clones@:>@])],
|
||||
[if test "$withval" = "no"; then
|
||||
withval=""
|
||||
else
|
||||
l=`echo $withval | tr ':' '\n' | wc -l`
|
||||
if test "`expr $l % 2`" -ne 0; then
|
||||
AC_MSG_ERROR([Malformed --with-loader-nvram argument])
|
||||
fi
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([DEFAULT_LOADER_NVRAM],
|
||||
["$withval"],
|
||||
[List of laoder:nvram pairs])])
|
||||
|
||||
# Some GNULIB base64 symbols clash with a kerberos library
|
||||
AC_DEFINE_UNQUOTED([isbase64],[libvirt_gl_isbase64],[Hack to avoid symbol clash])
|
||||
AC_DEFINE_UNQUOTED([base64_encode],[libvirt_gl_base64_encode],[Hack to avoid symbol clash])
|
||||
@@ -2790,13 +2572,7 @@ AC_CONFIG_FILES([\
|
||||
docs/schemas/Makefile \
|
||||
gnulib/lib/Makefile \
|
||||
gnulib/tests/Makefile \
|
||||
libvirt.pc \
|
||||
libvirt-qemu.pc \
|
||||
libvirt-lxc.pc \
|
||||
src/libvirt.pc \
|
||||
src/libvirt-qemu.pc \
|
||||
src/libvirt-lxc.pc \
|
||||
libvirt.spec mingw-libvirt.spec \
|
||||
libvirt.pc libvirt.spec mingw-libvirt.spec \
|
||||
po/Makefile.in \
|
||||
include/libvirt/Makefile include/libvirt/libvirt.h \
|
||||
daemon/Makefile \
|
||||
@@ -2806,15 +2582,10 @@ AC_CONFIG_FILES([\
|
||||
examples/object-events/Makefile \
|
||||
examples/domsuspend/Makefile \
|
||||
examples/dominfo/Makefile \
|
||||
examples/dommigrate/Makefile \
|
||||
examples/domtop/Makefile \
|
||||
examples/openauth/Makefile \
|
||||
examples/hellolibvirt/Makefile \
|
||||
examples/systemtap/Makefile \
|
||||
examples/xml/nwfilter/Makefile \
|
||||
examples/lxcconvert/Makefile \
|
||||
tools/wireshark/Makefile \
|
||||
tools/wireshark/src/Makefile])
|
||||
examples/xml/nwfilter/Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
AC_MSG_NOTICE([])
|
||||
@@ -2836,7 +2607,6 @@ AC_MSG_NOTICE([ PHYP: $with_phyp])
|
||||
AC_MSG_NOTICE([ ESX: $with_esx])
|
||||
AC_MSG_NOTICE([ Hyper-V: $with_hyperv])
|
||||
AC_MSG_NOTICE([Parallels: $with_parallels])
|
||||
LIBVIRT_DRIVER_RESULT_BHYVE
|
||||
AC_MSG_NOTICE([ Test: $with_test])
|
||||
AC_MSG_NOTICE([ Remote: $with_remote])
|
||||
AC_MSG_NOTICE([ Network: $with_network])
|
||||
@@ -2858,7 +2628,6 @@ AC_MSG_NOTICE([ Disk: $with_storage_disk])
|
||||
AC_MSG_NOTICE([ RBD: $with_storage_rbd])
|
||||
AC_MSG_NOTICE([Sheepdog: $with_storage_sheepdog])
|
||||
AC_MSG_NOTICE([ Gluster: $with_storage_gluster])
|
||||
AC_MSG_NOTICE([ ZFS: $with_storage_zfs])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Security Drivers])
|
||||
AC_MSG_NOTICE([])
|
||||
@@ -2895,9 +2664,7 @@ LIBVIRT_RESULT_SANLOCK
|
||||
LIBVIRT_RESULT_SASL
|
||||
LIBVIRT_RESULT_SELINUX
|
||||
LIBVIRT_RESULT_SSH2
|
||||
LIBVIRT_RESULT_SYSTEMD_DAEMON
|
||||
LIBVIRT_RESULT_UDEV
|
||||
LIBVIRT_RESULT_WIRESHARK
|
||||
LIBVIRT_RESULT_YAJL
|
||||
AC_MSG_NOTICE([ libxml: $LIBXML_CFLAGS $LIBXML_LIBS])
|
||||
AC_MSG_NOTICE([ dlopen: $DLOPEN_LIBS])
|
||||
@@ -2961,7 +2728,6 @@ AC_MSG_NOTICE([ rbd: $LIBRBD_LIBS])
|
||||
else
|
||||
AC_MSG_NOTICE([ rbd: no])
|
||||
fi
|
||||
AC_MSG_NOTICE([pm-utils: $with_pm_utils])
|
||||
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Test suite])
|
||||
@@ -2979,11 +2745,6 @@ 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([Char device locks: $with_chrdev_lock_files])
|
||||
AC_MSG_NOTICE([ Default Editor: $DEFAULT_EDITOR])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Developer Tools])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Wireshark dissector: $with_wireshark_dissector])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Privileges])
|
||||
AC_MSG_NOTICE([])
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
## Copyright (C) 2005-2014 Red Hat, Inc.
|
||||
## Copyright (C) 2005-2013 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
|
||||
@@ -55,7 +55,6 @@ EXTRA_DIST = \
|
||||
libvirtd.policy.in \
|
||||
libvirtd.sasl \
|
||||
libvirtd.service.in \
|
||||
libvirtd.socket.in \
|
||||
libvirtd.sysconf \
|
||||
libvirtd.sysctl \
|
||||
libvirtd.aug \
|
||||
@@ -141,7 +140,7 @@ libvirtd_SOURCES = $(DAEMON_SOURCES)
|
||||
#-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L
|
||||
libvirtd_CFLAGS = \
|
||||
$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \
|
||||
$(XDR_CFLAGS) $(DBUS_CFLAGS) $(LIBNL_CFLAGS) \
|
||||
$(XDR_CFLAGS) $(POLKIT_CFLAGS) $(DBUS_CFLAGS) $(LIBNL_CFLAGS) \
|
||||
$(WARN_CFLAGS) $(PIE_CFLAGS) \
|
||||
$(COVERAGE_CFLAGS) \
|
||||
-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\""
|
||||
@@ -158,6 +157,7 @@ libvirtd_LDADD = \
|
||||
$(GNUTLS_LIBS) \
|
||||
$(SASL_LIBS) \
|
||||
$(DBUS_LIBS) \
|
||||
$(POLKIT_LIBS) \
|
||||
$(LIBNL_LIBS)
|
||||
|
||||
if WITH_DTRACE_PROBES
|
||||
@@ -387,19 +387,16 @@ endif ! LIBVIRT_INIT_SCRIPT_UPSTART
|
||||
|
||||
if LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||
|
||||
SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
|
||||
BUILT_SOURCES += libvirtd.service libvirtd.socket
|
||||
SYSTEMD_UNIT_DIR = /lib/systemd/system
|
||||
BUILT_SOURCES += libvirtd.service
|
||||
|
||||
install-init-systemd: install-sysconfig libvirtd.service libvirtd.socket
|
||||
install-init-systemd: install-sysconfig libvirtd.service
|
||||
$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
|
||||
$(INSTALL_DATA) libvirtd.service \
|
||||
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||
$(INSTALL_DATA) libvirtd.socket \
|
||||
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket
|
||||
|
||||
uninstall-init-systemd: uninstall-sysconfig
|
||||
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket
|
||||
rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
|
||||
else ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||
install-init-systemd:
|
||||
@@ -423,12 +420,6 @@ libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
|
||||
libvirtd.socket: libvirtd.socket.in $(top_builddir)/config.status
|
||||
$(AM_V_GEN)sed \
|
||||
-e 's|[@]runstatedir[@]|$(runstatedir)|g' \
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
|
||||
|
||||
check-local: check-augeas
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libvirtd-config.c: daemon start of day, guest process & i/o management
|
||||
* libvirtd.c: daemon start of day, guest process & i/o management
|
||||
*
|
||||
* Copyright (C) 2006-2012, 2014 Red Hat, Inc.
|
||||
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||
* Copyright (C) 2006 Daniel P. Berrange
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -37,8 +37,6 @@
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_CONF
|
||||
|
||||
VIR_LOG_INIT("daemon.libvirtd-config");
|
||||
|
||||
/* Allocate an array of malloc'd strings from the config file, filename
|
||||
* (used only in diagnostics), using handle "conf". Upon error, return -1
|
||||
* and free any allocated memory. Otherwise, save the array in *list_arg
|
||||
@@ -123,8 +121,8 @@ checkType(virConfValuePtr p, const char *filename,
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("remoteReadConfigFile: %s: %s: invalid type:"
|
||||
" got %s; expected %s"), filename, key,
|
||||
virConfTypeToString(p->type),
|
||||
virConfTypeToString(required_type));
|
||||
virConfTypeName(p->type),
|
||||
virConfTypeName(required_type));
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
@@ -146,37 +144,19 @@ checkType(virConfValuePtr p, const char *filename,
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Like GET_CONF_STR, but for signed integral values. */
|
||||
/* Like GET_CONF_STR, but for integral values. */
|
||||
#define GET_CONF_INT(conf, filename, var_name) \
|
||||
do { \
|
||||
virConfValuePtr p = virConfGetValue(conf, #var_name); \
|
||||
if (p) { \
|
||||
if (p->type != VIR_CONF_ULONG && \
|
||||
checkType(p, filename, #var_name, VIR_CONF_LONG) < 0) \
|
||||
goto error; \
|
||||
data->var_name = p->l; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Like GET_CONF_STR, but for unsigned integral values. */
|
||||
#define GET_CONF_UINT(conf, filename, var_name) \
|
||||
do { \
|
||||
virConfValuePtr p = virConfGetValue(conf, #var_name); \
|
||||
if (p) { \
|
||||
if (checkType(p, filename, #var_name, VIR_CONF_ULONG) < 0) \
|
||||
if (checkType(p, filename, #var_name, VIR_CONF_LONG) < 0) \
|
||||
goto error; \
|
||||
data->var_name = p->l; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
static int
|
||||
remoteConfigGetAuth(virConfPtr conf,
|
||||
const char *key,
|
||||
int *auth,
|
||||
const char *filename)
|
||||
{
|
||||
static int remoteConfigGetAuth(virConfPtr conf, const char *key, int *auth, const char *filename) {
|
||||
virConfValuePtr p;
|
||||
|
||||
p = virConfGetValue(conf, key);
|
||||
@@ -228,7 +208,7 @@ daemonConfigFilePath(bool privileged, char **configfile)
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -278,14 +258,15 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
|
||||
|
||||
data->min_workers = 5;
|
||||
data->max_workers = 20;
|
||||
data->max_clients = 5000;
|
||||
data->max_anonymous_clients = 20;
|
||||
data->max_clients = 20;
|
||||
|
||||
data->prio_workers = 5;
|
||||
|
||||
data->max_requests = 20;
|
||||
data->max_client_requests = 5;
|
||||
|
||||
data->log_buffer_size = 64;
|
||||
|
||||
data->audit_level = 1;
|
||||
data->audit_logging = 0;
|
||||
|
||||
@@ -314,7 +295,7 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
|
||||
|
||||
return data;
|
||||
|
||||
error:
|
||||
error:
|
||||
daemonConfigFree(data);
|
||||
return NULL;
|
||||
}
|
||||
@@ -374,8 +355,8 @@ daemonConfigLoadOptions(struct daemonConfig *data,
|
||||
const char *filename,
|
||||
virConfPtr conf)
|
||||
{
|
||||
GET_CONF_UINT(conf, filename, listen_tcp);
|
||||
GET_CONF_UINT(conf, filename, listen_tls);
|
||||
GET_CONF_INT(conf, filename, listen_tcp);
|
||||
GET_CONF_INT(conf, filename, listen_tls);
|
||||
GET_CONF_STR(conf, filename, tls_port);
|
||||
GET_CONF_STR(conf, filename, tcp_port);
|
||||
GET_CONF_STR(conf, filename, listen_addr);
|
||||
@@ -409,11 +390,11 @@ daemonConfigLoadOptions(struct daemonConfig *data,
|
||||
|
||||
GET_CONF_STR(conf, filename, unix_sock_dir);
|
||||
|
||||
GET_CONF_UINT(conf, filename, mdns_adv);
|
||||
GET_CONF_INT(conf, filename, mdns_adv);
|
||||
GET_CONF_STR(conf, filename, mdns_name);
|
||||
|
||||
GET_CONF_UINT(conf, filename, tls_no_sanity_certificate);
|
||||
GET_CONF_UINT(conf, filename, tls_no_verify_certificate);
|
||||
GET_CONF_INT(conf, filename, tls_no_sanity_certificate);
|
||||
GET_CONF_INT(conf, filename, tls_no_verify_certificate);
|
||||
|
||||
GET_CONF_STR(conf, filename, key_file);
|
||||
GET_CONF_STR(conf, filename, cert_file);
|
||||
@@ -430,33 +411,33 @@ daemonConfigLoadOptions(struct daemonConfig *data,
|
||||
goto error;
|
||||
|
||||
|
||||
GET_CONF_UINT(conf, filename, min_workers);
|
||||
GET_CONF_UINT(conf, filename, max_workers);
|
||||
GET_CONF_UINT(conf, filename, max_clients);
|
||||
GET_CONF_UINT(conf, filename, max_queued_clients);
|
||||
GET_CONF_UINT(conf, filename, max_anonymous_clients);
|
||||
GET_CONF_INT(conf, filename, min_workers);
|
||||
GET_CONF_INT(conf, filename, max_workers);
|
||||
GET_CONF_INT(conf, filename, max_clients);
|
||||
GET_CONF_INT(conf, filename, max_queued_clients);
|
||||
|
||||
GET_CONF_UINT(conf, filename, prio_workers);
|
||||
GET_CONF_INT(conf, filename, prio_workers);
|
||||
|
||||
GET_CONF_INT(conf, filename, max_requests);
|
||||
GET_CONF_UINT(conf, filename, max_client_requests);
|
||||
GET_CONF_INT(conf, filename, max_client_requests);
|
||||
|
||||
GET_CONF_UINT(conf, filename, audit_level);
|
||||
GET_CONF_UINT(conf, filename, audit_logging);
|
||||
GET_CONF_INT(conf, filename, audit_level);
|
||||
GET_CONF_INT(conf, filename, audit_logging);
|
||||
|
||||
GET_CONF_STR(conf, filename, host_uuid);
|
||||
|
||||
GET_CONF_UINT(conf, filename, log_level);
|
||||
GET_CONF_INT(conf, filename, log_level);
|
||||
GET_CONF_STR(conf, filename, log_filters);
|
||||
GET_CONF_STR(conf, filename, log_outputs);
|
||||
GET_CONF_INT(conf, filename, log_buffer_size);
|
||||
|
||||
GET_CONF_INT(conf, filename, keepalive_interval);
|
||||
GET_CONF_UINT(conf, filename, keepalive_count);
|
||||
GET_CONF_UINT(conf, filename, keepalive_required);
|
||||
GET_CONF_INT(conf, filename, keepalive_count);
|
||||
GET_CONF_INT(conf, filename, keepalive_required);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* libvirtd-config.h: daemon start of day, guest process & i/o management
|
||||
* libvirtd.c: daemon start of day, guest process & i/o management
|
||||
*
|
||||
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||
* Copyright (C) 2006 Daniel P. Berrange
|
||||
@@ -64,7 +64,6 @@ struct daemonConfig {
|
||||
int max_workers;
|
||||
int max_clients;
|
||||
int max_queued_clients;
|
||||
int max_anonymous_clients;
|
||||
|
||||
int prio_workers;
|
||||
|
||||
@@ -74,6 +73,7 @@ struct daemonConfig {
|
||||
int log_level;
|
||||
char *log_filters;
|
||||
char *log_outputs;
|
||||
int log_buffer_size;
|
||||
|
||||
int audit_level;
|
||||
int audit_logging;
|
||||
|
||||
@@ -57,7 +57,6 @@ module Libvirtd =
|
||||
| int_entry "max_workers"
|
||||
| int_entry "max_clients"
|
||||
| int_entry "max_queued_clients"
|
||||
| int_entry "max_anonymous_clients"
|
||||
| int_entry "max_requests"
|
||||
| int_entry "max_client_requests"
|
||||
| int_entry "prio_workers"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libvirtd.c: daemon start of day, guest process & i/o management
|
||||
*
|
||||
* Copyright (C) 2006-2014 Red Hat, Inc.
|
||||
* Copyright (C) 2006-2012 Red Hat, Inc.
|
||||
* Copyright (C) 2006 Daniel P. Berrange
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "libvirt_internal.h"
|
||||
#include "virerror.h"
|
||||
#include "virfile.h"
|
||||
#include "virlog.h"
|
||||
#include "virpidfile.h"
|
||||
#include "virprocess.h"
|
||||
|
||||
@@ -56,7 +55,6 @@
|
||||
#include "virstring.h"
|
||||
#include "locking/lock_manager.h"
|
||||
#include "viraccessmanager.h"
|
||||
#include "virutil.h"
|
||||
|
||||
#ifdef WITH_DRIVER_MODULES
|
||||
# include "driver.h"
|
||||
@@ -79,9 +77,6 @@
|
||||
# ifdef WITH_VBOX
|
||||
# include "vbox/vbox_driver.h"
|
||||
# endif
|
||||
# ifdef WITH_BHYVE
|
||||
# include "bhyve/bhyve_driver.h"
|
||||
# endif
|
||||
# ifdef WITH_NETWORK
|
||||
# include "network/bridge_driver.h"
|
||||
# endif
|
||||
@@ -105,9 +100,6 @@
|
||||
#include "configmake.h"
|
||||
|
||||
#include "virdbus.h"
|
||||
#include "cpu/cpu_map.h"
|
||||
|
||||
VIR_LOG_INIT("daemon.libvirtd");
|
||||
|
||||
#if WITH_SASL
|
||||
virNetSASLContextPtr saslCtxt = NULL;
|
||||
@@ -163,9 +155,9 @@ static int daemonForkIntoBackground(const char *argv0)
|
||||
|
||||
VIR_FORCE_CLOSE(statuspipe[0]);
|
||||
|
||||
if ((stdinfd = open("/dev/null", O_RDONLY)) <= STDERR_FILENO)
|
||||
if ((stdinfd = open("/dev/null", O_RDONLY)) < 0)
|
||||
goto cleanup;
|
||||
if ((stdoutfd = open("/dev/null", O_WRONLY)) <= STDERR_FILENO)
|
||||
if ((stdoutfd = open("/dev/null", O_WRONLY)) < 0)
|
||||
goto cleanup;
|
||||
if (dup2(stdinfd, STDIN_FILENO) != STDIN_FILENO)
|
||||
goto cleanup;
|
||||
@@ -173,9 +165,9 @@ static int daemonForkIntoBackground(const char *argv0)
|
||||
goto cleanup;
|
||||
if (dup2(stdoutfd, STDERR_FILENO) != STDERR_FILENO)
|
||||
goto cleanup;
|
||||
if (VIR_CLOSE(stdinfd) < 0)
|
||||
if (stdinfd > STDERR_FILENO && VIR_CLOSE(stdinfd) < 0)
|
||||
goto cleanup;
|
||||
if (VIR_CLOSE(stdoutfd) < 0)
|
||||
if (stdoutfd > STDERR_FILENO && VIR_CLOSE(stdoutfd) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (setsid() < 0)
|
||||
@@ -211,7 +203,7 @@ static int daemonForkIntoBackground(const char *argv0)
|
||||
VIR_FORCE_CLOSE(statuspipe[1]);
|
||||
|
||||
/* We wait to make sure the first child forked successfully */
|
||||
if (virProcessWait(pid, NULL, false) < 0)
|
||||
if (virProcessWait(pid, NULL) < 0)
|
||||
goto error;
|
||||
|
||||
/* If we get here, then the grandchild was spawned, so we
|
||||
@@ -243,13 +235,48 @@ static int daemonForkIntoBackground(const char *argv0)
|
||||
}
|
||||
}
|
||||
|
||||
error:
|
||||
error:
|
||||
VIR_FORCE_CLOSE(statuspipe[0]);
|
||||
VIR_FORCE_CLOSE(statuspipe[1]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
daemonPidFilePath(bool privileged,
|
||||
char **pidfile)
|
||||
{
|
||||
if (privileged) {
|
||||
if (VIR_STRDUP(*pidfile, LOCALSTATEDIR "/run/libvirtd.pid") < 0)
|
||||
goto error;
|
||||
} else {
|
||||
char *rundir = NULL;
|
||||
mode_t old_umask;
|
||||
|
||||
if (!(rundir = virGetUserRuntimeDirectory()))
|
||||
goto error;
|
||||
|
||||
old_umask = umask(077);
|
||||
if (virFileMakePath(rundir) < 0) {
|
||||
umask(old_umask);
|
||||
goto error;
|
||||
}
|
||||
umask(old_umask);
|
||||
|
||||
if (virAsprintf(pidfile, "%s/libvirtd.pid", rundir) < 0) {
|
||||
VIR_FREE(rundir);
|
||||
goto error;
|
||||
}
|
||||
|
||||
VIR_FREE(rundir);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
daemonUnixSocketPaths(struct daemonConfig *config,
|
||||
bool privileged,
|
||||
@@ -291,7 +318,7 @@ daemonUnixSocketPaths(struct daemonConfig *config,
|
||||
}
|
||||
return 0;
|
||||
|
||||
error:
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -331,10 +358,10 @@ static void daemonInitialize(void)
|
||||
{
|
||||
/*
|
||||
* Note that the order is important: the first ones have a higher
|
||||
* priority when calling virStateInitialize. We must register the
|
||||
* network, storage and nodedev drivers before any stateful domain
|
||||
* driver, since their resources must be auto-started before any
|
||||
* domains can be auto-started.
|
||||
* priority when calling virStateInitialize. We must register
|
||||
* the network, storage and nodedev drivers before any domain
|
||||
* drivers, since their resources must be auto-started before
|
||||
* any domains can be auto-started.
|
||||
*/
|
||||
#ifdef WITH_DRIVER_MODULES
|
||||
/* We don't care if any of these fail, because the whole point
|
||||
@@ -345,9 +372,6 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_NETWORK
|
||||
virDriverLoadModule("network");
|
||||
# endif
|
||||
# ifdef WITH_INTERFACE
|
||||
virDriverLoadModule("interface");
|
||||
# endif
|
||||
# ifdef WITH_STORAGE
|
||||
virDriverLoadModule("storage");
|
||||
# endif
|
||||
@@ -360,6 +384,9 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_NWFILTER
|
||||
virDriverLoadModule("nwfilter");
|
||||
# endif
|
||||
# ifdef WITH_INTERFACE
|
||||
virDriverLoadModule("interface");
|
||||
# endif
|
||||
# ifdef WITH_XEN
|
||||
virDriverLoadModule("xen");
|
||||
# endif
|
||||
@@ -378,9 +405,6 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_VBOX
|
||||
virDriverLoadModule("vbox");
|
||||
# endif
|
||||
# ifdef WITH_BHYVE
|
||||
virDriverLoadModule("bhyve");
|
||||
# endif
|
||||
#else
|
||||
# ifdef WITH_NETWORK
|
||||
networkRegister();
|
||||
@@ -418,20 +442,16 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_VBOX
|
||||
vboxRegister();
|
||||
# endif
|
||||
# ifdef WITH_BHYVE
|
||||
bhyveRegister();
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static int ATTRIBUTE_NONNULL(3)
|
||||
daemonSetupNetworking(virNetServerPtr srv,
|
||||
struct daemonConfig *config,
|
||||
const char *sock_path,
|
||||
const char *sock_path_ro,
|
||||
bool ipsock,
|
||||
bool privileged)
|
||||
static int daemonSetupNetworking(virNetServerPtr srv,
|
||||
struct daemonConfig *config,
|
||||
const char *sock_path,
|
||||
const char *sock_path_ro,
|
||||
bool ipsock,
|
||||
bool privileged)
|
||||
{
|
||||
virNetServerServicePtr svc = NULL;
|
||||
virNetServerServicePtr svcRO = NULL;
|
||||
@@ -443,19 +463,11 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
int unix_sock_ro_mask = 0;
|
||||
int unix_sock_rw_mask = 0;
|
||||
|
||||
unsigned int cur_fd = STDERR_FILENO + 1;
|
||||
unsigned int nfds = virGetListenFDs();
|
||||
|
||||
if (config->unix_sock_group) {
|
||||
if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (nfds > (sock_path_ro ? 2 : 1)) {
|
||||
VIR_ERROR(_("Too many (%u) FDs passed from caller"), nfds);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virStrToLong_i(config->unix_sock_ro_perms, NULL, 8, &unix_sock_ro_mask) != 0) {
|
||||
VIR_ERROR(_("Failed to parse mode '%s'"), config->unix_sock_ro_perms);
|
||||
goto error;
|
||||
@@ -466,30 +478,30 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!(svc = virNetServerServiceNewFDOrUNIX(sock_path,
|
||||
unix_sock_rw_mask,
|
||||
unix_sock_gid,
|
||||
config->auth_unix_rw,
|
||||
VIR_DEBUG("Registering unix socket %s", sock_path);
|
||||
if (!(svc = virNetServerServiceNewUNIX(sock_path,
|
||||
unix_sock_rw_mask,
|
||||
unix_sock_gid,
|
||||
config->auth_unix_rw,
|
||||
#if WITH_GNUTLS
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
false,
|
||||
config->max_queued_clients,
|
||||
config->max_client_requests,
|
||||
nfds, &cur_fd)))
|
||||
false,
|
||||
config->max_queued_clients,
|
||||
config->max_client_requests)))
|
||||
goto error;
|
||||
if (sock_path_ro) {
|
||||
if (!(svcRO = virNetServerServiceNewFDOrUNIX(sock_path_ro,
|
||||
unix_sock_ro_mask,
|
||||
unix_sock_gid,
|
||||
config->auth_unix_ro,
|
||||
VIR_DEBUG("Registering unix socket %s", sock_path_ro);
|
||||
if (!(svcRO = virNetServerServiceNewUNIX(sock_path_ro,
|
||||
unix_sock_ro_mask,
|
||||
unix_sock_gid,
|
||||
config->auth_unix_ro,
|
||||
#if WITH_GNUTLS
|
||||
NULL,
|
||||
NULL,
|
||||
#endif
|
||||
true,
|
||||
config->max_queued_clients,
|
||||
config->max_client_requests,
|
||||
nfds, &cur_fd)))
|
||||
true,
|
||||
config->max_queued_clients,
|
||||
config->max_client_requests)))
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -593,7 +605,7 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
error:
|
||||
#if WITH_GNUTLS
|
||||
virObjectUnref(svcTLS);
|
||||
#endif
|
||||
@@ -637,18 +649,14 @@ daemonSetupLogging(struct daemonConfig *config,
|
||||
|
||||
virLogSetFromEnv();
|
||||
|
||||
virLogSetBufferSize(config->log_buffer_size);
|
||||
|
||||
if (virLogGetNbFilters() == 0)
|
||||
virLogParseFilters(config->log_filters);
|
||||
|
||||
if (virLogGetNbOutputs() == 0)
|
||||
virLogParseOutputs(config->log_outputs);
|
||||
|
||||
/*
|
||||
* Command line override for --verbose
|
||||
*/
|
||||
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
||||
virLogSetDefaultPriority(VIR_LOG_INFO);
|
||||
|
||||
/*
|
||||
* If no defined outputs, and either running
|
||||
* as daemon or not on a tty, then first try
|
||||
@@ -659,14 +667,7 @@ daemonSetupLogging(struct daemonConfig *config,
|
||||
(godaemon || !isatty(STDIN_FILENO))) {
|
||||
char *tmp;
|
||||
if (access("/run/systemd/journal/socket", W_OK) >= 0) {
|
||||
virLogPriority priority = virLogGetDefaultPriority();
|
||||
|
||||
/* By default we don't want to log too much stuff into journald as
|
||||
* it may employ rate limiting and thus block libvirt execution. */
|
||||
if (priority == VIR_LOG_DEBUG)
|
||||
priority = VIR_LOG_INFO;
|
||||
|
||||
if (virAsprintf(&tmp, "%d:journald", priority) < 0)
|
||||
if (virAsprintf(&tmp, "%d:journald", virLogGetDefaultPriority()) < 0)
|
||||
goto error;
|
||||
virLogParseOutputs(tmp);
|
||||
VIR_FREE(tmp);
|
||||
@@ -715,9 +716,15 @@ daemonSetupLogging(struct daemonConfig *config,
|
||||
VIR_FREE(tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* Command line override for --verbose
|
||||
*/
|
||||
if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
|
||||
virLogSetDefaultPriority(VIR_LOG_INFO);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -727,13 +734,13 @@ daemonSetupAccessManager(struct daemonConfig *config)
|
||||
{
|
||||
virAccessManagerPtr mgr;
|
||||
const char *none[] = { "none", NULL };
|
||||
const char **drv = (const char **)config->access_drivers;
|
||||
const char **driver = (const char **)config->access_drivers;
|
||||
|
||||
if (!drv ||
|
||||
!drv[0])
|
||||
drv = none;
|
||||
if (!driver ||
|
||||
!driver[0])
|
||||
driver = none;
|
||||
|
||||
if (!(mgr = virAccessManagerNewStack(drv)))
|
||||
if (!(mgr = virAccessManagerNewStack(driver)))
|
||||
return -1;
|
||||
|
||||
virAccessManagerSetDefault(mgr);
|
||||
@@ -785,16 +792,11 @@ static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
|
||||
siginfo_t *sig ATTRIBUTE_UNUSED,
|
||||
void *opaque ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (!driversInitialized) {
|
||||
VIR_WARN("Drivers are not initialized, reload ignored");
|
||||
return;
|
||||
}
|
||||
|
||||
VIR_INFO("Reloading configuration on SIGHUP");
|
||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
|
||||
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
|
||||
if (virStateReload() < 0)
|
||||
VIR_WARN("Error while reloading drivers");
|
||||
VIR_INFO("Reloading configuration on SIGHUP");
|
||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
|
||||
VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
|
||||
if (virStateReload() < 0)
|
||||
VIR_WARN("Error while reloading drivers");
|
||||
}
|
||||
|
||||
static int daemonSetupSignals(virNetServerPtr srv)
|
||||
@@ -935,7 +937,7 @@ static void daemonRunStateInit(void *opaque)
|
||||
#endif
|
||||
/* Only now accept clients from network */
|
||||
virNetServerUpdateServices(srv, true);
|
||||
cleanup:
|
||||
cleanup:
|
||||
daemonInhibitCallback(false, srv);
|
||||
virObjectUnref(srv);
|
||||
virObjectUnref(sysident);
|
||||
@@ -969,8 +971,9 @@ static int migrateProfile(void)
|
||||
if (!(home = virGetUserDirectory()))
|
||||
goto cleanup;
|
||||
|
||||
if (virAsprintf(&old_base, "%s/.libvirt", home) < 0)
|
||||
if (virAsprintf(&old_base, "%s/.libvirt", home) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* if the new directory is there or the old one is not: do nothing */
|
||||
if (!(config_dir = virGetUserConfigDirectory()))
|
||||
@@ -985,18 +988,21 @@ static int migrateProfile(void)
|
||||
}
|
||||
|
||||
/* test if we already attempted to migrate first */
|
||||
if (virAsprintf(&updated, "%s/DEPRECATED-DIRECTORY", old_base) < 0)
|
||||
if (virAsprintf(&updated, "%s/DEPRECATED-DIRECTORY", old_base) < 0) {
|
||||
goto cleanup;
|
||||
if (virFileExists(updated))
|
||||
}
|
||||
if (virFileExists(updated)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
|
||||
if (config_home && config_home[0] != '\0') {
|
||||
if (VIR_STRDUP(xdg_dir, config_home) < 0)
|
||||
goto cleanup;
|
||||
} else {
|
||||
if (virAsprintf(&xdg_dir, "%s/.config", home) < 0)
|
||||
if (virAsprintf(&xdg_dir, "%s/.config", home) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
old_umask = umask(077);
|
||||
@@ -1137,9 +1143,31 @@ int main(int argc, char **argv) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
virUpdateSelfLastChanged(argv[0]);
|
||||
|
||||
virFileActivateDirOverride(argv[0]);
|
||||
if (strstr(argv[0], "lt-libvirtd") ||
|
||||
strstr(argv[0], "/daemon/.libs/libvirtd")) {
|
||||
char *tmp = strrchr(argv[0], '/');
|
||||
if (!tmp) {
|
||||
fprintf(stderr, _("%s: cannot identify driver directory\n"), argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
*tmp = '\0';
|
||||
char *driverdir;
|
||||
if (virAsprintfQuiet(&driverdir, "%s/../../src/.libs", argv[0]) < 0) {
|
||||
fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
if (access(driverdir, R_OK) < 0) {
|
||||
fprintf(stderr, _("%s: expected driver directory '%s' is missing\n"),
|
||||
argv[0], driverdir);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
virLockManagerSetPluginDir(driverdir);
|
||||
#ifdef WITH_DRIVER_MODULES
|
||||
virDriverModuleInitialize(driverdir);
|
||||
#endif
|
||||
*tmp = '/';
|
||||
/* Must not free 'driverdir' - it is still used */
|
||||
}
|
||||
|
||||
while (1) {
|
||||
int optidx = 0;
|
||||
@@ -1148,8 +1176,9 @@ int main(int argc, char **argv) {
|
||||
|
||||
c = getopt_long(argc, argv, "ldf:p:t:vVh", opts, &optidx);
|
||||
|
||||
if (c == -1)
|
||||
if (c == -1) {
|
||||
break;
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
case 0:
|
||||
@@ -1262,10 +1291,8 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
if (!pid_file &&
|
||||
virPidFileConstructPath(privileged,
|
||||
LOCALSTATEDIR,
|
||||
"libvirtd",
|
||||
&pid_file) < 0) {
|
||||
daemonPidFilePath(privileged,
|
||||
&pid_file) < 0) {
|
||||
VIR_ERROR(_("Can't determine pid file path."));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
@@ -1326,7 +1353,7 @@ int main(int argc, char **argv) {
|
||||
umask(old_umask);
|
||||
|
||||
/* Try to claim the pidfile, exiting if we can't */
|
||||
if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
|
||||
if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) {
|
||||
ret = VIR_DAEMON_ERR_PIDFILE;
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -1340,7 +1367,6 @@ int main(int argc, char **argv) {
|
||||
config->max_workers,
|
||||
config->prio_workers,
|
||||
config->max_clients,
|
||||
config->max_anonymous_clients,
|
||||
config->keepalive_interval,
|
||||
config->keepalive_count,
|
||||
!!config->keepalive_required,
|
||||
@@ -1426,7 +1452,7 @@ int main(int argc, char **argv) {
|
||||
VIR_DEBUG("Proceeding without auditing");
|
||||
}
|
||||
}
|
||||
virAuditLog(config->audit_logging > 0);
|
||||
virAuditLog(config->audit_logging);
|
||||
|
||||
/* setup the hooks if any */
|
||||
if (virHookInitialize() < 0) {
|
||||
@@ -1495,7 +1521,7 @@ int main(int argc, char **argv) {
|
||||
virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
|
||||
0, "shutdown", NULL, NULL);
|
||||
|
||||
cleanup:
|
||||
cleanup:
|
||||
virNetlinkEventServiceStopAll();
|
||||
virObjectUnref(remoteProgram);
|
||||
virObjectUnref(lxcProgram);
|
||||
@@ -1524,10 +1550,8 @@ int main(int argc, char **argv) {
|
||||
|
||||
daemonConfigFree(config);
|
||||
|
||||
if (driversInitialized) {
|
||||
driversInitialized = false;
|
||||
if (driversInitialized)
|
||||
virStateCleanup();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -48,10 +48,6 @@
|
||||
# Override the default configuration which binds to all network
|
||||
# interfaces. This can be a numeric IPv4/6 address, or hostname
|
||||
#
|
||||
# If the libvirtd service is started in parallel with network
|
||||
# startup (e.g. with systemd), binding to addresses other than
|
||||
# the wildcards (0.0.0.0/::) might not be available yet.
|
||||
#
|
||||
#listen_addr = "192.168.0.1"
|
||||
|
||||
|
||||
@@ -67,7 +63,7 @@
|
||||
# unique on the immediate broadcast network.
|
||||
#
|
||||
# The default is "Virtualization Host HOSTNAME", where HOSTNAME
|
||||
# is substituted for the short hostname of the machine (without domain)
|
||||
# is subsituted for the short hostname of the machine (without domain)
|
||||
#
|
||||
#mdns_name = "Virtualization Host Joe Demo"
|
||||
|
||||
@@ -77,11 +73,6 @@
|
||||
# UNIX socket access controls
|
||||
#
|
||||
|
||||
# Beware that if you are changing *any* of these options, and you use
|
||||
# socket activation with systemd, you need to adjust the settings in
|
||||
# the libvirtd.socket file as well since it could impose a security
|
||||
# risk if you rely on file permission checking only.
|
||||
|
||||
# Set the UNIX domain socket group ownership. This can be used to
|
||||
# allow a 'trusted' set of users access to management capabilities
|
||||
# without becoming root.
|
||||
@@ -92,8 +83,8 @@
|
||||
# Set the UNIX socket permissions for the R/O socket. This is used
|
||||
# for monitoring VM status only
|
||||
#
|
||||
# Default allows any user. If setting group ownership, you may want to
|
||||
# restrict this too.
|
||||
# Default allows any user. If setting group ownership may want to
|
||||
# restrict this to:
|
||||
#unix_sock_ro_perms = "0777"
|
||||
|
||||
# Set the UNIX socket permissions for the R/W socket. This is used
|
||||
@@ -103,7 +94,7 @@
|
||||
# the default will change to allow everyone (eg, 0777)
|
||||
#
|
||||
# If not using PolicyKit and setting group ownership for access
|
||||
# control, then you may want to relax this too.
|
||||
# control then you may want to relax this to:
|
||||
#unix_sock_rw_perms = "0770"
|
||||
|
||||
# Set the name of the directory in which sockets will be found/created.
|
||||
@@ -122,7 +113,7 @@
|
||||
# - sasl: use SASL infrastructure. The actual auth scheme is then
|
||||
# controlled from /etc/sasl2/libvirt.conf. For the TCP
|
||||
# socket only GSSAPI & DIGEST-MD5 mechanisms will be used.
|
||||
# For non-TCP or TLS sockets, any scheme is allowed.
|
||||
# For non-TCP or TLS sockets, any scheme is allowed.
|
||||
#
|
||||
# - polkit: use PolicyKit to authenticate. This is only suitable
|
||||
# for use on the UNIX sockets. The default policy will
|
||||
@@ -225,7 +216,7 @@
|
||||
#tls_no_verify_certificate = 1
|
||||
|
||||
|
||||
# A whitelist of allowed x509 Distinguished Names
|
||||
# A whitelist of allowed x509 Distinguished Names
|
||||
# This list may contain wildcards such as
|
||||
#
|
||||
# "C=GB,ST=London,L=London,O=Red Hat,CN=*"
|
||||
@@ -264,7 +255,7 @@
|
||||
|
||||
# The maximum number of concurrent client connections to allow
|
||||
# over all sockets combined.
|
||||
#max_clients = 5000
|
||||
#max_clients = 20
|
||||
|
||||
# The maximum length of queue of connections waiting to be
|
||||
# accepted by the daemon. Note, that some protocols supporting
|
||||
@@ -272,10 +263,6 @@
|
||||
# connection succeeds.
|
||||
#max_queued_clients = 1000
|
||||
|
||||
# The maximum length of queue of accepted but not yet
|
||||
# authenticated clients. The default value is zero, meaning
|
||||
# the feature is disabled.
|
||||
#max_anonymous_clients = 20
|
||||
|
||||
# The minimum limit sets the number of workers to start up
|
||||
# initially. If the number of active clients exceeds this,
|
||||
@@ -287,13 +274,13 @@
|
||||
|
||||
|
||||
# The number of priority workers. If all workers from above
|
||||
# pool are stuck, some calls marked as high priority
|
||||
# pool will stuck, some calls marked as high priority
|
||||
# (notably domainDestroy) can be executed in this pool.
|
||||
#prio_workers = 5
|
||||
|
||||
# Total global limit on concurrent RPC calls. Should be
|
||||
# at least as large as max_workers. Beyond this, RPC requests
|
||||
# will be read into memory and queued. This directly impacts
|
||||
# will be read into memory and queued. This directly impact
|
||||
# memory usage, currently each request requires 256 KB of
|
||||
# memory. So by default up to 5 MB of memory is used
|
||||
#
|
||||
@@ -314,10 +301,6 @@
|
||||
|
||||
# Logging level: 4 errors, 3 warnings, 2 information, 1 debug
|
||||
# basically 1 will log everything possible
|
||||
# Note: Journald may employ rate limiting of the messages logged
|
||||
# and thus lock up the libvirt daemon. To use the debug level with
|
||||
# journald you have to specify it explicitly in 'log_outputs', otherwise
|
||||
# only information level messages will be logged.
|
||||
#log_level = 3
|
||||
|
||||
# Logging filters:
|
||||
@@ -335,7 +318,7 @@
|
||||
# 3: WARNING
|
||||
# 4: ERROR
|
||||
#
|
||||
# Multiple filters can be defined in a single @filters, they just need to be
|
||||
# Multiple filter can be defined in a single @filters, they just need to be
|
||||
# separated by spaces.
|
||||
#
|
||||
# e.g. to only get warning or errors from the remote layer and only errors
|
||||
@@ -351,24 +334,22 @@
|
||||
# use syslog for the output and use the given name as the ident
|
||||
# x:file:file_path
|
||||
# output to a file, with the given filepath
|
||||
# x:journald
|
||||
# output to journald logging system
|
||||
# In all case the x prefix is the minimal level, acting as a filter
|
||||
# 1: DEBUG
|
||||
# 2: INFO
|
||||
# 3: WARNING
|
||||
# 4: ERROR
|
||||
#
|
||||
# Multiple outputs can be defined, they just need to be separated by spaces.
|
||||
# Multiple output can be defined, they just need to be separated by spaces.
|
||||
# e.g. to log all warnings and errors to syslog under the libvirtd ident:
|
||||
#log_outputs="3:syslog:libvirtd"
|
||||
#
|
||||
|
||||
# Log debug buffer size:
|
||||
#
|
||||
# This configuration option is no longer used, since the global
|
||||
# log buffer functionality has been removed. Please configure
|
||||
# suitable log_outputs/log_filters settings to obtain logs.
|
||||
# Log debug buffer size: default 64
|
||||
# The daemon keeps an internal debug log buffer which will be dumped in case
|
||||
# of crash or upon receiving a SIGUSR2 signal. This setting allows to override
|
||||
# the default buffer size in kilobytes.
|
||||
# If value is 0 or less the debug log buffer is deactivated
|
||||
#log_buffer_size = 64
|
||||
|
||||
|
||||
@@ -406,7 +387,7 @@
|
||||
###################################################################
|
||||
# Keepalive protocol:
|
||||
# This allows libvirtd to detect broken client connections or even
|
||||
# dead clients. A keepalive message is sent to a client after
|
||||
# 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
|
||||
@@ -415,7 +396,7 @@
|
||||
# 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 daemon will send responses. When
|
||||
# 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.
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
# include "remote_protocol.h"
|
||||
# include "lxc_protocol.h"
|
||||
# include "qemu_protocol.h"
|
||||
# include "virlog.h"
|
||||
# include "virthread.h"
|
||||
# if WITH_SASL
|
||||
# include "virnetsaslcontext.h"
|
||||
@@ -50,12 +51,9 @@ struct daemonClientPrivate {
|
||||
/* Hold while accessing any data except conn */
|
||||
virMutex lock;
|
||||
|
||||
daemonClientEventCallbackPtr *domainEventCallbacks;
|
||||
size_t ndomainEventCallbacks;
|
||||
int domainEventCallbackID[VIR_DOMAIN_EVENT_ID_LAST];
|
||||
daemonClientEventCallbackPtr *networkEventCallbacks;
|
||||
size_t nnetworkEventCallbacks;
|
||||
daemonClientEventCallbackPtr *qemuEventCallbacks;
|
||||
size_t nqemuEventCallbacks;
|
||||
|
||||
# if WITH_SASL
|
||||
virNetSASLSessionPtr sasl;
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
# 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
|
||||
Before=libvirt-guests.service
|
||||
After=network.target
|
||||
After=dbus.service
|
||||
After=iscsid.service
|
||||
After=apparmor.service
|
||||
Documentation=man:libvirtd(8)
|
||||
Documentation=http://libvirt.org
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
EnvironmentFile=-/etc/sysconfig/libvirtd
|
||||
ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
[Socket]
|
||||
ListenStream=@runstatedir@/libvirt/libvirt-sock
|
||||
ListenStream=@runstatedir@/libvirt/libvirt-sock-ro
|
||||
|
||||
; The following settings must match libvirtd.conf file in order to
|
||||
; work as expected because libvirtd can't change them later.
|
||||
; SocketMode=0777 is safe only if authentication on the socket is set
|
||||
; up. For further information, please see the libvirtd.conf file.
|
||||
SocketMode=0777
|
||||
SocketUser=root
|
||||
SocketGroup=root
|
||||
@@ -20,14 +20,5 @@
|
||||
#
|
||||
#SDL_AUDIODRIVER=pulse
|
||||
|
||||
# Override the maximum number of opened files.
|
||||
# This only works with traditional init scripts.
|
||||
# In the systemd world, the limit can only be changed by overriding
|
||||
# LimitNOFILE for libvirtd.service. To do that, just create a *.conf
|
||||
# file in /etc/systemd/system/libvirtd.service.d/ (for example
|
||||
# /etc/systemd/system/libvirtd.service.d/openfiles.conf) and write
|
||||
# the following two lines in it:
|
||||
# [Service]
|
||||
# LimitNOFILE=2048
|
||||
#
|
||||
# Override the maximum number of opened files
|
||||
#LIBVIRTD_NOFILES_LIMIT=2048
|
||||
|
||||
2373
daemon/remote.c
2373
daemon/remote.c
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* stream.c: APIs for managing client streams
|
||||
*
|
||||
* Copyright (C) 2009-2014 Red Hat, Inc.
|
||||
* Copyright (C) 2009, 2011 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
|
||||
@@ -32,8 +32,6 @@
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_STREAMS
|
||||
|
||||
VIR_LOG_INIT("daemon.stream");
|
||||
|
||||
struct daemonClientStream {
|
||||
daemonClientPrivatePtr priv;
|
||||
int refs;
|
||||
@@ -260,7 +258,7 @@ daemonStreamEvent(virStreamPtr st, int events, void *opaque)
|
||||
daemonStreamUpdateEvents(stream);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
cleanup:
|
||||
virMutexUnlock(&priv->lock);
|
||||
}
|
||||
|
||||
@@ -301,7 +299,7 @@ daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||
daemonStreamUpdateEvents(stream);
|
||||
ret = 1;
|
||||
|
||||
cleanup:
|
||||
cleanup:
|
||||
virMutexUnlock(&stream->priv->lock);
|
||||
return ret;
|
||||
}
|
||||
@@ -383,7 +381,7 @@ int daemonFreeClientStream(virNetServerClientPtr client,
|
||||
msg = tmp;
|
||||
}
|
||||
|
||||
virObjectUnref(stream->st);
|
||||
virStreamFree(stream->st);
|
||||
VIR_FREE(stream);
|
||||
|
||||
return ret;
|
||||
@@ -612,10 +610,10 @@ daemonStreamHandleAbort(virNetServerClientPtr client,
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
|
||||
if (msg->header.status == VIR_NET_ERROR) {
|
||||
if (msg->header.status == VIR_NET_ERROR)
|
||||
virReportError(VIR_ERR_RPC,
|
||||
"%s", _("stream aborted at client request"));
|
||||
} else {
|
||||
else {
|
||||
VIR_WARN("unexpected stream status %d", msg->header.status);
|
||||
virReportError(VIR_ERR_RPC,
|
||||
_("stream aborted with unexpected status %d"),
|
||||
|
||||
@@ -34,9 +34,8 @@ module Test_libvirtd =
|
||||
{ "1" = "joe@EXAMPLE.COM" }
|
||||
{ "2" = "fred@EXAMPLE.COM" }
|
||||
}
|
||||
{ "max_clients" = "5000" }
|
||||
{ "max_clients" = "20" }
|
||||
{ "max_queued_clients" = "1000" }
|
||||
{ "max_anonymous_clients" = "20" }
|
||||
{ "min_workers" = "5" }
|
||||
{ "max_workers" = "20" }
|
||||
{ "prio_workers" = "5" }
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
## Copyright (C) 2005-2014 Red Hat, Inc.
|
||||
## Copyright (C) 2005-2013 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
|
||||
@@ -25,22 +25,9 @@ DOC_SOURCE_DIR=../src
|
||||
|
||||
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
|
||||
|
||||
apihtml = \
|
||||
html/index.html \
|
||||
$(apihtml_generated)
|
||||
|
||||
apihtml_generated = \
|
||||
html/libvirt-libvirt-domain.html \
|
||||
html/libvirt-libvirt-domain-snapshot.html \
|
||||
html/libvirt-libvirt-event.html \
|
||||
html/libvirt-libvirt-host.html \
|
||||
html/libvirt-libvirt-interface.html \
|
||||
html/libvirt-libvirt-network.html \
|
||||
html/libvirt-libvirt-nodedev.html \
|
||||
html/libvirt-libvirt-nwfilter.html \
|
||||
html/libvirt-libvirt-secret.html \
|
||||
html/libvirt-libvirt-storage.html \
|
||||
html/libvirt-libvirt-stream.html \
|
||||
apihtml = \
|
||||
html/index.html \
|
||||
html/libvirt-libvirt.html \
|
||||
html/libvirt-virterror.html
|
||||
|
||||
apipng = \
|
||||
@@ -53,6 +40,7 @@ devhelphtml = \
|
||||
devhelp/libvirt.devhelp \
|
||||
devhelp/index.html \
|
||||
devhelp/general.html \
|
||||
devhelp/libvirt-libvirt.html \
|
||||
devhelp/libvirt-virterror.html
|
||||
|
||||
css = \
|
||||
@@ -198,7 +186,7 @@ todo:
|
||||
|
||||
hvsupport.html:: $(srcdir)/hvsupport.html.in
|
||||
|
||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl \
|
||||
$(srcdir)/../src/libvirt_public.syms \
|
||||
$(srcdir)/../src/libvirt_qemu.syms $(srcdir)/../src/libvirt_lxc.syms \
|
||||
$(srcdir)/../src/driver.h
|
||||
@@ -235,7 +223,7 @@ internals/%.html.tmp: internals/%.html.in subsite.xsl page.xsl sitemap.html.in
|
||||
SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
|
||||
$(XMLLINT) --catalogs --nonet --format --valid $< > $(srcdir)/$@ \
|
||||
|| { rm $(srcdir)/$@ && exit 1; }; \
|
||||
else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
|
||||
else echo "missing XHTML1 DTD" ; fi ; fi
|
||||
|
||||
%.php.tmp: %.php.in site.xsl page.xsl sitemap.html.in
|
||||
@if [ -x $(XSLTPROC) ] ; then \
|
||||
@@ -251,8 +239,6 @@ internals/%.html.tmp: internals/%.html.in subsite.xsl page.xsl sitemap.html.in
|
||||
-e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
|
||||
|| { rm $(srcdir)/$@ && exit 1; }; fi
|
||||
|
||||
$(apihtml_generated): html/index.html
|
||||
|
||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
|
||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||
$(XSLTPROC) --nonet -o $(srcdir)/ \
|
||||
@@ -263,7 +249,7 @@ html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
|
||||
> /dev/null ; then \
|
||||
SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
|
||||
$(XMLLINT) --catalogs --nonet --valid --noout $(srcdir)/html/*.html ; \
|
||||
else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
|
||||
else echo "missing XHTML1 DTD" ; fi ; fi
|
||||
|
||||
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||
@@ -272,6 +258,7 @@ $(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
||||
|
||||
|
||||
python_generated_files = \
|
||||
$(srcdir)/html/libvirt-libvirt.html \
|
||||
$(srcdir)/html/libvirt-libvirt-lxc.html \
|
||||
$(srcdir)/html/libvirt-libvirt-qemu.html \
|
||||
$(srcdir)/html/libvirt-virterror.html \
|
||||
@@ -291,17 +278,6 @@ $(python_generated_files): $(APIBUILD_STAMP)
|
||||
|
||||
$(APIBUILD_STAMP): $(srcdir)/apibuild.py \
|
||||
$(srcdir)/../include/libvirt/libvirt.h.in \
|
||||
$(srcdir)/../include/libvirt/libvirt-domain-snapshot.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-domain.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-event.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-host.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-interface.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-network.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-nodedev.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-nwfilter.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-secret.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-storage.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-stream.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-lxc.h \
|
||||
$(srcdir)/../include/libvirt/libvirt-qemu.h \
|
||||
$(srcdir)/../include/libvirt/virterror.h \
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
types in its API. Each object type, in turn, has a set
|
||||
of permissions defined. To determine what permissions
|
||||
are checked for specific API call, consult the
|
||||
<a href="html/index.html">API reference manual</a>
|
||||
<a href="html/libvirt-libvirt.html">API reference manual</a>
|
||||
documentation for the API in question.
|
||||
</p>
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
<td>Name of the network interface, unique to the local host</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>interface_macaddr</td>
|
||||
<td>interface_mac</td>
|
||||
<td>MAC address of the network interface, not unique</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
228
docs/api.html.in
228
docs/api.html.in
@@ -16,7 +16,7 @@
|
||||
manipulated through the API is the <code>virConnectPtr</code>, which
|
||||
represents the connection to a hypervisor. Any application using libvirt
|
||||
is likely to start using the
|
||||
API by calling one of <a href="html/libvirt-libvirt-host.html#virConnectOpen"
|
||||
API by calling one of <a href="html/libvirt-libvirt.html#virConnectOpen"
|
||||
>the virConnectOpen functions</a>. You will note that those functions take
|
||||
a name argument which is actually a <a href="uri.html">connection URI</a>
|
||||
to select the right hypervisor to open.
|
||||
@@ -26,10 +26,7 @@
|
||||
name will default to a preselected hypervisor, but it's probably not a
|
||||
wise thing to do in most cases. See the <a href="uri.html">connection
|
||||
URI</a> page for a full descriptions of the values allowed.</p>
|
||||
<p> OnDevice the application obtains a
|
||||
<a href="/html/libvirt-libvirt-host.html#virConnectPtr">
|
||||
<code>virConnectPtr</code>
|
||||
</a>
|
||||
<p> Once the application obtains a <code class='docref'>virConnectPtr</code>
|
||||
connection to the hypervisor it can then use it to manage the hypervisor's
|
||||
available domains and related virtualization
|
||||
resources, such as storage and networking. All those are
|
||||
@@ -41,61 +38,33 @@
|
||||
</p>
|
||||
<p> The figure above shows the five main objects exported by the API:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-host.html#virConnectPtr">
|
||||
<code>virConnectPtr</code>
|
||||
</a>
|
||||
<li><code class='docref'>virConnectPtr</code>
|
||||
<p>Represents the connection to a hypervisor. Use one of the
|
||||
<a href="html/libvirt-libvirt-host.html#virConnectOpen">virConnectOpen</a>
|
||||
<a href="html/libvirt-libvirt.html#virConnectOpen">virConnectOpen</a>
|
||||
functions to obtain connection to the hypervisor which is then used
|
||||
as a parameter to other connection API's.</p></li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainPtr">
|
||||
<code>virDomainPtr</code>
|
||||
</a>
|
||||
<li><code class='docref'>virDomainPtr</code>
|
||||
<p>Represents one domain either active or defined (i.e. existing as
|
||||
permanent config file and storage but not currently running on that
|
||||
node). The function
|
||||
<a href="html/libvirt-libvirt-domain.html#virConnectListAllDomains">
|
||||
<code>virConnectListAllDomains</code>
|
||||
</a>
|
||||
node). The function <code class='docref'>virConnectListAllDomains</code>
|
||||
lists all the domains for the hypervisor.</p></li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virNetworkPtr">
|
||||
<code>virNetworkPtr</code>
|
||||
</a>
|
||||
<li><code class='docref'>virNetworkPtr</code>
|
||||
<p>Represents one network either active or defined (i.e. existing
|
||||
as permanent config file and storage but not currently activated).
|
||||
The function
|
||||
<a href="html/libvirt-libvirt-network.html#virConnectListAllNetworks">
|
||||
<code>virConnectListAllNetworks</code>
|
||||
</a>
|
||||
The function <code class='docref'>virConnectListAllNetworks</code>
|
||||
lists all the virtualization networks for the hypervisor.</p></li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolPtr">
|
||||
<code>virStorageVolPtr</code>
|
||||
</a>
|
||||
<li><code class='docref'>virStorageVolPtr</code>
|
||||
<p>Represents one storage volume generally used
|
||||
as a block device available to one of the domains. The function
|
||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolLookupByPath">
|
||||
<code>virStorageVolLookupByPath</code>
|
||||
</a>
|
||||
finds the storage volume object based on its path on the node.</p></li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolPtr">
|
||||
<code>virStoragePoolPtr</code>
|
||||
</a>
|
||||
<code class="docref">virStorageVolLookupByPath</code> finds
|
||||
the storage volume object based on its path on the node.</p></li>
|
||||
<li><code class='docref'>virStoragePoolPtr</code>
|
||||
<p>Represents a storage pool, which is a logical area
|
||||
used to allocate and store storage volumes. The function
|
||||
<a href="html/libvirt-libvirt-storage.html#virConnectListAllStoragePools">
|
||||
<code>virConnectListAllStoragePools</code>
|
||||
</a>
|
||||
lists all of the virtualization storage pools on the hypervisor.
|
||||
The function
|
||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolLookupByVolume">
|
||||
<code>virStoragePoolLookupByVolume</code>
|
||||
</a>
|
||||
finds the storage pool containing a given storage volume.</p></li>
|
||||
<code class='docref'>virConnectListAllStoragePools</code> lists
|
||||
all of the virtualization storage pools on the hypervisor. The function
|
||||
<code class="docref">virStoragePoolLookupByVolume</code> finds
|
||||
the storage pool containing a given storage volume.</p></li>
|
||||
</ul>
|
||||
<p> Most objects manipulated by the library can also be represented using
|
||||
XML descriptions. This is used primarily to create those object, but is
|
||||
@@ -132,114 +101,42 @@
|
||||
<p>Used to perform lookups on objects by some type of identifier,
|
||||
such as:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByID">
|
||||
<code>virDomainLookupByID</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByName">
|
||||
<code>virDomainLookupByName</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByUUID">
|
||||
<code>virDomainLookupByUUID</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainLookupByUUIDString">
|
||||
<code>virDomainLookupByUUIDString</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virDomainLookupByID</code></li>
|
||||
<li><code class='docref'>virDomainLookupByName</code></li>
|
||||
<li><code class='docref'>virDomainLookupByUUID</code></li>
|
||||
<li><code class='docref'>virDomainLookupByUUIDString</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><b>Enumeration</b> [virConnectList..., virConnectNumOf...]
|
||||
<p>Used to enumerate a set of object available to an given
|
||||
hypervisor connection such as:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virConnectListDomains">
|
||||
<code>virConnectListDomains</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virConnectNumOfDomains">
|
||||
<code>virConnectNumOfDomains</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virConnectListNetworks">
|
||||
<code>virConnectListNetworks</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virConnectListStoragePools">
|
||||
<code>virConnectListStoragePools</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virConnectListDomains</code></li>
|
||||
<li><code class='docref'>virConnectNumOfDomains</code></li>
|
||||
<li><code class='docref'>virConnectListNetworks</code></li>
|
||||
<li><code class='docref'>virConnectListStoragePools</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><b>Description</b> [...GetInfo]
|
||||
<p>Generic accessor providing a set of generic information about an
|
||||
object, such as: </p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-host.html#virNodeGetInfo">
|
||||
<code>virNodeGetInfo</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetInfo">
|
||||
<code>virDomainGetInfo</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolGetInfo">
|
||||
<code>virStoragePoolGetInfo</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStorageVolGetInfo">
|
||||
<code>virStorageVolGetInfo</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virNodeGetInfo</code></li>
|
||||
<li><code class='docref'>virDomainGetInfo</code></li>
|
||||
<li><code class='docref'>virStoragePoolGetInfo</code></li>
|
||||
<li><code class='docref'>virStorageVolGetInfo</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><b>Accessors</b> [...Get..., ...Set...]
|
||||
<p>Specific accessors used to query or modify data for the given object,
|
||||
such as: </p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-host.html#virConnectGetType">
|
||||
<code>virConnectGetType</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetMaxMemory">
|
||||
<code>virDomainGetMaxMemory</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainSetMemory">
|
||||
<code>virDomainSetMemory</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainGetVcpus">
|
||||
<code>virDomainGetVcpus</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolSetAutostart">
|
||||
<code>virStoragePoolSetAutostart</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virNetworkGetBridgeName">
|
||||
<code>virNetworkGetBridgeName</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virConnectGetType</code></li>
|
||||
<li><code class='docref'>virDomainGetMaxMemory</code></li>
|
||||
<li><code class='docref'>virDomainSetMemory</code></li>
|
||||
<li><code class='docref'>virDomainGetVcpus</code></li>
|
||||
<li><code class='docref'>virStoragePoolSetAutostart</code></li>
|
||||
<li><code class='docref'>virNetworkGetBridgeName</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><b>Creation</b> [...Create, ...CreateXML]
|
||||
@@ -247,53 +144,21 @@
|
||||
the object based on an XML description, while the ...Create APIs will
|
||||
create the object based on existing object pointer, such as: </p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainCreate">
|
||||
<code>virDomainCreate</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainCreateXML">
|
||||
<code>virDomainCreateXML</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virNetworkCreate">
|
||||
<code>virNetworkCreate</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virNetworkCreateXML">
|
||||
<code>virNetworkCreateXML</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virDomainCreate</code></li>
|
||||
<li><code class='docref'>virDomainCreateXML</code></li>
|
||||
<li><code class='docref'>virNetworkCreate</code></li>
|
||||
<li><code class='docref'>virNetworkCreateXML</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><b>Destruction</b> [...Destroy]
|
||||
<p>Used to shutdown or deactivate and destroy objects, such as: </p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainDestroy">
|
||||
<code>virDomainDestroy</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html#virNetworkDestroy">
|
||||
<code>virNetworkDestroy</code>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html#virStoragePoolDestroy">
|
||||
<code>virStoragePoolDestroy</code>
|
||||
</a>
|
||||
</li>
|
||||
<li><code class='docref'>virDomainDestroy</code></li>
|
||||
<li><code class='docref'>virNetworkDestroy</code></li>
|
||||
<li><code class='docref'>virStoragePoolDestroy</code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Note: functions returning vir*Ptr (like the virDomainLookup functions)
|
||||
allocate memory which needs to be freed by the caller by the corresponding
|
||||
vir*Free function (e.g. virDomainFree for a virDomainPtr object).
|
||||
</p>
|
||||
<p> For more in-depth details of the storage related APIs see
|
||||
<a href="storage.html">the storage management page</a>.
|
||||
</p>
|
||||
@@ -301,11 +166,7 @@
|
||||
<p>Drivers are the basic building block for libvirt functionality
|
||||
to support the capability to handle specific hypervisor driver calls.
|
||||
Drivers are discovered and registered during connection processing as
|
||||
part of the
|
||||
<a href="html/libvirt-libvirt-host.html#virInitialize">
|
||||
<code>virInitialize</code>
|
||||
</a>
|
||||
API. Each driver
|
||||
part of the <code class='docref'>virInitialize</code> API. Each driver
|
||||
has a registration API which loads up the driver specific function
|
||||
references for the libvirt APIs to call. The following is a simplistic
|
||||
view of the hypervisor driver mechanism. Consider the stacked list of
|
||||
@@ -334,10 +195,7 @@
|
||||
The libvirtd daemon service is started on the host at system boot
|
||||
time and can also be restarted at any time by a properly privileged
|
||||
user, such as root. The libvirtd daemon uses the same libvirt API
|
||||
<a href="html/libvirt-libvirt-host.html#virInitialize">
|
||||
<code>virInitialize</code>
|
||||
</a>
|
||||
sequence as applications
|
||||
<code class='docref'>virInitialize</code> sequence as applications
|
||||
for client-side driver registrations, but then extends the registered
|
||||
driver list to encompass all known drivers supported for all driver
|
||||
types supported on the host. </p>
|
||||
|
||||
@@ -21,29 +21,9 @@ debugsym=None
|
||||
# C parser analysis code
|
||||
#
|
||||
included_files = {
|
||||
"libvirt-domain.h": "header with general libvirt API definitions",
|
||||
"libvirt-domain-snapshot.h": "header with general libvirt API definitions",
|
||||
"libvirt-event.h": "header with general libvirt API definitions",
|
||||
"libvirt-host.h": "header with general libvirt API definitions",
|
||||
"libvirt-interface.h": "header with general libvirt API definitions",
|
||||
"libvirt-network.h": "header with general libvirt API definitions",
|
||||
"libvirt-nodedev.h": "header with general libvirt API definitions",
|
||||
"libvirt-nwfilter.h": "header with general libvirt API definitions",
|
||||
"libvirt-secret.h": "header with general libvirt API definitions",
|
||||
"libvirt-storage.h": "header with general libvirt API definitions",
|
||||
"libvirt-stream.h": "header with general libvirt API definitions",
|
||||
"libvirt.h": "header with general libvirt API definitions",
|
||||
"virterror.h": "header with error specific API definitions",
|
||||
"libvirt.c": "Main interfaces for the libvirt library",
|
||||
"libvirt-domain.c": "Domain interfaces for the libvirt library",
|
||||
"libvirt-domain-snapshot.c": "Domain snapshot interfaces for the libvirt library",
|
||||
"libvirt-host.c": "Host interfaces for the libvirt library",
|
||||
"libvirt-interface.c": "Interface interfaces for the libvirt library",
|
||||
"libvirt-network.c": "Network interfaces for the libvirt library",
|
||||
"libvirt-nodedev.c": "Node device interfaces for the libvirt library",
|
||||
"libvirt-nwfilter.c": "NWFilter interfaces for the libvirt library",
|
||||
"libvirt-secret.c": "Secret interfaces for the libvirt library",
|
||||
"libvirt-storage.c": "Storage interfaces for the libvirt library",
|
||||
"libvirt-stream.c": "Stream interfaces for the libvirt library",
|
||||
"virerror.c": "implements error handling and reporting code for libvirt",
|
||||
"virevent.c": "event loop for monitoring file handles",
|
||||
"virtypedparam.c": "virTypedParameters APIs",
|
||||
@@ -85,7 +65,6 @@ ignored_functions = {
|
||||
"virDomainMigratePrepareTunnel3": "private function for tunnelled migration",
|
||||
"DllMain": "specific function for Win32",
|
||||
"virTypedParamsValidate": "internal function in virtypedparam.c",
|
||||
"virTypedParameterValidateSet": "internal function in virtypedparam.c",
|
||||
"virTypedParameterAssign": "internal function in virtypedparam.c",
|
||||
"virTypedParameterAssignFromStr": "internal function in virtypedparam.c",
|
||||
"virTypedParameterToString": "internal function in virtypedparam.c",
|
||||
@@ -459,14 +438,6 @@ class CLexer:
|
||||
if line[0] == '#':
|
||||
self.tokens = map((lambda x: ('preproc', x)),
|
||||
string.split(line))
|
||||
|
||||
# We might have whitespace between the '#' and preproc
|
||||
# macro name, so instead of having a single token element
|
||||
# of '#define' we might end up with '#' and 'define'. This
|
||||
# merges them back together
|
||||
if self.tokens[0][1] == "#":
|
||||
self.tokens[0] = ('preproc', self.tokens[0][1] + self.tokens[1][1])
|
||||
self.tokens = self.tokens[:1] + self.tokens[2:]
|
||||
break
|
||||
l = len(line)
|
||||
if line[0] == '"' or line[0] == "'":
|
||||
@@ -955,7 +926,7 @@ class CParser:
|
||||
if i < len(l) and l[i] == ' ':
|
||||
i = i + 1
|
||||
l = l[i:]
|
||||
if len(l) >= 6 and l[0:7] == "Returns":
|
||||
if len(l) >= 6 and l[0:7] == "returns" or l[0:7] == "Returns":
|
||||
try:
|
||||
l = string.split(l, ' ', 1)[1]
|
||||
except:
|
||||
@@ -1475,24 +1446,6 @@ class CParser:
|
||||
|
||||
return token
|
||||
|
||||
def parseVirLogInit(self, token):
|
||||
if token[0] != "string":
|
||||
self.error("parsing VIR_LOG_INIT: expecting string", token)
|
||||
|
||||
token = self.token()
|
||||
|
||||
if token[0] != "sep":
|
||||
self.error("parsing VIR_LOG_INIT: expecting ')'", token)
|
||||
|
||||
if token[1] != ')':
|
||||
self.error("parsing VIR_LOG_INIT: expecting ')'", token)
|
||||
|
||||
token = self.token()
|
||||
if token[0] == "sep" and token[1] == ';':
|
||||
token = self.token()
|
||||
|
||||
return token
|
||||
|
||||
#
|
||||
# Parse a C definition block, used for structs or unions it parse till
|
||||
# the balancing }
|
||||
@@ -1664,18 +1617,6 @@ class CParser:
|
||||
token = ("name", "virenumimpl")
|
||||
return token
|
||||
|
||||
elif token[0] == "name" and token[1] == "VIR_LOG_INIT":
|
||||
token = self.token()
|
||||
if token is not None and token[0] == "sep" and token[1] == "(":
|
||||
token = self.token()
|
||||
token = self.parseVirLogInit(token)
|
||||
else:
|
||||
self.error("parsing VIR_LOG_INIT: expecting '('", token)
|
||||
if token is not None:
|
||||
self.lexer.push(token)
|
||||
token = ("name", "virloginit")
|
||||
return token
|
||||
|
||||
elif token[0] == "name":
|
||||
if self.type == "":
|
||||
self.type = token[1]
|
||||
|
||||
@@ -110,12 +110,6 @@
|
||||
application stap can use libvirt to gather data within virtual
|
||||
machines.
|
||||
</dd>
|
||||
<dt><a href="https://github.com/pradels/vagrant-libvirt/">vagrant-libvirt</a></dt>
|
||||
<dd>
|
||||
Vagrant-Libvirt is a Vagrant plugin that uses libvirt to manage virtual
|
||||
machines. It is a command line tool for developers that makes it very
|
||||
fast and easy to deploy and re-deploy an environment of vm's.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2><a name="configmgmt">Configuration Management</a></h2>
|
||||
@@ -163,21 +157,25 @@
|
||||
<h2><a name="conversion">Conversion</a></h2>
|
||||
|
||||
<dl>
|
||||
<dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt>
|
||||
<dt><a href="https://rwmj.wordpress.com/2009/10/13/poor-mans-p2v/">Poor mans p2v</a></dt>
|
||||
<dd>
|
||||
Convert a physical machine to run on KVM. It is a LiveCD
|
||||
which is booted on the machine to be converted. It collects a
|
||||
little information from the user, then copies the disks over
|
||||
to a remote machine and defines the XML for a domain to run
|
||||
the guest. (Note this tool is included with libguestfs)
|
||||
A simple approach for converting a physical machine to a virtual
|
||||
machine, using a rescue CD.
|
||||
</dd>
|
||||
<dt><a href="http://libguestfs.org/virt-v2v.1.html">virt-v2v</a></dt>
|
||||
<dt><a href="http://et.redhat.com/~rjones/virt-p2v/">virt-p2v</a></dt>
|
||||
<dd>
|
||||
virt-v2v converts guests from a foreign hypervisor to run on
|
||||
KVM, managed by libvirt. It can convert guests from VMware or
|
||||
Xen to run on OpenStack, oVirt (RHEV-M), or local libvirt. It
|
||||
An older tool for converting a physical machine into a virtual
|
||||
machine. It is a LiveCD which is booted on the machine to be
|
||||
converted. It collects a little information from the user, then
|
||||
copies the disks over to a remote machine and defines the XML for a
|
||||
domain to run the guest.
|
||||
</dd>
|
||||
<dt><a href="http://git.fedorahosted.org/git/?p=virt-v2v.git;a=summary">virt-v2v</a></dt>
|
||||
<dd>
|
||||
virt-v2v converts guests from a foreign hypervisor to run on KVM,
|
||||
managed by libvirt. It can currently convert Red Hat Enterprise
|
||||
Linux (RHEL) and Fedora guests running on Xen and VMware ESX. It
|
||||
will enable VirtIO drivers in the converted guest if possible.
|
||||
(Note this tool is included with libguestfs)
|
||||
</dd>
|
||||
<dd>
|
||||
For RHEL customers of Red Hat, conversion of Windows guests is also
|
||||
@@ -395,23 +393,6 @@
|
||||
with FreeIPA for Kerberos authentication, and in the future,
|
||||
certificate management.
|
||||
</dd>
|
||||
<dt><a href="http://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
|
||||
<dd>
|
||||
VMmanager is a software solution for virtualization management
|
||||
that can be used both for hosting virtual machines and
|
||||
building a cloud. VMmanager can manage not only one server,
|
||||
but a large cluster of hypervisors. It delivers a number of
|
||||
functions, such as live migration that allows for load
|
||||
balancing between cluster nodes, monitoring CPU, memory.
|
||||
</dd>
|
||||
<dt><a href="http://mist.io/">mist.io</a></dt>
|
||||
<dd>
|
||||
Mist.io is an open source project and a service that can assist you in
|
||||
managing your virtual machines on a unified way, providing a simple
|
||||
interface for all of your infrastructure (multiple public cloud
|
||||
providers, OpenStack based public/private clouds, Docker servers, bare
|
||||
metal servers and now KVM hypervisors).
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2><a name="mobile">Mobile applications</a></h2>
|
||||
|
||||
@@ -285,41 +285,6 @@
|
||||
<dd>Updated path of the host entropy source for the RNG</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a name="typeresourcechardev">console/serial/parallel/channel</a></h4>
|
||||
<p>
|
||||
The <code>msg</code> field will include the following sub-fields
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>chardev</code></dd>
|
||||
<dt>old-chardev</dt>
|
||||
<dd>Original path of the backing character device for given emulated device</dd>
|
||||
<dt>new-chardev</dt>
|
||||
<dd>Updated path of the backing character device for given emulated device</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a name="typeresourcesmartcard">smartcard</a></h4>
|
||||
<p>
|
||||
The <code>msg</code> field will include the following sub-fields
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>smartcard</code></dd>
|
||||
<dt>old-smartcard</dt>
|
||||
<dd>Original path of the backing character device, certificate store or
|
||||
"nss-smartcard-device" for host smartcard passthrough.
|
||||
</dd>
|
||||
<dt>new-smartcard</dt>
|
||||
<dd>Updated path of the backing character device, certificate store or
|
||||
"nss-smartcard-device" for host smartcard passthrough.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a name="typeresourceredir">Redirected device</a></h4>
|
||||
<p>
|
||||
|
||||
@@ -44,10 +44,8 @@
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
<strong>Python</strong>: Libvirt's python bindings are split to a
|
||||
separate <a href="http://libvirt.org/git/?p=libvirt-python.git">package</a>
|
||||
since version 1.2.0, older versions came with direct support for the
|
||||
Python language.
|
||||
<strong>Python</strong>: Libvirt comes with direct support for
|
||||
the Python language.
|
||||
</p>
|
||||
<p>
|
||||
If your libvirt is installed as packages, rather than compiled
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<p>
|
||||
If you think that an issue with libvirt may have security
|
||||
implications, <strong>please do not</strong> publicly
|
||||
implications, <strong>please do not</strong> publically
|
||||
report it in the bug tracker, mailing lists, or irc. Libvirt
|
||||
has <a href="securityprocess.html">a dedicated process for handling (potential) security issues</a>
|
||||
that should be used instead. So if your issue has security
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
<p>
|
||||
The LXC driver is capable of using the <code>cpuset</code>,
|
||||
<code>cpu</code>, <code>cpuacct</code>, <code>freezer</code>,
|
||||
<code>cpu</code>, <code>cpuset</code>, <code>freezer</code>,
|
||||
<code>memory</code>, <code>blkio</code> and <code>devices</code>
|
||||
controllers. The <code>cpuacct</code>, <code>devices</code>
|
||||
controllers. The <code>cpuset</code>, <code>devices</code>
|
||||
and <code>memory</code> controllers are compulsory. Without
|
||||
them mounted, no containers can be started. If any of the
|
||||
other controllers are not mounted, the resource management APIs
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
<p>
|
||||
If you think that an issue with libvirt may have security
|
||||
implications, <strong>please do not</strong> publicly
|
||||
implications, <strong>please do not</strong> publically
|
||||
report it in the bug tracker, mailing lists, or irc. Libvirt
|
||||
has <a href="securityprocess.html">a dedicated process for handling (potential) security issues</a>
|
||||
that should be used instead. So if your issue has security
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
<li><strong><a href="drvhyperv.html">Microsoft Hyper-V</a></strong></li>
|
||||
<li><strong><a href="drvphyp.html">IBM PowerVM (phyp)</a></strong></li>
|
||||
<li><strong><a href="drvparallels.html">Parallels</a></strong></li>
|
||||
<li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="storage">Storage drivers</a></h2>
|
||||
|
||||
@@ -1,254 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Bhyve driver</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
Bhyve is a FreeBSD hypervisor. It first appeared in FreeBSD 10.0. However, it's
|
||||
recommended to keep tracking FreeBSD 10-STABLE to make sure all new features
|
||||
of bhyve are supported.
|
||||
|
||||
In order to enable bhyve on your FreeBSD host, you'll need to load the <code>vmm</code>
|
||||
kernel module. Additionally, <code>if_tap</code> and <code>if_bridge</code> modules
|
||||
should be loaded for networking support.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Additional information on bhyve could be obtained on <a href="http://bhyve.org/">bhyve.org</a>.
|
||||
</p>
|
||||
|
||||
<h2><a name="uri">Connections to the Bhyve driver</a></h2>
|
||||
<p>
|
||||
The libvirt bhyve driver is a single-instance privileged driver. Some sample
|
||||
connection URIs are:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
bhyve:///system (local access)
|
||||
bhyve+unix:///system (local access)
|
||||
bhyve+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||
</pre>
|
||||
|
||||
<h2><a name="exconfig">Example guest domain XML configurations</a></h2>
|
||||
|
||||
<h3>Example config</h3>
|
||||
<p>
|
||||
The bhyve driver in libvirt is in its early stage and under active development. So it supports
|
||||
only limited number of features bhyve provides.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Note: in older libvirt versions, only a single network device and a single
|
||||
disk device were supported per-domain. However,
|
||||
<span class="since">since 1.2.6</span> the libvirt bhyve driver supports
|
||||
up to 31 PCI devices.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Note: the Bhyve driver in libvirt will boot whichever device is first. If you
|
||||
want to install from CD, put the CD device first. If not, put the root HDD
|
||||
first.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Note: Only the SATA bus is supported. Only <code>cdrom</code>- and
|
||||
<code>disk</code>-type disks are supported.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<domain type='bhyve'>
|
||||
<name>bhyve</name>
|
||||
<uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
|
||||
<memory>219136</memory>
|
||||
<currentMemory>219136</currentMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type>hvm</type>
|
||||
</os>
|
||||
<features>
|
||||
<apic/>
|
||||
<acpi/>
|
||||
</features>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<disk type='file'>
|
||||
<driver name='file' type='raw'/>
|
||||
<source file='/path/to/bhyve_freebsd.img'/>
|
||||
<target dev='hda' bus='sata'/>
|
||||
</disk>
|
||||
<disk type='file' device='cdrom'>
|
||||
<driver name='file' type='raw'/>
|
||||
<source file='/path/to/cdrom.iso'/>
|
||||
<target dev='hdc' bus='sata'/>
|
||||
<readonly/>
|
||||
</disk>
|
||||
<interface type='bridge'>
|
||||
<model type='virtio'/>
|
||||
<source bridge="virbr0"/>
|
||||
</interface>
|
||||
</devices>
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<p>(The <disk> sections may be swapped in order to install from
|
||||
<em>cdrom.iso</em>.)</p>
|
||||
|
||||
<h3>Example config (Linux guest)</h3>
|
||||
|
||||
<p>
|
||||
Note the addition of <bootloader>.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<domain type='bhyve'>
|
||||
<name>linux_guest</name>
|
||||
<uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
|
||||
<memory>131072</memory>
|
||||
<currentMemory>131072</currentMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<bootloader>/usr/local/sbin/grub-bhyve</bootloader>
|
||||
<os>
|
||||
<type>hvm</type>
|
||||
</os>
|
||||
<features>
|
||||
<apic/>
|
||||
<acpi/>
|
||||
</features>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='file' type='raw'/>
|
||||
<source file='/path/to/guest_hdd.img'/>
|
||||
<target dev='hda' bus='sata'/>
|
||||
</disk>
|
||||
<disk type='file' device='cdrom'>
|
||||
<driver name='file' type='raw'/>
|
||||
<source file='/path/to/cdrom.iso'/>
|
||||
<target dev='hdc' bus='sata'/>
|
||||
<readonly/>
|
||||
</disk>
|
||||
<interface type='bridge'>
|
||||
<model type='virtio'/>
|
||||
<source bridge="virbr0"/>
|
||||
</interface>
|
||||
</devices>
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<h2><a name="usage">Guest usage / management</a></h2>
|
||||
|
||||
<h3><a name="console">Connecting to a guest console</a></h3>
|
||||
|
||||
<p>
|
||||
Guest console connection is supported through the <code>nmdm</code> device. It could be enabled by adding
|
||||
the following to the domain XML (<span class="since">Since 1.2.4</span>):
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<devices>
|
||||
<serial type="nmdm">
|
||||
<source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
|
||||
</serial>
|
||||
</devices>
|
||||
...</pre>
|
||||
|
||||
|
||||
<p>Make sure to load the <code>nmdm</code> kernel module if you plan to use that.</p>
|
||||
|
||||
<p>
|
||||
Then <code>virsh console</code> command can be used to connect to the text console
|
||||
of a guest.</p>
|
||||
|
||||
<p><b>NB:</b> Some versions of bhyve have a bug that prevents guests from booting
|
||||
until the console is opened by a client. This bug was fixed in FreeBSD
|
||||
<a href="http://svnweb.freebsd.org/changeset/base/262884">r262884</a>. If
|
||||
an older version is used, one either has to open a console manually with <code>virsh console</code>
|
||||
to let a guest boot or start a guest using:</p>
|
||||
|
||||
<pre>start --console domname</pre>
|
||||
|
||||
<p><b>NB:</b> An bootloader configured to require user interaction will prevent
|
||||
the domain from starting (and thus <code>virsh console</code> or <code>start
|
||||
--console</code> from functioning) until the user interacts with it manually on
|
||||
the VM host. Because users typically do not have access to the VM host,
|
||||
interactive bootloaders are unsupported by libvirt. <em>However,</em> if you happen to
|
||||
run into this scenario and also happen to have access to the Bhyve host
|
||||
machine, you may select a boot option and allow the domain to finish starting
|
||||
by using an alternative terminal client on the VM host to connect to the
|
||||
domain-configured null modem device. One example (assuming
|
||||
<code>/dev/nmdm0B</code> is configured as the slave end of the domain serial
|
||||
device) is:</p>
|
||||
|
||||
<pre>cu -l /dev/nmdm0B</pre>
|
||||
|
||||
<h3><a name="xmltonative">Converting from domain XML to Bhyve args</a></h3>
|
||||
|
||||
<p>
|
||||
The <code>virsh domxml-to-native</code> command can preview the actual
|
||||
<code>bhyve</code> commands that will be executed for a given domain.
|
||||
It outputs two lines, the first line is a <code>bhyveload</code> command and
|
||||
the second is a <code>bhyve</code> command.
|
||||
</p>
|
||||
|
||||
<p>Please note that the <code>virsh domxml-to-native</code> doesn't do any
|
||||
real actions other than printing the command, for example, it doesn't try to
|
||||
find a proper TAP interface and create it, like what is done when starting
|
||||
a domain; and always returns <code>tap0</code> for the network interface. So
|
||||
if you're going to run these commands manually, most likely you might want to
|
||||
tweak them.</p>
|
||||
|
||||
<pre>
|
||||
# virsh -c "bhyve:///system" domxml-to-native --format bhyve-argv --xml /path/to/bhyve.xml
|
||||
/usr/sbin/bhyveload -m 214 -d /home/user/vm1.img vm1
|
||||
/usr/sbin/bhyve -c 2 -m 214 -A -I -H -P -s 0:0,hostbridge -s 3:0,virtio-net,tap0,mac=52:54:00:5d:74:e3 -s 2:0,virtio-blk,/home/user/vm1.img -s 1,lpc -l com1,/dev/nmdm0A vm1
|
||||
</pre>
|
||||
|
||||
<h3><a name="zfsvolume">Using ZFS volumes</a></h3>
|
||||
|
||||
<p>It's possible to use ZFS volumes as disk devices <span class="since">since 1.2.8</span>.
|
||||
An example of domain XML device entry for that will look like:</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<disk type='volume' device='disk'>
|
||||
<source pool='zfspool' volume='vol1'/>
|
||||
<target dev='vdb' bus='virtio'/>
|
||||
</disk>
|
||||
...</pre>
|
||||
|
||||
<p>Please refer to the <a href="storage.html">Storage documentation</a> for more details on storage
|
||||
management.</p>
|
||||
|
||||
<h3><a name="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3>
|
||||
|
||||
<p>It's possible to boot non-FreeBSD guests by specifying an explicit
|
||||
bootloader, e.g. <code>grub-bhyve(1)</code>. Arguments to the bootloader may be
|
||||
specified as well. If the bootloader is <code>grub-bhyve</code> and arguments
|
||||
are omitted, libvirt will try and infer boot ordering from user-supplied
|
||||
<boot order='N'> configuration in the domain. Failing that, it will boot
|
||||
the first disk in the domain (either <code>cdrom</code>- or
|
||||
<code>disk</code>-type devices). If the disk type is <code>disk</code>, it will
|
||||
attempt to boot from the first partition in the disk image.</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<bootloader>/usr/local/sbin/grub-bhyve</bootloader>
|
||||
<bootloader_args>...</bootloader_args>
|
||||
...
|
||||
</pre>
|
||||
|
||||
<p>Caveat: <code>bootloader_args</code> does not support any quoting.
|
||||
Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -148,7 +148,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
|
||||
</td>
|
||||
<td>
|
||||
If set to 1, this disables libcurl client checks of the server's
|
||||
SSL certificate. The default value is 0. See the
|
||||
SSL certificate. The default value it 0. See the
|
||||
<a href="#certificates">Certificates for HTTPS</a> section for
|
||||
details.
|
||||
</td>
|
||||
@@ -164,7 +164,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
|
||||
If set to 1, the driver answers all
|
||||
<a href="#questions">questions</a> with the default answer.
|
||||
If set to 0, questions are reported as errors. The default
|
||||
value is 0. <span class="since">Since 0.7.5</span>.
|
||||
value it 0. <span class="since">Since 0.7.5</span>.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -88,8 +88,6 @@ to be provided by all container technologies on Linux.
|
||||
<dd>The fixed string <code>/bin:/usr/bin</code></dd>
|
||||
<dt>TERM</dt>
|
||||
<dd>The fixed string <code>linux</code></dd>
|
||||
<dt>HOME</dt>
|
||||
<dd>The fixed string <code>/</code></dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
@@ -167,7 +165,7 @@ numbered incrementally from there.
|
||||
|
||||
<p>
|
||||
Since /dev/ttyN and /dev/console are linked to the pts devices. The
|
||||
tty device of login program is pts device. The pam module securetty
|
||||
tty device of login program is pts device. the pam module securetty
|
||||
may prevent root user from logging in container. If you want root
|
||||
user to log in container successfully, add the pts device to the file
|
||||
/etc/securetty of container.
|
||||
@@ -542,53 +540,6 @@ debootstrap, whatever) under /opt/vm-1-root:
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<h2><a name="capabilities">Altering the available capabilities</a></h2>
|
||||
|
||||
<p>
|
||||
By default the libvirt LXC driver drops some capabilities among which CAP_MKNOD.
|
||||
However <span class="since">since 1.2.6</span> libvirt can be told to keep or
|
||||
drop some capabilities using a domain configuration like the following:
|
||||
</p>
|
||||
<pre>
|
||||
...
|
||||
<features>
|
||||
<capabilities policy='default'>
|
||||
<mknod state='on'/>
|
||||
<sys_chroot state='off'/>
|
||||
</capabilities>
|
||||
</features>
|
||||
...
|
||||
</pre>
|
||||
<p>
|
||||
The capabilities children elements are named after the capabilities as defined in
|
||||
<code>man 7 capabilities</code>. An <code>off</code> state tells libvirt to drop the
|
||||
capability, while an <code>on</code> state will force to keep the capability even though
|
||||
this one is dropped by default.
|
||||
</p>
|
||||
<p>
|
||||
The <code>policy</code> attribute can be one of <code>default</code>, <code>allow</code>
|
||||
or <code>deny</code>. It defines the default rules for capabilities: either keep the
|
||||
default behavior that is dropping a few selected capabilities, or keep all capabilities
|
||||
or drop all capabilities. The interest of <code>allow</code> and <code>deny</code> is that
|
||||
they guarantee that all capabilities will be kept (or removed) even if new ones are added
|
||||
later.
|
||||
</p>
|
||||
<p>
|
||||
The following example, drops all capabilities but CAP_MKNOD:
|
||||
</p>
|
||||
<pre>
|
||||
...
|
||||
<features>
|
||||
<capabilities policy='deny'>
|
||||
<mknod state='on'/>
|
||||
</capabilities>
|
||||
</features>
|
||||
...
|
||||
</pre>
|
||||
<p>
|
||||
Note that allowing capabilities that are normally dropped by default can seriously
|
||||
affect the security of the container and the host.
|
||||
</p>
|
||||
|
||||
<h2><a name="usage">Container usage / management</a></h2>
|
||||
|
||||
@@ -604,7 +555,7 @@ and LXC. For further details about usage of virsh consult its
|
||||
manual page.
|
||||
</p>
|
||||
|
||||
<h3><a name="usageSave">Defining (saving) container configuration</a></h3>
|
||||
<h3><a name="usageSave">Defining (saving) container configuration></a></h3>
|
||||
|
||||
<p>
|
||||
The <code>virsh define</code> command takes an XML configuration
|
||||
@@ -751,37 +702,5 @@ host
|
||||
# virt-top -c lxc:///
|
||||
</pre>
|
||||
|
||||
<h3><a name="usageConvert">Converting LXC container configuration</a></h3>
|
||||
|
||||
<p>
|
||||
The <code>virsh domxml-from-native</code> command can be used to convert
|
||||
most of the LXC container configuration into a domain XML fragment
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# virsh -c lxc:/// domxml-from-native lxc-tools /var/lib/lxc/myguest/config
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
This conversion has some limitations due to the fact that the
|
||||
domxml-from-native command output has to be independent of the host. Here
|
||||
are a few things to take care of before converting:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
Replace the fstab file referenced by <tt>lxc.mount</tt> by the corresponding
|
||||
lxc.mount.entry lines.
|
||||
</li>
|
||||
<li>
|
||||
Replace all relative sizes of tmpfs mount entries to absolute sizes. Also
|
||||
make sure that tmpfs entries all have a size option (default is 50%).
|
||||
</li>
|
||||
<li>
|
||||
Define <tt>lxc.cgroup.memory.limit_in_bytes</tt> to properly limit the memory
|
||||
available to the container. The conversion will use 64MiB as the default.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -65,7 +65,7 @@ uml+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Once booted the primary console is connected to a PTY, and
|
||||
Once booted the primary console is connected toa PTY, and
|
||||
thus accessible with "virsh console" or equivalent tools
|
||||
</p>
|
||||
|
||||
|
||||
@@ -46,9 +46,9 @@ following fields:</p>
|
||||
<li>level: the error level, usually VIR_ERR_ERROR, though there is room for
|
||||
warnings like VIR_ERR_WARNING</li>
|
||||
<li>message: the full human-readable formatted string of the error</li>
|
||||
<li>conn: if available a pointer to the <a href="html/libvirt-libvirt-host.html#virConnectPtr">virConnectPtr</a>
|
||||
<li>conn: if available a pointer to the <a href="html/libvirt-libvirt.html#virConnectPtr">virConnectPtr</a>
|
||||
connection to the hypervisor where this happened</li>
|
||||
<li>dom: if available a pointer to the <a href="html/libvirt-libvirt-domain.html#virDomainPtr">virDomainPtr</a> domain
|
||||
<li>dom: if available a pointer to the <a href="html/libvirt-libvirt.html#virDomainPtr">virDomainPtr</a> domain
|
||||
targeted in the operation</li>
|
||||
</ul>
|
||||
<p>and then extra raw information about the error which may be initialized
|
||||
|
||||
@@ -4,147 +4,19 @@
|
||||
<body>
|
||||
<h1>Driver capabilities XML format</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<h2><a name="elements">Element and attribute overview</a></h2>
|
||||
|
||||
<p>As new virtualization engine support gets added to libvirt, and to
|
||||
handle cases like QEMU supporting a variety of emulations, a query
|
||||
interface has been added in 0.2.1 allowing to list the set of supported
|
||||
virtualization capabilities on the host:</p>
|
||||
|
||||
<pre> char * virConnectGetCapabilities (virConnectPtr conn);</pre>
|
||||
|
||||
<p>The value returned is an XML document listing the virtualization
|
||||
capabilities of the host and virtualization engine to which
|
||||
<code>@conn</code> is connected. One can test it using <code>virsh</code>
|
||||
command line tool command '<code>capabilities</code>', it dumps the XML
|
||||
associated to the current connection. </p>
|
||||
|
||||
<p>As can be seen seen in the <a href="#elementExamples">example</a>, the
|
||||
capabilities XML consists of the <code>capabilities</code> element which
|
||||
have exactly one <code>host</code> child element to report information on
|
||||
host capabilities, and zero or more <code>guest</code> element to express
|
||||
the set of architectures the host can run at the moment.</p>
|
||||
|
||||
|
||||
<h3><a name="elementHost">Host capabilities</a></h3>
|
||||
|
||||
<p>The <code><host/></code> element consists of the following child
|
||||
elements:</p>
|
||||
<dl>
|
||||
<dt><code>uuid</code></dt>
|
||||
<dd>The host UUID.</dd>
|
||||
|
||||
<dt><code>cpu</code></dt>
|
||||
<dd>The host CPU architecture and features.</dd>
|
||||
|
||||
<dt><code>power_management</code></dt>
|
||||
<dd>whether host is capable of memory suspend, disk hibernation, or
|
||||
hybrid suspend.</dd>
|
||||
|
||||
<dt><code>migration</code></dt>
|
||||
<dd>This element exposes information on the hypervisor's migration
|
||||
capabilities, like live migration, supported URI transports, and so
|
||||
on.</dd>
|
||||
|
||||
<dt><code>topology</code></dt>
|
||||
<dd>This element embodies the host internal topology. Management
|
||||
applications may want to learn this information when orchestrating new
|
||||
guests - e.g. due to reduce inter-NUMA node transfers.</dd>
|
||||
|
||||
<dt><code>secmodel</code></dt>
|
||||
<dd>To find out default security labels for different security models you
|
||||
need to parse this element. In contrast with the former elements, this is
|
||||
repeated for each security model the libvirt daemon currently supports.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h3><a name="elementGuest">Guest capabilities</a></h3>
|
||||
|
||||
<p>While the <a href="#elementHost">previous section</a> aims at host
|
||||
capabilities, this one focuses on capabilities available to a guest
|
||||
using a given hypervisor. The <code><guest/></code> element will
|
||||
typically wrap up the following elements:</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>os_type</code></dt>
|
||||
<dd>This expresses what kind of operating system the hypervisor
|
||||
is able to run. Possible values are:
|
||||
<dl>
|
||||
<dt>xen</dt>
|
||||
<dd>for XEN</dd>
|
||||
|
||||
<dt>linux</dt>
|
||||
<dd>legacy alias for <code>xen</code></dd>
|
||||
|
||||
<dt>hvm</dt>
|
||||
<dd>Unmodified operating system</dd>
|
||||
|
||||
<dt>exe</dt>
|
||||
<dd>Container based virtualization</dd>
|
||||
|
||||
<dt>uml</dt>
|
||||
<dd>User Mode Linux</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
<dt><code>arch</code></dt>
|
||||
<dd>This element brings some information on supported guest architecture.</dd>
|
||||
|
||||
<dt><code>features</code></dt>
|
||||
<dd>This optional element encases possible features that can be used
|
||||
with a guest of described type. Possible subelements are:
|
||||
<dl>
|
||||
<dt>pae</dt><dd>If present, 32-bit guests can use PAE
|
||||
address space extensions, <span class="since">since
|
||||
0.4.1</span></dd>
|
||||
<dt>nonpae</dt><dd>If present, 32-bit guests can be run
|
||||
without requiring PAE, <span class="since">since
|
||||
0.4.1</span></dd>
|
||||
<dt>ia64_be</dt><dd>If present, IA64 guests can be run in
|
||||
big-endian mode, <span class="since">since 0.4.1</span></dd>
|
||||
<dt>acpi</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether the
|
||||
hypervisor exposes ACPI to the guest by default, and
|
||||
the <code>toggle</code> attribute describes whether the
|
||||
user can override this
|
||||
default. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt>apic</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether the
|
||||
hypervisor exposes APIC to the guest by default, and
|
||||
the <code>toggle</code> attribute describes whether the
|
||||
user can override this
|
||||
default. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt>cpuselection</dt><dd>If this element is present, the
|
||||
hypervisor supports the <code><cpu></code> element
|
||||
within a domain definition for fine-grained control over
|
||||
the CPU presented to the
|
||||
guest. <span class="since">Since 0.7.5</span></dd>
|
||||
<dt>deviceboot</dt><dd>If this element is present,
|
||||
the <code><boot order='...'/></code> element can
|
||||
be used inside devices, rather than the older boot
|
||||
specification by category. <span class="since">Since
|
||||
0.8.8</span></dd>
|
||||
<dt>disksnapshot</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether
|
||||
external disk snapshots are supported. If absent,
|
||||
external snapshots may still be supported, but it
|
||||
requires attempting the API and checking for an error to
|
||||
find out for sure. <span class="since">Since
|
||||
1.2.3</span></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementExamples">Examples</a></h3>
|
||||
|
||||
<p>For example, in the case of a 64-bit machine with hardware
|
||||
virtualization capabilities enabled in the chip and
|
||||
BIOS you will see:</p>
|
||||
|
||||
<pre><capabilities>
|
||||
<p>As new virtualization engine support gets added to libvirt, and to handle
|
||||
cases like QEmu supporting a variety of emulations, a query interface has
|
||||
been added in 0.2.1 allowing to list the set of supported virtualization
|
||||
capabilities on the host:</p>
|
||||
<pre> char * virConnectGetCapabilities (virConnectPtr conn);</pre>
|
||||
<p>The value returned is an XML document listing the virtualization
|
||||
capabilities of the host and virtualization engine to which
|
||||
<code>@conn</code> is connected. One can test it using <code>virsh</code>
|
||||
command line tool command '<code>capabilities</code>', it dumps the XML
|
||||
associated to the current connection. For example in the case of a 64 bits
|
||||
machine with hardware virtualization capabilities enabled in the chip and
|
||||
BIOS you will see</p>
|
||||
<pre><capabilities>
|
||||
<span style="color: #E50000"><host>
|
||||
<cpu>
|
||||
<arch>x86_64</arch>
|
||||
@@ -195,5 +67,30 @@
|
||||
</guest></span>
|
||||
...
|
||||
</capabilities></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 <power_management/>
|
||||
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>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,281 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Domain capabilities XML format</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<h2><a name="Overview">Overview</a></h2>
|
||||
|
||||
<p>Sometimes, when a new domain is to be created it may come handy to know
|
||||
the capabilities of the hypervisor so the correct combination of devices and
|
||||
drivers is used. For example, when management application is considering the
|
||||
mode for a host device's passthrough there are several options depending not
|
||||
only on host, but on hypervisor in question too. If the hypervisor is qemu
|
||||
then it needs to be more recent to support VFIO, while legacy KVM is
|
||||
achievable just fine with older qemus.</p>
|
||||
|
||||
<p>The main difference between
|
||||
<a href="/html/libvirt-libvirt-host.html#virConnectGetCapabilities">
|
||||
<code>virConnectGetCapabilities</code>
|
||||
</a>
|
||||
and the emulator capabilities API is, the former one aims more on
|
||||
the host capabilities (e.g. NUMA topology, security models in
|
||||
effect, etc.) while the latter one specializes on the hypervisor
|
||||
capabilities.</p>
|
||||
|
||||
<p>While the <a href="formatcaps.html">Driver Capabilities</a> provides the
|
||||
host capabilities (e.g NUMA topology, security models in effect, etc.), the
|
||||
Domain Capabilities provides the hypervisor specific capabilities for
|
||||
Management Applications to query and make decisions regarding what to
|
||||
utilize.</p>
|
||||
|
||||
<p>The Domain Capabilities can provide information such as the correct
|
||||
combination of devices and drivers that are supported. Knowing which host
|
||||
and hypervisor specific options are available or supported would allow the
|
||||
management application to choose an appropriate mode for a pass-through
|
||||
host device as well as which adapter to utilize.</p>
|
||||
|
||||
<h2><a name="elements">Element and attribute overview</a></h2>
|
||||
|
||||
<p> A new query interface was added to the virConnect API's to retrieve the
|
||||
XML listing of the set of domain capabilities (<span class="since">Since
|
||||
1.2.7</span>):</p>
|
||||
|
||||
<pre>
|
||||
<a href="/html/libvirt-libvirt-domain.html#virConnectGetDomainCapabilities">virConnectGetDomainCapabilities</a>
|
||||
</pre>
|
||||
|
||||
<p>The root element that emulator capability XML document starts with has
|
||||
name <code>domainCapabilities</code>. It contains at least four direct
|
||||
child elements:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
<path>/usr/bin/qemu-system-x86_64</path>
|
||||
<domain>kvm</domain>
|
||||
<machine>pc-i440fx-2.1</machine>
|
||||
<arch>x86_64</arch>
|
||||
...
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
<dl>
|
||||
<dt>path</dt>
|
||||
<dd>The full path to the emulator binary.</dd>
|
||||
|
||||
<dt>domain</dt>
|
||||
<dd>Describes the <a href="formatdomain.html#elements">virtualization
|
||||
type</a> (or so called domain type).</dd>
|
||||
|
||||
<dt>machine</dt>
|
||||
<dd>The domain's <a href="formatdomain.html#elementsOSBIOS">machine
|
||||
type</a>.</dd>
|
||||
|
||||
<dt>arch</dt>
|
||||
<dd>The domain's <a href="formatdomain.html#elementsOSBIOS">
|
||||
architecture</a>.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsCPUAllocation">CPU Allocation</a></h3>
|
||||
|
||||
<p>Before any devices capability occurs, there might be a info on domain
|
||||
wide capabilities, e.g. virtual CPUs:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<vcpu max='255'/>
|
||||
...
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt>vcpu</dt>
|
||||
<dd>The maximum number of supported virtual CPUs</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsOSBIOS">BIOS bootloader</a></h3>
|
||||
|
||||
<p>Sometimes users might want to tweak some BIOS knobs or use
|
||||
UEFI. For cases like that, <a
|
||||
href="formatdomain.html#elementsOSBIOS"><code>os</code></a>
|
||||
element exposes what values can be passed to its children.</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<os supported='yes'>
|
||||
<loader supported='yes'>
|
||||
<value>/usr/share/OVMF/OVMF_CODE.fd</value>
|
||||
<enum name='type'>
|
||||
<value>rom</value>
|
||||
<value>pflash</value>
|
||||
</enum>
|
||||
<enum name='readonly'>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</enum>
|
||||
</loader>
|
||||
</os>
|
||||
...
|
||||
<domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<p>For the <code>loader</code> element, the following can occur:</p>
|
||||
|
||||
<dl>
|
||||
<dt>value</dt>
|
||||
<dd>List of known loader paths. Currently this is only used
|
||||
to advertise known locations of OVMF binaries for qemu. Binaries
|
||||
will only be listed if they actually exist on disk.</dd>
|
||||
|
||||
<dt>type</dt>
|
||||
<dd>Whether loader is a typical BIOS (<code>rom</code>) or
|
||||
an UEFI binary (<code>pflash</code>). This refers to
|
||||
<code>type</code> attribute of the <loader/>
|
||||
element.</dd>
|
||||
|
||||
<dt>readonly</dt>
|
||||
<dd>Options for the <code>readonly</code> attribute of the
|
||||
<loader/> element.</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsDevices">Devices</a></h3>
|
||||
|
||||
<p>
|
||||
The final set of XML elements describe the supported devices and their
|
||||
capabilities. All devices occur as children of the main
|
||||
<code>devices</code> element.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<disk supported='yes'>
|
||||
<enum name='diskDevice'>
|
||||
<value>disk</value>
|
||||
<value>cdrom</value>
|
||||
<value>floppy</value>
|
||||
<value>lun</value>
|
||||
</enum>
|
||||
...
|
||||
</disk>
|
||||
<hostdev supported='no'/>
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<p>Reported capabilities are expressed as an enumerated list of available
|
||||
options for each of the element or attribute. For example, the
|
||||
<disk/> element has an attribute <code>device</code> which can
|
||||
support the values <code>disk</code>, <code>cdrom</code>,
|
||||
<code>floppy</code>, or <code>lun</code>.</p>
|
||||
|
||||
<h4><a name="elementsDisks">Hard drives, floppy disks, CDROMs</a></h4>
|
||||
<p>Disk capabilities are exposed under <code>disk</code> element. For
|
||||
instance:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<disk supported='yes'>
|
||||
<enum name='diskDevice'>
|
||||
<value>disk</value>
|
||||
<value>cdrom</value>
|
||||
<value>floppy</value>
|
||||
<value>lun</value>
|
||||
</enum>
|
||||
<enum name='bus'>
|
||||
<value>ide</value>
|
||||
<value>fdc</value>
|
||||
<value>scsi</value>
|
||||
<value>virtio</value>
|
||||
<value>xen</value>
|
||||
<value>usb</value>
|
||||
<value>uml</value>
|
||||
<value>sata</value>
|
||||
<value>sd</value>
|
||||
</enum>
|
||||
</disk>
|
||||
...
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt>diskDevice</dt>
|
||||
<dd>Options for the <code>device</code> attribute of the <disk/>
|
||||
element.</dd>
|
||||
|
||||
<dt>bus</dt>
|
||||
<dd>Options for the <code>bus</code> attribute of the <target/>
|
||||
element for a <disk/>.</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a name="elementsHostDev">Host device assignment</a></h4>
|
||||
<p>Some host devices can be passed through to a guest (e.g. USB, PCI and
|
||||
SCSI). Well, only if the following is enabled:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<hostdev supported='yes'>
|
||||
<enum name='mode'>
|
||||
<value>subsystem</value>
|
||||
<value>capabilities</value>
|
||||
</enum>
|
||||
<enum name='startupPolicy'>
|
||||
<value>default</value>
|
||||
<value>mandatory</value>
|
||||
<value>requisite</value>
|
||||
<value>optional</value>
|
||||
</enum>
|
||||
<enum name='subsysType'>
|
||||
<value>usb</value>
|
||||
<value>pci</value>
|
||||
<value>scsi</value>
|
||||
</enum>
|
||||
<enum name='capsType'>
|
||||
<value>storage</value>
|
||||
<value>misc</value>
|
||||
<value>net</value>
|
||||
</enum>
|
||||
<enum name='pciBackend'>
|
||||
<value>default</value>
|
||||
<value>kvm</value>
|
||||
<value>vfio</value>
|
||||
<value>xen</value>
|
||||
</enum>
|
||||
</hostdev>
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt>mode</dt>
|
||||
<dd>Options for the <code>mode</code> attribute of the <hostdev/>
|
||||
element.</dd>
|
||||
|
||||
<dt>startupPolicy</dt>
|
||||
<dd>Options for the <code>startupPolicy</code> attribute of the
|
||||
<hostdev/> element.</dd>
|
||||
|
||||
<dt>subsysType</dt>
|
||||
<dd>Options for the <code>type</code> attribute of the <hostdev/>
|
||||
element in case of <code>mode="subsystem"</code>.</dd>
|
||||
|
||||
<dt>capsType</dt>
|
||||
<dd>Options for the <code>type</code> attribute of the <hostdev/>
|
||||
element in case of <code>mode="capabilities"</code>.</dd>
|
||||
|
||||
<dt>pciBackend</dt>
|
||||
<dd>Options for the <code>name</code> attribute of the <driver/>
|
||||
element.</dd>
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
||||
@@ -35,7 +35,7 @@
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<network ipv6='yes' trustGuestRxFilters='no'>
|
||||
<network ipv6='yes'>
|
||||
<name>default</name>
|
||||
<uuid>3e3fce45-4f53-4fa7-bb32-11f34168b82b</uuid>
|
||||
...</pre>
|
||||
@@ -60,16 +60,6 @@
|
||||
to have guest-to-guest communications. For further information,
|
||||
see the example below for the example with no gateway addresses.
|
||||
<span class="since">Since 1.0.1</span></dd>
|
||||
<dt><code>trustGuestRxFilters='yes'</code></dt>
|
||||
<dd>The optional parameter <code>trustGuestRxFilters</code> can
|
||||
be used to set that attribute of the same name for each domain
|
||||
interface connected to this network (<span class="since">since
|
||||
1.2.10</span>). See
|
||||
the <a href="formatdomain.html#elementSNICS">Network
|
||||
interfaces</a> section of the domain XML documentation for
|
||||
more details. Note that an explicit setting of this attribute
|
||||
in a portgroup or the individual domain interface will
|
||||
override the setting in the network.</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsConnect">Connectivity</a></h3>
|
||||
@@ -81,8 +71,8 @@
|
||||
|
||||
<pre>
|
||||
...
|
||||
<bridge name="virbr0" stp="on" delay="5" macTableManager="libvirt"/>
|
||||
<domain name="example.com" localOnly="no"/>
|
||||
<bridge name="virbr0" stp="on" delay="5"/>
|
||||
<domain name="example.com"/>
|
||||
<forward mode="nat" dev="eth0"/>
|
||||
...</pre>
|
||||
|
||||
@@ -92,56 +82,18 @@
|
||||
defines the name of a bridge device which will be used to construct
|
||||
the virtual network. The virtual machines will be connected to this
|
||||
bridge device allowing them to talk to each other. The bridge device
|
||||
may also be connected to the LAN. When defining
|
||||
may also be connected to the LAN. It is recommended that bridge
|
||||
device names started with the prefix <code>vir</code>, but the name
|
||||
<code>virbr0</code> is reserved for the "default" virtual
|
||||
network. This element should always be provided when defining
|
||||
a new network with a <code><forward></code> mode of
|
||||
|
||||
"nat" or "route" (or an isolated network with
|
||||
no <code><forward></code> element), libvirt will
|
||||
automatically generate a unique name for the bridge device if
|
||||
none is given, and this name will be permanently stored in the
|
||||
network configuration so that that the same name will be used
|
||||
every time the network is started. For these types of networks
|
||||
(nat, routed, and isolated), a bridge name beginning with the
|
||||
prefix "virbr" is recommended (and that is what is
|
||||
auto-generated), but not enforced.
|
||||
no <code><forward></code> element).
|
||||
Attribute <code>stp</code> specifies if Spanning Tree Protocol
|
||||
is 'on' or 'off' (default is
|
||||
'on'). Attribute <code>delay</code> sets the bridge's forward
|
||||
delay value in seconds (default is 0).
|
||||
<span class="since">Since 0.3.0</span>
|
||||
|
||||
<p>
|
||||
The <code>macTableManager</code> attribute of the bridge
|
||||
element is used to tell libvirt how the bridge's MAC address
|
||||
table (used to determine the correct egress port for packets
|
||||
based on destination MAC address) will be managed. In the
|
||||
default <code>kernel</code> setting, the kernel
|
||||
automatically adds and removes entries, typically using
|
||||
learning, flooding, and promiscuous mode on the bridge's
|
||||
ports in order to determine the proper egress port for
|
||||
packets. When <code>macTableManager</code> is set
|
||||
to <code>libvirt</code>, libvirt disables kernel management
|
||||
of the MAC table (in the case of the Linux host bridge, this
|
||||
means enabling vlan_filtering on the bridge, and disabling
|
||||
learning and unicast_filter for all bridge ports), and
|
||||
explicitly adds/removes entries to the table according to
|
||||
the MAC addresses in the domain interface configurations.
|
||||
Allowing libvirt to manage the MAC table can improve
|
||||
performance - with a Linux host bridge, for example, turning
|
||||
off learning and unicast_flood on ports has its own
|
||||
performance advantage, and can also lead to an additional
|
||||
boost by permitting the kernel to automatically turn off
|
||||
promiscuous mode on some ports of the bridge (in particular,
|
||||
the port attaching the bridge to the physical
|
||||
network). However, it can also cause some networking setups
|
||||
to stop working (e.g. vlan tagging, multicast,
|
||||
guest-initiated changes to MAC address) and is not supported
|
||||
by older kernels.
|
||||
<span class="since">Since 1.2.11, requires kernel 3.17 or
|
||||
newer</span>
|
||||
</p>
|
||||
|
||||
|
||||
</dd>
|
||||
<dt><code>domain</code></dt>
|
||||
<dd>
|
||||
@@ -151,16 +103,6 @@
|
||||
a <code><forward></code> mode of "nat" or "route" (or an
|
||||
isolated network with no <code><forward></code>
|
||||
element). <span class="since">Since 0.4.5</span>
|
||||
|
||||
<p>
|
||||
If the optional <code>localOnly</code> attribute on the
|
||||
<code>domain</code> element is "yes", then DNS requests under
|
||||
this domain will only be resolved by the virtual network's own
|
||||
DNS server - they will not be forwarded to the host's upstream
|
||||
DNS server. If <code>localOnly</code> is "no", and by
|
||||
default, unresolved requests <b>will</b> be forwarded.
|
||||
<span class="since">Since 1.2.12</span>
|
||||
</p>
|
||||
</dd>
|
||||
<dt><code>forward</code></dt>
|
||||
<dd>Inclusion of the <code>forward</code> element indicates that
|
||||
@@ -200,8 +142,6 @@
|
||||
<p><span class="since">Since 1.0.3</span> it is possible to
|
||||
specify a public IPv4 address and port range to be used for
|
||||
the NAT by using the <code><nat></code> subelement.
|
||||
Note that all addresses from the range are used, not just those
|
||||
that are in use on the host.
|
||||
The address range is set with the <code><address></code>
|
||||
subelements and <code>start</code> and <code>stop</code>
|
||||
attributes:
|
||||
@@ -338,33 +278,28 @@
|
||||
(Single Root I/O Virtualization) virtual function (VF)
|
||||
devices can be assigned in this manner; to assign a
|
||||
standard single-port PCI or PCIe ethernet card to a guest,
|
||||
use the traditional <code><hostdev></code> device
|
||||
use the traditional <code>< hostdev></code> device
|
||||
definition. <span class="since"> Since 0.10.0</span>
|
||||
|
||||
<p>
|
||||
To force use of a particular type of device assignment,
|
||||
a <forward type='hostdev'> interface can have an
|
||||
optional <code>driver</code> sub-element with
|
||||
a <code>name</code> attribute set to either "vfio" (VFIO
|
||||
is a new method of device assignment that is compatible
|
||||
with UEFI Secure Boot) or "kvm" (the legacy device
|
||||
assignment handled directly by the KVM kernel module)
|
||||
<span class="since">Since 1.0.5 (QEMU and KVM only,
|
||||
requires kernel 3.6 or newer)</span>. When specified,
|
||||
device assignment will fail if the requested method of
|
||||
device assignment isn't available on the host. When not
|
||||
specified, the default is "vfio" on systems where the
|
||||
VFIO driver is available and loaded, and "kvm" on older
|
||||
systems, or those where the VFIO driver hasn't been
|
||||
loaded <span class="since">Since 1.1.3</span> (prior to
|
||||
that the default was always "kvm").
|
||||
To use VFIO device assignment rather than
|
||||
traditional/legacy KVM device assignment (VFIO is a new
|
||||
method of device assignment that is compatible with UEFI
|
||||
Secure Boot), a <forward type='hostdev'> interface
|
||||
can have an optional <code>driver</code> sub-element
|
||||
with a <code>name</code> attribute set to "vfio". To use
|
||||
legacy KVM device assignment you can
|
||||
set <code>name</code> to "kvm" (or simply omit the
|
||||
<driver> element, since "kvm" is currently the
|
||||
default).
|
||||
<span class="since">Since 1.0.5 (QEMU and KVM only, requires kernel 3.6 or newer)</span>
|
||||
</p>
|
||||
|
||||
<p>Note that this "intelligent passthrough" of network
|
||||
devices is very similar to the functionality of a
|
||||
standard <code><hostdev></code> device, the
|
||||
standard <code>< hostdev></code> device, the
|
||||
difference being that this method allows specifying a MAC
|
||||
address, vlan tag, and <code><virtualport></code>
|
||||
address, vlan tag, and <code><virtualport ></code>
|
||||
for the passed-through device. If these capabilities are
|
||||
not required, if you have a standard single-port PCI,
|
||||
PCIe, or USB network card that doesn't support SR-IOV (and
|
||||
@@ -433,9 +368,9 @@
|
||||
<span class="since">since 0.10.0</span> When using forward
|
||||
mode 'hostdev', the interface pool is specified with a list
|
||||
of <code><address></code> elements, each of which has
|
||||
<code><type></code> (must always be <code>'pci'</code>),
|
||||
<code>< type></code> (must always be <code>'pci'</code>,
|
||||
<code><domain></code>, <code><bus></code>,
|
||||
<code><slot></code>and <code><function></code>
|
||||
<code><slot></code>, and <code><function></code>
|
||||
attributes.
|
||||
</p>
|
||||
<pre>
|
||||
@@ -476,112 +411,24 @@
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code><bandwidth></code> element allows setting
|
||||
quality of service for a particular network
|
||||
(<span class="since">since 0.9.4</span>). Setting
|
||||
<code>bandwidth</code> for a network is supported only
|
||||
for networks with a <code><forward></code> mode
|
||||
of <code>route</code>, <code>nat</code>, or no mode at all
|
||||
(i.e. an "isolated" network). Setting <code>bandwidth</code>
|
||||
is <b>not</b> supported for forward modes
|
||||
of <code>bridge</code>, <code>passthrough</code>, <code>private</code>,
|
||||
or <code>hostdev</code>. Attempts to do this will lead to
|
||||
a failure to define the network or to create a transient network.
|
||||
</p>
|
||||
<p>
|
||||
The <code><bandwidth></code> element can only be a
|
||||
subelement of a domain's <code><interface></code>, a
|
||||
subelement of a <code><network></code>, or a subelement of
|
||||
a <code><portgroup></code> in a <code><network></code>.
|
||||
</p>
|
||||
<p>
|
||||
As a subelement of a domain's <code><interface></code>,
|
||||
the bandwidth only applies to that one interface of the domain.
|
||||
As a subelement of a <code><network></code>, the bandwidth
|
||||
is a total aggregate bandwidth to/from all guest interfaces attached
|
||||
to that network, <b>not</b> to each guest interface individually.
|
||||
If a domain's <code><interface></code> has
|
||||
<code><bandwidth></code> element values higher
|
||||
than the aggregate for the entire network, then the aggregate
|
||||
bandwidth for the <code><network></code> takes precedence.
|
||||
This is because the two choke points are independent of each other
|
||||
where the domain's <code><interface></code> bandwidth control
|
||||
is applied on the interface's tap device, while the
|
||||
<code><network></code> bandwidth control is applied on the
|
||||
interface part of the bridge device created for that network.
|
||||
</p>
|
||||
<p>
|
||||
As a subelement of a
|
||||
<code><portgroup></code> in a <code><network></code>,
|
||||
if a domain's <code><interface></code> has a
|
||||
<code>portgroup</code> attribute in its
|
||||
<code><source></code> element <b>and</b> if the
|
||||
<code><interface></code>
|
||||
itself has no <code><bandwidth></code> element, then the
|
||||
<code><bandwidth></code> element of the portgroup will be
|
||||
applied individually to each guest interface defined to be a
|
||||
member of that portgroup. Any <code><bandwidth></code>
|
||||
element in the domain's <code><interface></code> definition
|
||||
will override the setting in the portgroup
|
||||
(<span class="since">since 1.0.1</span>).
|
||||
</p>
|
||||
<p>
|
||||
Incoming and outgoing traffic can be shaped independently. The
|
||||
<code>bandwidth</code> element can have at most one
|
||||
<code>inbound</code> and at most one <code>outbound</code>
|
||||
child element. Leaving either of these children elements out
|
||||
results in no QoS applied for that traffic direction. So,
|
||||
when you want to shape only incoming traffic, use
|
||||
<code>inbound</code> only, and vice versa. Each of these
|
||||
elements have one mandatory attribute - <code>average</code> (or
|
||||
<code>floor</code> as described below). The attributes are as follows,
|
||||
where accepted values for each attribute is an integer number.
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>average</code></dt>
|
||||
<dd>
|
||||
Specifies the desired average bit rate for the interface
|
||||
being shaped (in kilobytes/second).
|
||||
</dd>
|
||||
<dt><code>peak</code></dt>
|
||||
<dd>
|
||||
Optional attribute which specifies the maximum rate at
|
||||
which the bridge can send data (in kilobytes/second).
|
||||
Note the limitation of implementation: this attribute in the
|
||||
<code>outbound</code> element is ignored (as Linux ingress
|
||||
filters don't know it yet).
|
||||
</dd>
|
||||
<dt><code>burst</code></dt>
|
||||
<dd>
|
||||
Optional attribute which specifies the amount of kilobytes that
|
||||
can be transmitted in a single burst at <code>peak</code> speed.
|
||||
</dd>
|
||||
<dt><code>floor</code></dt>
|
||||
<dd>
|
||||
Optional attribute available only for the <code>inbound</code>
|
||||
element. This attribute guarantees minimal throughput for
|
||||
shaped interfaces. This, however, requires that all traffic
|
||||
goes through one point where QoS decisions can take place, hence
|
||||
why this attribute works only for virtual networks for now
|
||||
(that is <code><interface type='network'/></code> with a
|
||||
forward type of route, nat, or no forward at all). Moreover, the
|
||||
virtual network the interface is connected to is required to have
|
||||
at least inbound QoS set (<code>average</code> at least). If
|
||||
using the <code>floor</code> attribute users don't need to specify
|
||||
<code>average</code>. However, <code>peak</code> and
|
||||
<code>burst</code> attributes still require <code>average</code>.
|
||||
Currently, the Linux kernel doesn't allow ingress qdiscs to have
|
||||
any classes therefore <code>floor</code> can be applied only
|
||||
on <code>inbound</code> and not <code>outbound</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
Attributes <code>average</code>, <code>peak</code>, and
|
||||
<code>burst</code> are available
|
||||
<span class="since">since 0.9.4</span>, while the
|
||||
<code>floor</code> attribute is available
|
||||
<span class="since">since 1.0.1</span>.
|
||||
This part of network XML provides setting quality of service. Incoming
|
||||
and outgoing traffic can be shaped independently. The
|
||||
<code>bandwidth</code> element can have at most one <code>inbound</code>
|
||||
and at most one <code>outbound</code> child elements. Leaving any of these
|
||||
children element out result in no QoS applied on that traffic direction.
|
||||
So, when you want to shape only network's incoming traffic, use
|
||||
<code>inbound</code> only, and vice versa. Each of these elements have one
|
||||
mandatory attribute <code>average</code>. It specifies average bit rate on
|
||||
interface being shaped. Then there are two optional attributes:
|
||||
<code>peak</code>, which specifies maximum rate at which bridge can send
|
||||
data, and <code>burst</code>, amount of bytes that can be burst at
|
||||
<code>peak</code> speed. Accepted values for attributes are integer
|
||||
numbers, The units for <code>average</code> and <code>peak</code> attributes
|
||||
are kilobytes per second, and for the <code>burst</code> just kilobytes.
|
||||
The rate is shared equally within domains connected to the network.
|
||||
Moreover, <code>bandwidth</code> element can be included in
|
||||
<code>portgroup</code> element.
|
||||
<span class="since">Since 0.9.4</span>
|
||||
</p>
|
||||
|
||||
<h5><a name="elementVlanTag">Setting VLAN tag (on supported network types only)</a></h5>
|
||||
@@ -666,7 +513,7 @@
|
||||
<outbound average='1000' peak='5000' burst='5120'/>
|
||||
</bandwidth>
|
||||
</portgroup></b>
|
||||
<b><portgroup name='sales' trustGuestRxFilters='no'>
|
||||
<b><portgroup name='sales'>
|
||||
<virtualport type='802.1Qbh'>
|
||||
<parameters profileid='salestest'/>
|
||||
</virtualport>
|
||||
@@ -686,9 +533,9 @@
|
||||
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
|
||||
attributes and subelements associated with it. The currently supported
|
||||
subelements associated with it. The currently supported
|
||||
subelements are <code><bandwidth></code>
|
||||
(described <a href="formatnetwork.html#elementQoS">here</a>)
|
||||
(documented <a href="formatdomain.html#elementQoS">here</a>)
|
||||
and <code><virtualport></code>
|
||||
(documented <a href="formatdomain.html#elementsNICSDirect">here</a>).
|
||||
If a domain interface definition specifies a portgroup (by
|
||||
@@ -710,19 +557,6 @@
|
||||
considered an error, and will prevent the interface from
|
||||
starting.
|
||||
</p>
|
||||
<p>
|
||||
portgroups also support the optional
|
||||
parameter <code>trustGuestRxFilters</code> which can be used to
|
||||
set that attribute of the same name for each domain interface
|
||||
using this portgroup (<span class="since">since
|
||||
1.2.10</span>). See
|
||||
the <a href="formatdomain.html#elementSNICS">Network
|
||||
interfaces</a> section of the domain XML documentation for more
|
||||
details. Note that an explicit setting of this attribute in the
|
||||
portgroup overrides the network-wide setting, and an explicit
|
||||
setting in the individual domain interface will override the
|
||||
setting in the portgroup.
|
||||
</p>
|
||||
|
||||
<h5><a name="elementsStaticroute">Static Routes</a></h5>
|
||||
<p>
|
||||
|
||||
@@ -110,28 +110,6 @@
|
||||
have a list of <code>address</code> subelements, one
|
||||
for each VF on this PF.
|
||||
</dd>
|
||||
<dt><code>numa</code></dt>
|
||||
<dd>
|
||||
This optional element contains information on the PCI device
|
||||
with respect to NUMA. For example, the optional
|
||||
<code>node</code> attribute tells which NUMA node is the PCI
|
||||
device associated with.
|
||||
</dd>
|
||||
<dt><code>pci-express</code></dt>
|
||||
<dd>
|
||||
This optional element contains information on PCI Express part of
|
||||
the device. For example, it can contain a child element
|
||||
<code>link</code> which addresses the PCI Express device's link.
|
||||
While a device has it's own capabilities
|
||||
(<code>validity='cap'</code>), the actual run time capabilities
|
||||
are negotiated on the device initialization
|
||||
(<code>validity='sta'</code>). The <code>link</code> element then
|
||||
contains three attributes: <code>port</code> which says in which
|
||||
port is the device plugged in, <code>speed</code> (in
|
||||
GigaTransfers per second) and <code>width</code> for the number
|
||||
of lanes used. Since the port can't be negotiated, it's not
|
||||
exposed in <code>./pci-express/link/[@validity='sta']</code>.
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dt><code>usb_device</code></dt>
|
||||
@@ -176,31 +154,6 @@
|
||||
<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>link</code></dt>
|
||||
<dd>Optional to reflect the status of the link. It has
|
||||
two optional attributes: <code>speed</code> in Mbits per
|
||||
second and <code>state</code> to tell the state of the
|
||||
link. So far, the whole element is just for output,
|
||||
not setting.
|
||||
</dd>
|
||||
<dt><code>feature</code></dt>
|
||||
<dd>If present, the hw offloads supported by this network
|
||||
interface. Possible features are:
|
||||
<dl>
|
||||
<dt><code>rx</code></dt><dd>rx-checksumming</dd>
|
||||
<dt><code>tx</code></dt><dd>tx-checksumming</dd>
|
||||
<dt><code>sg</code></dt><dd>scatter-gather</dd>
|
||||
<dt><code>tso</code></dt><dd>tcp-segmentation-offload</dd>
|
||||
<dt><code>ufo</code></dt><dd>udp-fragmentation-offload</dd>
|
||||
<dt><code>gso</code></dt><dd>generic-segmentation-offload</dd>
|
||||
<dt><code>gro</code></dt><dd>generic-receive-offload</dd>
|
||||
<dt><code>lro</code></dt><dd>large-receive-offload</dd>
|
||||
<dt><code>rxvlan</code></dt><dd>rx-vlan-offload</dd>
|
||||
<dt><code>txvlan</code></dt><dd>tx-vlan-offload</dd>
|
||||
<dt><code>ntuple</code></dt><dd>ntuple-filters</dd>
|
||||
<dt><code>rxhash</code></dt><dd>receive-hashing</dd>
|
||||
</dl>
|
||||
</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
|
||||
@@ -213,17 +166,6 @@
|
||||
<dl>
|
||||
<dt><code>host</code></dt>
|
||||
<dd>The SCSI host number.</dd>
|
||||
<dt><code>unique_id</code></dt>
|
||||
<dd>On input, this optionally provides the value from the
|
||||
'unique_id' file found in the scsi_host's directory. To
|
||||
view the values of all 'unique_id' files, use <code>find -H
|
||||
/sys/class/scsi_host/host{0..9}/unique_id |
|
||||
xargs grep '[0-9]'</code>. On output, if the unique_id
|
||||
file exists, the value from the file will be displayed.
|
||||
This can be used in order to help uniquely identify the
|
||||
scsi_host adapter in a <a href="formatstorage.html">
|
||||
Storage Pool</a>. <span class="since">Since 1.2.7</span>
|
||||
</dd>
|
||||
<dt><code>capability</code></dt>
|
||||
<dd>Current capabilities include "vports_ops" (indicates
|
||||
vport operations are supported) and "fc_host". "vport_ops"
|
||||
@@ -349,10 +291,6 @@
|
||||
<address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
|
||||
<address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
|
||||
</iommuGroup>
|
||||
<pci-express>
|
||||
<link validity='cap' port='1' speed='2.5' width='1'/>
|
||||
<link validity='sta' speed='2.5' width='1'/>
|
||||
</pci-express>
|
||||
</capability>
|
||||
</device>
|
||||
</pre>
|
||||
|
||||
@@ -765,7 +765,7 @@
|
||||
<td>Mask applied to MAC address of destination</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>vlanid</td>
|
||||
<td>vlan-id</td>
|
||||
<td>UINT16 (0x0-0xfff, 0 - 4095)</td>
|
||||
<td>VLAN ID</td>
|
||||
</tr>
|
||||
@@ -989,21 +989,11 @@
|
||||
<td>IP_ADDR</td>
|
||||
<td>Source IP address in ARP/RARP packet</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>arpsrcipmask <span class="since">(Since 1.2.3)</span></td>
|
||||
<td>IP_MASK</td>
|
||||
<td>Source IP mask</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>arpdstipaddr</td>
|
||||
<td>IP_ADDR</td>
|
||||
<td>Destination IP address in ARP/RARP packet</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>arpdstipmask <span class="since">(Since 1.2.3)</span></td>
|
||||
<td>IP_MASK</td>
|
||||
<td>Destination IP mask</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1100,11 +1090,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>End of range of valid destination ports; requires <code>protocol</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1196,26 +1181,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>End of range of valid destination ports; requires <code>protocol</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>type<span class="since">(Since 1.2.12)</span></td>
|
||||
<td>UINT8</td>
|
||||
<td>ICMPv6 type; requires <code>protocol</code> to be set to <code>icmpv6</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>typeend<span class="since">(Since 1.2.12)</span></td>
|
||||
<td>UINT8</td>
|
||||
<td>ICMPv6 type end of range; requires <code>protocol</code> to be set to <code>icmpv6</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>code<span class="since">(Since 1.2.12)</span></td>
|
||||
<td>UINT8</td>
|
||||
<td>ICMPv6 code; requires <code>protocol</code> to be set to <code>icmpv6</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>code<span class="since">(Since 1.2.12)</span></td>
|
||||
<td>UINT8</td>
|
||||
<td>ICMPv6 code end of range; requires <code>protocol</code> to be set to <code>icmpv6</code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1308,11 +1273,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>End of range of valid destination ports</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1428,11 +1388,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>ICMP code</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1532,11 +1487,6 @@
|
||||
<td>IP_ADDR</td>
|
||||
<td>End of range of destination IP address</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1643,11 +1593,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>End of range of valid destination ports</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1749,11 +1694,6 @@
|
||||
<td>UINT16</td>
|
||||
<td>ICMPv6 code</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
@@ -1838,11 +1778,6 @@
|
||||
<td>IPV6_ADDR</td>
|
||||
<td>End of range of destination IP address</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>dscp</td>
|
||||
<td>UINT8 (0x0-0x3f, 0 - 63)</td>
|
||||
<td>Differentiated Services Code Point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>comment <span class="since">(Since 0.8.5)</span></td>
|
||||
<td>STRING</td>
|
||||
|
||||
@@ -106,6 +106,7 @@
|
||||
<pre>
|
||||
<secret ephemeral='no' private='yes'>
|
||||
<description>CEPH passphrase example</description>
|
||||
<auth type='ceph' username='myname'/>
|
||||
<usage type='ceph'>
|
||||
<name>ceph_example</name>
|
||||
</usage>
|
||||
@@ -191,6 +192,7 @@
|
||||
<pre>
|
||||
<secret ephemeral='no' private='yes'>
|
||||
<description>Passphrase for the iSCSI example.com server</description>
|
||||
<auth type='chap' username='myname'/>
|
||||
<usage type='iscsi'>
|
||||
<target>libvirtiscsi</target>
|
||||
</usage>
|
||||
|
||||
@@ -164,30 +164,12 @@
|
||||
attribute <code>type</code> giving the driver type (such
|
||||
as qcow2), of the new file created by the external
|
||||
snapshot of the new file. If <code>source</code> is not
|
||||
given and the disk is backed by a local image file (not
|
||||
a block device or remote storage), a file name is
|
||||
generated that consists of the existing file name
|
||||
with anything after the trailing dot replaced by the
|
||||
snapshot name. Remember that with external
|
||||
given, a file name is generated that consists of the
|
||||
existing file name with anything after the trailing dot
|
||||
replaced by the snapshot name. Remember that with external
|
||||
snapshots, the original file name becomes the read-only
|
||||
snapshot, and the new file name contains the read-write
|
||||
delta of all disk changes since the snapshot.
|
||||
|
||||
<span class="since">Since 1.2.2</span> the <code>disk</code> element
|
||||
supports an optional attribute <code>type</code> if the
|
||||
<code>snapshot</code> attribute is set to <code>external</code>.
|
||||
This attribute specifies the snapshot target storage type and allows
|
||||
to overwrite the default <code>file</code> type. The <code>type</code>
|
||||
attribute along with the format of the <code>source</code>
|
||||
sub-element is identical to the <code>source</code> element used in
|
||||
domain disk definitions. See the
|
||||
<a href="formatdomain.html#elementsDisks">disk devices</a> section
|
||||
documentation for further information.
|
||||
|
||||
Libvirt currently supports the <code>type</code> element in the qemu
|
||||
driver and supported values are <code>file</code>, <code>block</code>
|
||||
and <code>network</code> with a protocol of <code>gluster</code>
|
||||
<span class="since">(since 1.2.2)</span>.
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
@@ -23,9 +23,8 @@
|
||||
(<span class="since">since 0.7.1</span>), <code>rbd</code>
|
||||
(<span class="since">since 0.9.13</span>), <code>sheepdog</code>
|
||||
(<span class="since">since 0.10.0</span>),
|
||||
<code>gluster</code> (<span class="since">since
|
||||
1.2.0</span>) or <code>zfs</code> (<span class="since">since
|
||||
1.2.8</span>). This corresponds to the
|
||||
or <code>gluster</code> (<span class="since">since
|
||||
1.2.0</span>). This corresponds to the
|
||||
storage backend drivers listed further along in this document.
|
||||
</p>
|
||||
<h3><a name="StoragePoolFirst">General metadata</a></h3>
|
||||
@@ -80,31 +79,13 @@
|
||||
<host name="iscsi.example.com"/>
|
||||
<device path="demo-target"/>
|
||||
<auth type='chap' username='myname'>
|
||||
<secret usage='mycluster_myname'/>
|
||||
<secret type='iscsi' usage='mycluster_myname'/>
|
||||
</auth>
|
||||
<vendor name="Acme"/>
|
||||
<product name="model"/>
|
||||
</source>
|
||||
...</pre>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<source>
|
||||
<adapter type='scsi_host' name='scsi_host1'/>
|
||||
</source>
|
||||
...</pre>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<source>
|
||||
<adapter type='scsi_host'>
|
||||
<parentaddr unique_id='1'>
|
||||
<address domain='0x0000' bus='0x00' slot='0x1f' addr='0x2'/>
|
||||
</parentaddr>
|
||||
</adapter>
|
||||
</source>
|
||||
...</pre>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<source>
|
||||
@@ -116,7 +97,7 @@
|
||||
<dt><code>device</code></dt>
|
||||
<dd>Provides the source for pools backed by physical devices
|
||||
(pool types <code>fs</code>, <code>logical</code>, <code>disk</code>,
|
||||
<code>iscsi</code>, <code>zfs</code>).
|
||||
<code>iscsi</code>).
|
||||
May be repeated multiple times depending on backend driver. Contains
|
||||
a single attribute <code>path</code> which is the fully qualified
|
||||
path to the block device node. <span class="since">Since 0.4.1</span></dd>
|
||||
@@ -130,160 +111,25 @@
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>adapter</code></dt>
|
||||
<dd>Provides the source for pools backed by SCSI adapters (pool
|
||||
type <code>scsi</code>). May only occur once.
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>The SCSI adapter name (e.g. "scsi_host1", although a name
|
||||
such as "host1" is still supported for backwards compatibility,
|
||||
it is not recommended). The scsi_host name to be used can be
|
||||
determined from the output of a <code>virsh nodedev-list
|
||||
scsi_host</code> command followed by a combination of
|
||||
<code>lspci</code> and <code>virsh nodedev-dumpxml
|
||||
scsi_hostN</code> commands to find the <code>scsi_hostN</code>
|
||||
to be used. <span class="since">Since 0.6.2</span>
|
||||
<p>
|
||||
It is further recommended to utilize the
|
||||
<code>parentaddr</code> element since it's possible to have
|
||||
the path to which the scsi_hostN uses change between system
|
||||
reboots. <span class="since">Since 1.2.7</span>
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>Specifies the adapter type. Valid values are "scsi_host" or
|
||||
"fc_host". If omitted and the <code>name</code> attribute is
|
||||
specified, then it defaults to "scsi_host". To keep backwards
|
||||
compatibility, this attribute is optional <b>only</b> for the
|
||||
"scsi_host" adapter, but is mandatory for the "fc_host" adapter.
|
||||
<span class="since">Since 1.0.5</span>
|
||||
A "fc_host" capable scsi_hostN can be determined by using
|
||||
<code>virsh nodedev-list --cap fc_host</code>.
|
||||
<span class="since">Since 1.2.8</span>
|
||||
<p>
|
||||
Note: Regardless of whether a "scsi_host" adapter type is defined
|
||||
using a <code>name</code> or a <code>parentaddr</code>, it
|
||||
should refer to a real scsi_host adapter as found through a
|
||||
<code>virsh nodedev-list scsi_host</code> and <code>virsh
|
||||
nodedev-dumpxml scsi_hostN</code> on one of the scsi_host's
|
||||
displayed. It should not refer to a "fc_host" capable scsi_hostN
|
||||
nor should it refer to the vHBA created for some "fc_host"
|
||||
adapter. For a vHBA the <code>nodedev-dumpxml</code>
|
||||
output parent setting will be the "fc_host" capable scsi_hostN
|
||||
value. Additionally, do not refer to an iSCSI scsi_hostN for the
|
||||
"scsi_host" source. An iSCSI scsi_hostN's
|
||||
<code>nodedev-dumpxml</code> output parent field is generally
|
||||
"computer". This is a libvirt created parent value indicating
|
||||
no parent was defined for the node device.
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>wwnn</code> and <code>wwpn</code></dt>
|
||||
<dd>The "World Wide Node Name" (<code>wwnn</code>) and "World Wide
|
||||
Port Name" (<code>wwpn</code>) are used by the "fc_host" adapter
|
||||
to uniquely identify the device in the Fibre Channel storage fabric
|
||||
(the device can be either a HBA or vHBA). Both wwnn and wwpn should
|
||||
be specified. Use the command 'virsh nodedev-dumpxml' to determine
|
||||
how to set the values for the wwnn/wwpn of a (v)HBA. The wwnn and
|
||||
wwpn have very specific numerical format requirements based on the
|
||||
hypervisor being used, thus care should be taken if you decide to
|
||||
generate your own to follow the standards; otherwise, the pool
|
||||
will fail to start with an opaque error message indicating failure
|
||||
to write to the vport_create file during vport create/delete due
|
||||
to "No such file or directory".
|
||||
<span class="since">Since 1.0.4</span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>parent</code></dt>
|
||||
<dd>Used by the "fc_host" adapter type to optionally specify the
|
||||
parent scsi_host device defined in the
|
||||
<a href="formatnode.html">Node Device</a> database as the
|
||||
<a href="http://wiki.libvirt.org/page/NPIV_in_libvirt">NPIV</a>
|
||||
virtual Host Bus Adapter (vHBA). The value provided must be
|
||||
a vport capable scsi_host. The value is not the scsi_host of
|
||||
the vHBA created by 'virsh nodedev-create', rather it is
|
||||
the parent of that vHBA. If the value is not provided, libvirt
|
||||
will determine the parent based either finding the wwnn,wwpn
|
||||
defined for an existing scsi_host or by creating a vHBA. Providing
|
||||
the parent attribute is also useful for the duplicate pool
|
||||
definition checks. This is more important in environments where
|
||||
both the "fc_host" and "scsi_host" source adapter pools are being
|
||||
used in order to ensure a new definition doesn't duplicate using
|
||||
the scsi_hostN of some existing storage pool.
|
||||
<span class="since">Since 1.0.4</span>
|
||||
</dd>
|
||||
<dt><code>managed</code></dt>
|
||||
<dd>An optional attribute to instruct the SCSI storage backend to
|
||||
manage destroying the vHBA when the pool is destroyed. For
|
||||
configurations that do not provide an already created vHBA
|
||||
from a 'virsh nodedev-create', libvirt will set this property
|
||||
to "yes". For configurations that have already created a vHBA
|
||||
via 'virsh nodedev-create' and are using the wwnn/wwpn from
|
||||
that vHBA and optionally the scsi_host parent, setting this
|
||||
attribute to "yes" will allow libvirt to destroy the node device
|
||||
when the pool is destroyed. If this attribute is set to "no" or
|
||||
not defined in the XML, then libvirt will not destroy the vHBA.
|
||||
<span class="since">Since 1.2.11</span>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>parentaddr</code></dt>
|
||||
<dd>Used by the "scsi_host" adapter type instead of the
|
||||
<code>name</code> attribute to more uniquely identify the
|
||||
SCSI host. Using a combination of the <code>unique_id</code>
|
||||
attribute and the <code>address</code> element to formulate
|
||||
a PCI address, a search will be performed of the
|
||||
<code>/sys/class/scsi_host/hostNN</code> links for a
|
||||
matching PCI address with a matching <code>unique_id</code>
|
||||
value in the <code>/sys/class/scsi_host/hostNN/unique_id</code>
|
||||
file. The value in the "unique_id" file will be unique enough
|
||||
for the specific PCI address. The <code>hostNN</code> will be
|
||||
used by libvirt as the basis to define which SCSI host is to
|
||||
be used for the currently booted system.
|
||||
<span class="since">Since 1.2.7</span>
|
||||
<dl>
|
||||
<dt><code>address</code></dt>
|
||||
<dd>The PCI address of the scsi_host device to be used. Using
|
||||
a PCI address provides consistent naming across system reboots
|
||||
and kernel reloads. The address will have four attributes:
|
||||
<code>domain</code> (a 2-byte hex integer, not currently used
|
||||
by qemu), <code>bus</code> (a hex value between 0 and 0xff,
|
||||
inclusive), <code>slot</code> (a hex value between 0x0 and
|
||||
0x1f, inclusive), and <code>function</code> (a value between
|
||||
0 and 7, inclusive). The PCI address can be determined by
|
||||
listing the <code>/sys/bus/pci/devices</code> and the
|
||||
<code>/sys/class/scsi_host</code> directories in order to
|
||||
find the expected scsi_host device. The address will be
|
||||
provided in a format such as "0000:00:1f:2" which can be
|
||||
used to generate the expected PCI address
|
||||
"domain='0x0000' bus='0x00' slot='0x1f' function='0x0'".
|
||||
Optionally, using the combination of the commands 'virsh
|
||||
nodedev-list scsi_host' and 'virsh nodedev-dumpxml' for a
|
||||
specific list entry and converting the resulting
|
||||
<code>path</code> element as the basis to formulate the
|
||||
correctly formatted PCI address.
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>unique_id</code></dt>
|
||||
<dd>Required <code>parentaddr</code> attribute used to determine
|
||||
which of the scsi_host adapters for the provided PCI address
|
||||
should be used. The value is determine by contents of the
|
||||
<code>unique_id</code> file for the specific scsi_host adapter.
|
||||
For a PCI address of "0000:00:1f:2", the unique identifer files
|
||||
can be found using the command
|
||||
<code>find -H /sys/class/scsi_host/host*/unique_id |
|
||||
xargs grep '[0-9]'</code>. Optionally, the
|
||||
<code>virsh nodedev-dumpxml scsi_hostN</code>' of a
|
||||
specific scsi_hostN list entry will list the
|
||||
<code>unique_id</code> value.
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
type <code>scsi</code>). May
|
||||
only occur once. Attribute <code>name</code> is the SCSI adapter
|
||||
name (ex. "scsi_host1". NB, although a name such as "host1" is
|
||||
still supported for backwards compatibility, it is not recommended).
|
||||
Attribute <code>type</code> (<span class="since">1.0.5</span>)
|
||||
specifies the adapter type. Valid values are "fc_host" and "scsi_host".
|
||||
If omitted and the <code>name</code> attribute is specified, then it
|
||||
defaults to "scsi_host". To keep backwards compatibility, the attribute
|
||||
<code>type</code> is optional for the "scsi_host" adapter, but
|
||||
mandatory for the "fc_host" adapter. Attributes <code>wwnn</code>
|
||||
(Word Wide Node Name) and <code>wwpn</code> (Word Wide Port Name)
|
||||
(<span class="since">1.0.4</span>) are used by the "fc_host" adapter
|
||||
to uniquely identify the device in the Fibre Channel storage fabric
|
||||
(the device can be either a HBA or vHBA). Both wwnn and wwpn should
|
||||
be specified (See command 'virsh nodedev-dumpxml' to known how to get
|
||||
wwnn/wwpn of a (v)HBA). The optional attribute <code>parent</code>
|
||||
(<span class="since">1.0.4</span>) specifies the parent device for
|
||||
the "fc_host" adapter.
|
||||
<span class="since">Since 0.6.2</span></dd>
|
||||
<dt><code>host</code></dt>
|
||||
<dd>Provides the source for pools backed by storage from a
|
||||
remote server (pool types <code>netfs</code>, <code>iscsi</code>,
|
||||
@@ -386,7 +232,7 @@
|
||||
like the logical choice, however, devices nodes there are not
|
||||
guaranteed stable across reboots, since they are allocated on
|
||||
demand. It is preferable to use a stable location such as one
|
||||
of the <code>/dev/disk/by-{path|id|uuid|label}</code> locations.
|
||||
of the <code>/dev/disk/by-{path,id,uuid,label</code> locations.
|
||||
<span class="since">Since 0.4.1</span>
|
||||
</dd>
|
||||
<dt><code>permissions</code></dt>
|
||||
@@ -463,18 +309,10 @@
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>Providing a name for the volume which is unique to the pool.
|
||||
This is mandatory when defining a volume. For a disk pool, the
|
||||
name must be combination of the <code>source</code> device path
|
||||
device and next partition number to be created. For example, if
|
||||
the <code>source</code> device path is /dev/sdb and there are no
|
||||
partitions on the disk, then the name must be sdb1 with the next
|
||||
name being sdb2 and so on.
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
This is mandatory when defining a volume. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>key</code></dt>
|
||||
<dd>Providing an identifier for the volume which identifies a
|
||||
single volume. In some cases it's possible to have two distinct keys
|
||||
identifying a single volume. This field cannot be set when creating
|
||||
a volume: it is always generated.
|
||||
<dd>Providing an identifier for the volume which is globally unique.
|
||||
This cannot be set when creating a volume: it is always generated.
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>allocation</code></dt>
|
||||
<dd>Providing the total storage allocation for the volume. This
|
||||
@@ -545,7 +383,6 @@
|
||||
<label>virt_image_t</label>
|
||||
</permissions>
|
||||
<compat>1.1</compat>
|
||||
<nocow/>
|
||||
<features>
|
||||
<lazy_refcounts/>
|
||||
</features>
|
||||
@@ -559,18 +396,12 @@
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>format</code></dt>
|
||||
<dd>Provides information about the pool specific volume format.
|
||||
For disk pools it will provide the partition table format type, but is
|
||||
not preserved after a pool refresh or libvirtd restart. Use extended
|
||||
in order to create an extended disk extent partition. For filesystem
|
||||
For disk pools it will provide the partition type. For filesystem
|
||||
or directory pools it will provide the file format type, eg cow,
|
||||
qcow, vmdk, raw. If omitted when creating a volume, the pool's
|
||||
default format will be used. The actual format is specified via
|
||||
the <code>type</code> attribute. Consult the
|
||||
<a href="storage.html">storage driver page</a> for the list of valid
|
||||
volume format type values for each specific pool. The
|
||||
<code>format</code> will be ignored on input for pools without a
|
||||
volume format type value and the default pool format will be used.
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
the <code>type</code> attribute. Consult the pool-specific docs for
|
||||
the list of valid values. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>permissions</code></dt>
|
||||
<dd>Provides information about the default permissions to use
|
||||
when creating volumes. This is currently only useful for directory
|
||||
@@ -588,15 +419,8 @@
|
||||
<code>type='qcow2'</code> volumes. Valid values are <code>0.10</code>
|
||||
and <code>1.1</code> so far, specifying QEMU version the images should
|
||||
be compatible with. If the <code>feature</code> element is present,
|
||||
1.1 is used.
|
||||
<span class="since">Since 1.1.0</span> If omitted, 0.10 is used.
|
||||
<span class="since">Since 1.1.2</span>
|
||||
</dd>
|
||||
<dt><code>nocow</code></dt>
|
||||
<dd>Turn off COW of the newly created volume. So far, this is only valid
|
||||
for a file image in btrfs file system. It will improve performance when
|
||||
the file image is used in VM. To create non-raw file images, it
|
||||
requires QEMU version since 2.1. <span class="since">Since 1.2.7</span>
|
||||
1.1 is used. If omitted, qemu-img default is used.
|
||||
<span class="since">Since 1.1.0</span>
|
||||
</dd>
|
||||
<dt><code>features</code></dt>
|
||||
<dd>Format-specific features. Only used for <code>qcow2</code> now.
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
</p>
|
||||
<h3><a name="StorageEncryptionDefault">"default" format</a></h3>
|
||||
<p>
|
||||
<code><encryption format="default"/></code> can be specified only
|
||||
<code><encryption type="default"/></code> can be specified only
|
||||
when creating a volume. If the volume is successfully created, the
|
||||
encryption formats, parameters and secrets will be auto-generated by
|
||||
libvirt and the attached <code>encryption</code> tag will be updated.
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
body {
|
||||
margin: 0em;
|
||||
padding: 0px;
|
||||
|
||||
@@ -1,294 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Project governance</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
The libvirt project operates as a meritocratic, consensus-based community.
|
||||
Anyone with an interest in the project can join the community, contributing
|
||||
to the ongoing development of the project's work. This pages describes how
|
||||
that participation takes place and how contributors earn merit, and thus
|
||||
influence, within the community.
|
||||
</p>
|
||||
|
||||
<h2><a name="codeofconduct">Code of conduct</a></h2>
|
||||
|
||||
<p>
|
||||
The libvirt project community covers people from a wide variety of
|
||||
countries, backgrounds and positions. This global diversity is a great
|
||||
strength of the project, but can also lead to communication issues,
|
||||
which may in turn cause unhappiness. To maximise happiness of the
|
||||
project community taken as a whole, all members (whether users,
|
||||
contributors or committers) are expected to abide by the project's
|
||||
code of conduct. At a high level the code can be summarized as
|
||||
<em>"be excellent to each other"</em>. Expanding on this:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Be respectful:</strong> disagreements between people are to
|
||||
be expected and are usually the sign of healthy debate and engagement.
|
||||
Disagreements can lead to frustration and even anger for some members.
|
||||
Turning to personal insults, intimidation or threatening behaviour does
|
||||
not improve the situation though. Participants should thus take care to
|
||||
ensure all communications / interactions stay professional at all times.</li>
|
||||
|
||||
<li><strong>Be considerate:</strong> remember that the community has members
|
||||
with a diverse background many of whom have English as a second language.
|
||||
What might appear impolite, may simply be a result of a lack of knowledge
|
||||
of the English language. Bear in mind that actions will have an impact
|
||||
on other community members and the project as a whole, so take potential
|
||||
consequences into account before pursuing a course of action.</li>
|
||||
|
||||
<li><strong>Be forgiving:</strong> humans are fallible and as such prone
|
||||
to make mistakes and inexplicably change their positions at times. Don't
|
||||
assume that other members are acting with malicious intent. Be prepared
|
||||
to forgive people who make mistakes and assist each other in learning
|
||||
from them. Playing a blame game doesn't help anyone.</li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="roles">Roles and responsibilities</a></h2>
|
||||
|
||||
<h3><a href="users">Users</a></h3>
|
||||
|
||||
<p>
|
||||
The users are anyone who has a need for the output of the project.
|
||||
There are no rules or requirements to become a user of libvirt. Even
|
||||
if the software does not yet work on their OS platform, a person can
|
||||
be considered a potential future user and welcomed to participate.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Participation by users is key to ensuring the project moves in the
|
||||
right direction, satisfying their real world needs. Users are
|
||||
encouraged to participate in the broader libvirt community in any
|
||||
number of ways:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Evangelism: spread the word about what libvirt is doing, how it
|
||||
helps solve your problems. This can be via blog articles, social
|
||||
media postings, video blogs, user group / conference presentations
|
||||
and any other method of disseminating information</li>
|
||||
<li>Feedback: let the developers know about what does and does not
|
||||
work with the project. Talk to developers on the project's
|
||||
IRC channel and mailing list, or find them at conferences. Tell
|
||||
them what gaps the project has or where they should look for
|
||||
future development</li>
|
||||
<li>Moral support: developers live for recognition of the positive
|
||||
impact their work has on users' lives. Give thanks to the developers
|
||||
when evangelising the project, or when meeting them at user groups,
|
||||
conferences, etc.</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The above is not an exhaustive list of things users can do to
|
||||
participate in the project. Further ideas and suggestions are
|
||||
welcome. Users are encouraged to take their participation
|
||||
further and become contributors to the project in any of the
|
||||
ways listed in the next section.
|
||||
</p>
|
||||
|
||||
<h3><a name="contributors">Contributors</a></h3>
|
||||
|
||||
<p>
|
||||
The contributors are community members who have some concrete impact
|
||||
to the ongoing development of the project. There are many ways in which
|
||||
members can contribute, with no requirement to be a software engineer.
|
||||
Many users can in fact consider themselves contributors merely by
|
||||
engaging in evangelism for the project.
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Bug reporting: improve the quality of the project by reporting
|
||||
any problems found either to the project's own bug tracker, or to
|
||||
that of the OS vendor shipping the libvirt code.</li>
|
||||
<li>User help: join the <a href="contact.html">IRC channel or mailing list</a>
|
||||
to assist or advice other users in troubleshooting the problems they face.</li>
|
||||
<li>Feature requests: help set the direction for future work by
|
||||
reporting details of features which are missing to the project's
|
||||
own bug tracker or mailing lists.</li>
|
||||
<li>Graphical design: contribute to the development of the project's
|
||||
websites / wiki brand with improved graphics, styling or layout.</li>
|
||||
<li>Code development: write and submit patches to address bugs or implement
|
||||
new features</li>
|
||||
<li>Architectural design: improve the usefulness of the project
|
||||
by providing feedback on the design of proposed features, to
|
||||
ensure they satisfy the broadest applicable needs and survive
|
||||
the long term</li>
|
||||
<li>Code review: look at patches which are submitted and critique
|
||||
the code to identify bugs, potential design problems or other
|
||||
issues which should be addressed before the code is accepted</li>
|
||||
<li>Documentation: contribute to content on personal blogs, the
|
||||
website, wiki, code comments, or any of the formal documentation
|
||||
efforts.</li>
|
||||
<li>Translation: join the Fedora transifex community to improve the
|
||||
quality of translations needed by the libvirt project.</li>
|
||||
<li>Testing: try proposed patches or release candidates and report
|
||||
whether the build passes and the changes work as expected.</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The above is not an exhaustive list of things members can do to
|
||||
contribute to the project. Further ideas and suggestions are
|
||||
welcome.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
There are no special requirements to becoming a contributor other
|
||||
than having the interest and ability to provide a contribution. The
|
||||
libvirt project <strong>does not require</strong> any
|
||||
<em>"Contributor License Agreement"</em>
|
||||
to be signed prior to engagement with the community.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In making a contribution to the project, the community member is
|
||||
implicitly stating that they accept the terms of the license under
|
||||
which the work they are contributing to is distributed. They are
|
||||
also implicitly stating that they have the legal right to make the
|
||||
contribution, if doing so on behalf of a broader organization /
|
||||
company. Most of the project's code is distributed under the GNU
|
||||
Lesser General Public License, version 2 or later. Details of the
|
||||
exact license under which contributions will be presumed to be
|
||||
covered are found in the source repositories, or website in question.
|
||||
</p>
|
||||
|
||||
<h3><a name="committers">Committers</a></h3>
|
||||
|
||||
<p>
|
||||
The committers are the subset of contributors who have direct access
|
||||
to commit code to the project's primary source code repositories, which
|
||||
are currently using the GIT software. The committers are chosen based
|
||||
on the quality of their contributions over a period of time. This includes
|
||||
both the quality of code they submit, as well as the quality of reviews
|
||||
they provide on other contributors' submissions and a demonstration that
|
||||
they understand day-to-day operation of the project and its goals. There
|
||||
is no minimum level of contribution required in order to become a committer,
|
||||
though 2-3 months worth of quality contribution would be a rough guide.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
There are no special requirements to becoming a committer other than to
|
||||
have shown a willingness and ability to contribute to the project over
|
||||
an extended period of time. Proposals for elevating contributors to
|
||||
committers are typically made by existing committers, though contributors
|
||||
are also welcome to make proposals. The decision to approve the elevation
|
||||
of a contributor to a committer is made through "rough consensus" between
|
||||
the existing committers.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The aim in elevating contributors to committers is to ensure that there
|
||||
is a broad base of experience and expertize across all areas of the
|
||||
project's work. Committers are not required to have knowledge across
|
||||
all areas of the project's work. While an approved committer has the
|
||||
technical ability to commit code to any area of the project, by convention
|
||||
they will only commit to areas they feel themselves to be qualified to
|
||||
evaluate the contribution. If in doubt, committers will defer to the
|
||||
opinion of other committers with greater expertize in an area.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The committers hold the ultimate control over what contributions are
|
||||
accepted by the project, however, this does not mean they have the
|
||||
right to do whatever they want. Where there is debate and disagreement
|
||||
between contributors, committers are expected to look at the issues with
|
||||
an unbiased point of view and help achieve a "rough consensus". If the
|
||||
committer has a conflict of interest in the discussion, for example due
|
||||
to their position of employment, they are expected to put the needs of
|
||||
the community project first. If they cannot put the community project
|
||||
first, they must declare their conflict of interest, and allow other
|
||||
non-conflicted committers to make any final decision.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The committers are expected to monitor contributions to areas of the
|
||||
project where they have expertize and ensure that either some form of
|
||||
feedback is provided to the contributor, or to accept their contribution.
|
||||
There is no formal minimum level of approval required to accept a
|
||||
contribution. Positive review by any committer experienced in the area
|
||||
of work is considered to be enough to justify acceptance in normal
|
||||
circumstances. Where one committer explicitly rejects a contribution,
|
||||
however, other committers should not override that rejection without
|
||||
first establishing a "rough consensus" amongst the broader group of
|
||||
committers.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Being a committer is a privilege, not a right. In exceptional
|
||||
circumstances, the privilege may be removed from an active
|
||||
contributor. Such decisions will be taken based on "rough
|
||||
consensus" amongst other committers. In the event that a committer
|
||||
is no longer able to participate in the project, after some period
|
||||
of inactivity passes, they may be asked to confirm that they wish
|
||||
to retain their role as a committer.
|
||||
</p>
|
||||
|
||||
<h3><a name="secteam">Security team</a></h3>
|
||||
|
||||
<p>
|
||||
The security team consists of a subset of the project committers
|
||||
along with representatives from vendors shipping the project's
|
||||
software. The subset of project committers is chosen to be the
|
||||
minimal size necessary to provide expertise spanning most of
|
||||
the project's work. Further project committers may be requested
|
||||
to engage in resolving specific security issues on a case by
|
||||
case basis. Any vendor who is shipping the project's software
|
||||
may submit a request for one or more of their representatives
|
||||
to join the security team. Such requests must by approved by
|
||||
existing members of the team vouching for the integrity of
|
||||
the nominated person or organization.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Members of the security team are responsible for triaging and
|
||||
resolving any security issues that are reported to the project.
|
||||
They are expected to abide by the project's documented
|
||||
<a href="securityprocess.html">security process</a>. In particular
|
||||
they must respect any embargo period agreed amongst the team
|
||||
before disclosing a private issue.
|
||||
</p>
|
||||
|
||||
<h2><a name="roughconsensus">Rough consensus</a></h2>
|
||||
|
||||
<p>
|
||||
A core concept for governance of the project described above is
|
||||
that of "rough consensus". To expand on this, it is a process
|
||||
of decision making that involves the following steps
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Proposal</li>
|
||||
<li>Discussion</li>
|
||||
<li>Vote (exceptional circumstances only)</li>
|
||||
<li>Decision</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
To put this into words, any contributor is welcome to make a proposal
|
||||
for consideration. Any contributor may participate in the discussions
|
||||
around the proposal. The discussion will usually result in agreement
|
||||
between the interested parties, or at least agreement between the
|
||||
committers. Only in the very exceptional circumstance where there
|
||||
is disagreement between committers, would a vote be considered.
|
||||
Even in these exceptional circumstances, it is usually found to be
|
||||
obvious what the majority opinion of the committers is. In the event
|
||||
that even a formal vote is tied, the committers will have to hold
|
||||
ongoing discussions until the stalemate is resolved or the proposal
|
||||
withdrawn.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The overall goal of the "rough consensus" process is to ensure that
|
||||
decisions can be made within the project, with a minimum level of
|
||||
bureaucracy and process. Implicit in this is that any person who does
|
||||
not explicitly reject to a proposal is assumed to be supportive, or
|
||||
at least agnostic.
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,11 +11,6 @@
|
||||
<li>Discuss any large changes on the mailing list first. Post patches
|
||||
early and listen to feedback.</li>
|
||||
|
||||
<li>Official upstream repository is kept in git
|
||||
(<code>git://libvirt.org/libvirt.git</code>) and is browsable
|
||||
along with other libvirt-related repositories
|
||||
(e.g. libvirt-python) <a href="http://libvirt.org/git/">online</a>.</li>
|
||||
|
||||
<li><p>Post patches in unified diff format, with git rename
|
||||
detection enabled. You need a one-time setup of:</p>
|
||||
<pre>
|
||||
@@ -65,7 +60,7 @@
|
||||
review your patch set. One should avoid sending patches as attachments,
|
||||
but rather send them in email body along with commit message. If a
|
||||
developer is sending another version of the patch (e.g. to address
|
||||
review comments), they are advised to note differences to previous
|
||||
review comments), he is advised to note differences to previous
|
||||
versions after the <code>---</code> line in the patch so that it helps
|
||||
reviewers but doesn't become part of git history. Moreover, such patch
|
||||
needs to be prefixed correctly with
|
||||
@@ -127,7 +122,7 @@
|
||||
Some tests are skipped by default in a development environment,
|
||||
based on the time they take in comparison to the likelihood
|
||||
that those tests will turn up problems during incremental builds.
|
||||
These tests default to being run when building from a
|
||||
These tests default to being run when when building from a
|
||||
tarball or with the configure option --enable-expensive-tests;
|
||||
you can also force a one-time toggle of these tests by
|
||||
setting VIR_TEST_EXPENSIVE to 0 or 1 at make time, as in:
|
||||
@@ -265,7 +260,7 @@
|
||||
<p>
|
||||
There is more on this subject, including lots of links to background
|
||||
reading on the subject, on
|
||||
<a href="http://people.redhat.com/rjones/how-to-supply-code-to-open-source-projects/">
|
||||
<a href="http://et.redhat.com/~rjones/how-to-supply-code-to-open-source-projects/">
|
||||
Richard Jones' guide to working with open source projects</a>.
|
||||
</p>
|
||||
|
||||
@@ -278,11 +273,26 @@
|
||||
In short, use spaces-not-TABs for indentation, use 4 spaces for each
|
||||
indentation level, and other than that, follow the K&R style.
|
||||
</p>
|
||||
<p>
|
||||
If you use Emacs, add the following to one of one of your start-up files
|
||||
(e.g., ~/.emacs), to help ensure that you get indentation right:
|
||||
</p>
|
||||
<pre>
|
||||
;;; When editing C sources in libvirt, use this style.
|
||||
(defun libvirt-c-mode ()
|
||||
"C mode with adjusted defaults for use with libvirt."
|
||||
(interactive)
|
||||
(c-set-style "K&R")
|
||||
(setq indent-tabs-mode nil) ; indent using spaces, not TABs
|
||||
(setq c-indent-level 4)
|
||||
(setq c-basic-offset 4))
|
||||
(add-hook 'c-mode-hook
|
||||
'(lambda () (if (string-match "/libvirt" (buffer-file-name))
|
||||
(libvirt-c-mode))))
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If you use Emacs, the project includes a file .dir-locals.el
|
||||
that sets up the preferred indentation. If you use vim,
|
||||
append the following to your ~/.vimrc file:
|
||||
If you use vim, append the following to your ~/.vimrc file:
|
||||
</p>
|
||||
<pre>
|
||||
set nocompatible
|
||||
@@ -293,7 +303,7 @@
|
||||
set tabstop=8
|
||||
set shiftwidth=4
|
||||
set expandtab
|
||||
set cinoptions=(0,:0,l1,t0,L3
|
||||
set cinoptions=(0,:0,l1,t0
|
||||
filetype plugin indent on
|
||||
au FileType make setlocal noexpandtab
|
||||
au BufRead,BufNewFile *.am setlocal noexpandtab
|
||||
@@ -462,30 +472,20 @@
|
||||
|
||||
<p>
|
||||
Omit the curly braces around an <code>if</code>, <code>while</code>,
|
||||
<code>for</code> etc. body only when both that body and the condition
|
||||
itself occupy a single line. In every other case we require
|
||||
<code>for</code> etc. body only
|
||||
when that body occupies a single line. In every other case we require
|
||||
the braces. This ensures that it is trivially easy to identify a
|
||||
single-<i>statement</i> loop: each has only one <i>line</i> in its body.
|
||||
</p>
|
||||
<p>
|
||||
Omitting braces with a single-line body is fine:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
while (expr) // single line body; {} is forbidden
|
||||
while (expr) // one-line body -> omitting curly braces is ok
|
||||
single_line_stmt();
|
||||
</pre>
|
||||
|
||||
<pre>
|
||||
while (expr(arg1,
|
||||
arg2)) // indentation makes it obvious it is single line,
|
||||
single_line_stmt(); // {} is optional (not enforced either way)
|
||||
</pre>
|
||||
|
||||
<pre>
|
||||
while (expr1 &&
|
||||
expr2) { // multi-line, at same indentation, {} required
|
||||
single_line_stmt();
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
However, the moment your loop/if/else body extends on to a second
|
||||
line, for whatever reason (even if it's just an added comment), then
|
||||
@@ -608,37 +608,6 @@
|
||||
}
|
||||
</pre>
|
||||
|
||||
<p>Use hanging braces for compound statements: the opening brace
|
||||
of a compound statement should be on the same line as the
|
||||
condition being tested. Only top-level function bodies, nested
|
||||
scopes, and compound structure declarations should ever have {
|
||||
on a line by itself.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
void
|
||||
foo(int a, int b)
|
||||
{ // correct - function body
|
||||
int 2d[][] = {
|
||||
{ // correct - complex initialization
|
||||
1, 2,
|
||||
},
|
||||
};
|
||||
if (a)
|
||||
{ // BAD: compound brace on its own line
|
||||
do_stuff();
|
||||
}
|
||||
{ // correct - nested scope
|
||||
int tmp;
|
||||
if (a < b) { // correct - hanging brace
|
||||
tmp = b;
|
||||
b = a;
|
||||
a = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h2><a name="preprocessor">Preprocessor</a></h2>
|
||||
|
||||
<p>Macros defined with an ALL_CAPS name should generally be
|
||||
@@ -660,7 +629,7 @@
|
||||
</p>
|
||||
<pre>
|
||||
#if defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_FALLOCATE)
|
||||
# define fallocate(a, ignored, b, c) posix_fallocate(a, b, c)
|
||||
# define fallocate(a,ignored,b,c) posix_fallocate(a,b,c)
|
||||
#endif
|
||||
</pre>
|
||||
|
||||
@@ -994,7 +963,7 @@
|
||||
<p>
|
||||
If there is a need for complex string concatenations, avoid using
|
||||
the usual sequence of malloc/strcpy/strcat/snprintf functions and
|
||||
make use of the virBuffer API described in virbuffer.h
|
||||
make use of the virBuffer API described in buf.h
|
||||
</p>
|
||||
|
||||
<p>Typical usage is as follows:</p>
|
||||
@@ -1014,8 +983,11 @@
|
||||
|
||||
...
|
||||
|
||||
if (virBufferCheckError(&buf) < 0)
|
||||
if (virBufferError(&buf)) {
|
||||
virBufferFreeAndReset(&buf);
|
||||
virReportOOMError();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return virBufferContentAndReset(&buf);
|
||||
}
|
||||
@@ -1167,20 +1139,6 @@
|
||||
retry: If needing to jump upwards (e.g., retry on EINTR)
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Top-level labels should be indented by one space (putting them on
|
||||
the beginning of the line confuses function context detection in git):
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
int foo()
|
||||
{
|
||||
/* ... do stuff ... */
|
||||
cleanup:
|
||||
/* ... do other stuff ... */
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<h2><a name="committers">Libvirt committer guidelines</a></h2>
|
||||
|
||||
@@ -13,15 +13,9 @@
|
||||
actions occur:</p>
|
||||
<ul>
|
||||
<li>The libvirt daemon starts, stops, or reloads its
|
||||
configuration
|
||||
(<span class="since">since 0.8.0</span>)<br/><br/></li>
|
||||
<li>A QEMU guest is started or stopped
|
||||
(<span class="since">since 0.8.0</span>)<br/><br/></li>
|
||||
<li>An LXC guest is started or stopped
|
||||
(<span class="since">since 0.8.0</span>)<br/><br/></li>
|
||||
<li>A network is started or stopped or an interface is
|
||||
plugged/unplugged to/from the network
|
||||
(<span class="since">since 1.2.2</span>)<br/><br/></li>
|
||||
configuration<br/><br/></li>
|
||||
<li>A QEMU guest is started or stopped<br/><br/></li>
|
||||
<li>An LXC guest is started or stopped<br/><br/></li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="location">Script location</a></h2>
|
||||
@@ -50,9 +44,6 @@
|
||||
Executed when a QEMU guest is started, stopped, or migrated<br/><br/></li>
|
||||
<li><code>/etc/libvirt/hooks/lxc</code><br /><br/>
|
||||
Executed when an LXC guest is started or stopped</li>
|
||||
<li><code>/etc/libvirt/hooks/network</code><br/><br/>
|
||||
Executed when a network is started or stopped or an
|
||||
interface is plugged/unplugged to/from the network</li>
|
||||
</ul>
|
||||
<br/>
|
||||
|
||||
@@ -75,39 +66,6 @@
|
||||
XML description for the domain on their stdin. This includes items
|
||||
such the UUID of the domain and its storage information, and is
|
||||
intended to provide all the libvirt information the script needs.</p>
|
||||
<p>For all cases, stdin of the network hook script is provided with the
|
||||
full XML description of the network status in the following form:</p>
|
||||
|
||||
<pre><hookData>
|
||||
<network>
|
||||
<name>$network_name</name>
|
||||
<uuid>afca425a-2c3a-420c-b2fb-dd7b4950d722</uuid>
|
||||
...
|
||||
</network>
|
||||
</hookData></pre>
|
||||
|
||||
<p>In the case of an interface
|
||||
being plugged/unplugged to/from the network, the network XML will be
|
||||
followed with the full XML description of the domain containing the
|
||||
interface that is being plugged/unplugged:</p>
|
||||
|
||||
<pre><hookData>
|
||||
<network>
|
||||
<name>$network_name</name>
|
||||
<uuid>afca425a-2c3a-420c-b2fb-dd7b4950d722</uuid>
|
||||
...
|
||||
</network>
|
||||
<domain type='$domain_type' id='$domain_id'>
|
||||
<name>$domain_name</name>
|
||||
<uuid>afca425a-2c3a-420c-b2fb-dd7b4950d722</uuid>
|
||||
...
|
||||
</domain>
|
||||
</hookData></pre>
|
||||
|
||||
<p>Please note that this approach is different from other cases such as
|
||||
<code>daemon</code>, <code>qemu</code> or <code>lxc</code> hook scripts,
|
||||
because two XMLs may be passed here, while in the other cases only a single
|
||||
XML is passed.</p>
|
||||
|
||||
<p>The command line arguments take this approach:</p>
|
||||
<ol>
|
||||
@@ -177,17 +135,6 @@
|
||||
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>
|
||||
<li><span class="since">Since 1.2.9</span>, the qemu hook script is
|
||||
also called when restoring a saved image either via the API or
|
||||
automatically when restoring a managed save machine. It is called
|
||||
as: <pre>/etc/libvirt/hooks/qemu guest_name restore 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, restore of the
|
||||
image will be aborted. This hook may be used, e.g., to change
|
||||
location of disk images for restored domains.</li>
|
||||
<li><span class="since">Since 0.9.13</span>, the qemu hook script
|
||||
is also called when the libvirtd daemon restarts and reconnects
|
||||
to previously running QEMU processes. If the script fails, the
|
||||
@@ -234,49 +181,25 @@
|
||||
<pre>/etc/libvirt/hooks/lxc guest_name reconnect begin -</pre>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h5><a name="network">/etc/libvirt/hooks/network</a></h5>
|
||||
<ul>
|
||||
<li><span class="since">Since 1.2.2</span>, before a network is started,
|
||||
this script is called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name start begin -</pre></li>
|
||||
<li>After the network is started, up ∧ running, the script is
|
||||
called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name started begin -</pre></li>
|
||||
<li>When a network is shut down, this script is called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name stopped end -</pre></li>
|
||||
<li>Later, when network is started and there's an interface from a
|
||||
domain to be plugged into the network, the hook script is called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name plugged begin -</pre>
|
||||
Please note, that in this case, the script is passed both network and
|
||||
domain XMLs on its stdin.</li>
|
||||
<li>When the domain from previous case is shutting down, the interface
|
||||
is unplugged. This leads to another script invocation:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name unplugged begin -</pre>
|
||||
And again, as in previous case, both network and domain XMLs are passed
|
||||
onto script's stdin.</li>
|
||||
</ul>
|
||||
|
||||
<br/>
|
||||
|
||||
<h2><a name="execution">Script execution</a></h2>
|
||||
<ul>
|
||||
<li>The "start" operation for the guest and network hook scripts,
|
||||
executes <b>prior</b> to the object (guest or network) being created.
|
||||
This allows the object start operation to be aborted if the script
|
||||
returns indicating failure.<br/><br/></li>
|
||||
<li>The "shutdown" operation for the guest and network hook scripts,
|
||||
executes <b>after</b> the object (guest or network) has stopped. If
|
||||
the hook script indicates failure in its return, the shut down of the
|
||||
object cannot be aborted because it has already been performed.
|
||||
<br/><br/></li>
|
||||
<li>The "start" operation for the guest hook scripts, qemu and lxc,
|
||||
executes <b>prior</b> to the guest being created. This allows the
|
||||
guest start operation to be aborted if the script returns indicating
|
||||
failure.<br/><br/></li>
|
||||
<li>The "shutdown" operation for the guest hook scripts, qemu and lxc,
|
||||
executes <b>after</b> the guest has stopped. If the hook script
|
||||
indicates failure in its return, the shut down of the guest cannot
|
||||
be aborted because it has already been performed.<br/><br/></li>
|
||||
<li>Hook scripts execute in a synchronous fashion. Libvirt waits
|
||||
for them to return before continuing the given operation.<br/><br/>
|
||||
This is most noticeable with the guest or network start operation,
|
||||
as a lengthy operation in the hook script can mean an extended wait
|
||||
for the guest or network to be available to end users.<br/><br/></li>
|
||||
This is most noticeable with the guest start operation, as a lengthy
|
||||
operation in the hook script can mean an extended wait for the guest
|
||||
to be available to end users.<br/><br/></li>
|
||||
<li>For a hook script to be utilised, it must have its execute bit set
|
||||
(e.g. chmod o+rx <i>qemu</i>), and must be present when the libvirt
|
||||
(ie. chmod o+rx <i>qemu</i>), and must be present when the libvirt
|
||||
daemon is started.<br/><br/></li>
|
||||
<li>If a hook script is added to a host after the libvirt daemon is
|
||||
already running, it won't be used until the libvirt daemon
|
||||
|
||||
@@ -4,8 +4,6 @@ use strict;
|
||||
use warnings;
|
||||
|
||||
use File::Find;
|
||||
use XML::XPath;
|
||||
use XML::XPath::XMLParser;
|
||||
|
||||
die "syntax: $0 SRCDIR\n" unless int(@ARGV) == 1;
|
||||
|
||||
@@ -14,20 +12,10 @@ my $srcdir = shift @ARGV;
|
||||
my $symslibvirt = "$srcdir/libvirt_public.syms";
|
||||
my $symsqemu = "$srcdir/libvirt_qemu.syms";
|
||||
my $symslxc = "$srcdir/libvirt_lxc.syms";
|
||||
my @drivertable = (
|
||||
"$srcdir/driver-hypervisor.h",
|
||||
"$srcdir/driver-interface.h",
|
||||
"$srcdir/driver-network.h",
|
||||
"$srcdir/driver-nodedev.h",
|
||||
"$srcdir/driver-nwfilter.h",
|
||||
"$srcdir/driver-secret.h",
|
||||
"$srcdir/driver-state.h",
|
||||
"$srcdir/driver-storage.h",
|
||||
"$srcdir/driver-stream.h",
|
||||
);
|
||||
my $drivertable = "$srcdir/driver.h";
|
||||
|
||||
my %groupheaders = (
|
||||
"virHypervisorDriver" => "Hypervisor APIs",
|
||||
"virDriver" => "Hypervisor APIs",
|
||||
"virNetworkDriver" => "Virtual Network APIs",
|
||||
"virInterfaceDriver" => "Host Interface APIs",
|
||||
"virNodeDeviceDriver" => "Host Device APIs",
|
||||
@@ -40,7 +28,7 @@ my %groupheaders = (
|
||||
my @srcs;
|
||||
find({
|
||||
wanted => sub {
|
||||
if (m!$srcdir/.*/\w+_(driver|common|tmpl|monitor|hal|udev)\.c$!) {
|
||||
if (m!$srcdir/.*/\w+_(driver|tmpl|monitor|hal|udev)\.c$!) {
|
||||
push @srcs, $_ if $_ !~ /vbox_driver\.c/;
|
||||
}
|
||||
}, no_chdir => 1}, $srcdir);
|
||||
@@ -54,7 +42,6 @@ open FILE, "<$symslibvirt"
|
||||
|
||||
my $vers;
|
||||
my $prevvers;
|
||||
my $apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-api.xml");
|
||||
while (defined($line = <FILE>)) {
|
||||
chomp $line;
|
||||
next if $line =~ /^\s*#/;
|
||||
@@ -78,10 +65,7 @@ while (defined($line = <FILE>)) {
|
||||
$prevvers = $vers;
|
||||
$vers = undef;
|
||||
} elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
|
||||
my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file");
|
||||
$apis{$1} = {};
|
||||
$apis{$1}->{vers} = $vers;
|
||||
$apis{$1}->{file} = $file;
|
||||
$apis{$1} = $vers;
|
||||
} else {
|
||||
die "unexpected data $line\n";
|
||||
}
|
||||
@@ -97,7 +81,6 @@ open FILE, "<$symsqemu"
|
||||
|
||||
$prevvers = undef;
|
||||
$vers = undef;
|
||||
$apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-qemu-api.xml");
|
||||
while (defined($line = <FILE>)) {
|
||||
chomp $line;
|
||||
next if $line =~ /^\s*#/;
|
||||
@@ -121,10 +104,7 @@ while (defined($line = <FILE>)) {
|
||||
$prevvers = $vers;
|
||||
$vers = undef;
|
||||
} elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
|
||||
my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file");
|
||||
$apis{$1} = {};
|
||||
$apis{$1}->{vers} = $vers;
|
||||
$apis{$1}->{file} = $file;
|
||||
$apis{$1} = $vers;
|
||||
} else {
|
||||
die "unexpected data $line\n";
|
||||
}
|
||||
@@ -140,7 +120,6 @@ open FILE, "<$symslxc"
|
||||
|
||||
$prevvers = undef;
|
||||
$vers = undef;
|
||||
$apixpath = XML::XPath->new(filename => "$srcdir/../docs/libvirt-lxc-api.xml");
|
||||
while (defined($line = <FILE>)) {
|
||||
chomp $line;
|
||||
next if $line =~ /^\s*#/;
|
||||
@@ -164,10 +143,7 @@ while (defined($line = <FILE>)) {
|
||||
$prevvers = $vers;
|
||||
$vers = undef;
|
||||
} elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
|
||||
my $file = $apixpath->find("/api/symbols/function[\@name='$1']/\@file");
|
||||
$apis{$1} = {};
|
||||
$apis{$1}->{vers} = $vers;
|
||||
$apis{$1}->{file} = $file;
|
||||
$apis{$1} = $vers;
|
||||
} else {
|
||||
die "unexpected data $line\n";
|
||||
}
|
||||
@@ -178,27 +154,27 @@ close FILE;
|
||||
|
||||
# Some special things which aren't public APIs,
|
||||
# but we want to report
|
||||
$apis{virConnectSupportsFeature}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePerform}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigrateFinish}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare2}->{vers} = "0.5.0";
|
||||
$apis{virDomainMigrateFinish2}->{vers} = "0.5.0";
|
||||
$apis{virDomainMigratePrepareTunnel}->{vers} = "0.7.2";
|
||||
$apis{virConnectSupportsFeature} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare} = "0.3.2";
|
||||
$apis{virDomainMigratePerform} = "0.3.2";
|
||||
$apis{virDomainMigrateFinish} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare2} = "0.5.0";
|
||||
$apis{virDomainMigrateFinish2} = "0.5.0";
|
||||
$apis{virDomainMigratePrepareTunnel} = "0.7.2";
|
||||
|
||||
$apis{virDomainMigrateBegin3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePrepare3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePrepareTunnel3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePerform3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigrateFinish3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigrateConfirm3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigrateBegin3} = "0.9.2";
|
||||
$apis{virDomainMigratePrepare3} = "0.9.2";
|
||||
$apis{virDomainMigratePrepareTunnel3} = "0.9.2";
|
||||
$apis{virDomainMigratePerform3} = "0.9.2";
|
||||
$apis{virDomainMigrateFinish3} = "0.9.2";
|
||||
$apis{virDomainMigrateConfirm3} = "0.9.2";
|
||||
|
||||
$apis{virDomainMigrateBegin3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePrepare3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePrepareTunnel3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePerform3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigrateFinish3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigrateConfirm3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigrateBegin3Params} = "1.1.0";
|
||||
$apis{virDomainMigratePrepare3Params} = "1.1.0";
|
||||
$apis{virDomainMigratePrepareTunnel3Params} = "1.1.0";
|
||||
$apis{virDomainMigratePerform3Params} = "1.1.0";
|
||||
$apis{virDomainMigrateFinish3Params} = "1.1.0";
|
||||
$apis{virDomainMigrateConfirm3Params} = "1.1.0";
|
||||
|
||||
|
||||
|
||||
@@ -206,44 +182,42 @@ $apis{virDomainMigrateConfirm3Params}->{vers} = "1.1.0";
|
||||
# and driver struct fields. This lets us later match
|
||||
# update the driver impls with the public APis.
|
||||
|
||||
open FILE, "<$drivertable"
|
||||
or die "cannot read $drivertable: $!";
|
||||
|
||||
# Group name -> hash of APIs { fields -> api name }
|
||||
my %groups;
|
||||
my $ingrp;
|
||||
foreach my $drivertable (@drivertable) {
|
||||
open FILE, "<$drivertable"
|
||||
or die "cannot read $drivertable: $!";
|
||||
while (defined($line = <FILE>)) {
|
||||
if ($line =~ /struct _(vir\w*Driver)/) {
|
||||
my $grp = $1;
|
||||
if ($grp ne "virStateDriver" &&
|
||||
$grp ne "virStreamDriver") {
|
||||
$ingrp = $grp;
|
||||
$groups{$ingrp} = { apis => {}, drivers => {} };
|
||||
}
|
||||
} elsif ($ingrp) {
|
||||
if ($line =~ /^\s*vir(?:Drv)(\w+)\s+(\w+);\s*$/) {
|
||||
my $field = $2;
|
||||
my $name = $1;
|
||||
|
||||
while (defined($line = <FILE>)) {
|
||||
if ($line =~ /struct _(vir\w*Driver)/) {
|
||||
my $grp = $1;
|
||||
if ($grp ne "virStateDriver" &&
|
||||
$grp ne "virStreamDriver") {
|
||||
$ingrp = $grp;
|
||||
$groups{$ingrp} = { apis => {}, drivers => {} };
|
||||
}
|
||||
} elsif ($ingrp) {
|
||||
if ($line =~ /^\s*vir(?:Drv)(\w+)\s+(\w+);\s*$/) {
|
||||
my $field = $2;
|
||||
my $name = $1;
|
||||
|
||||
my $api;
|
||||
if (exists $apis{"vir$name"}) {
|
||||
$api = "vir$name";
|
||||
} elsif ($name =~ /\w+(Open|Close)/) {
|
||||
next;
|
||||
} else {
|
||||
die "driver $name does not have a public API";
|
||||
}
|
||||
$groups{$ingrp}->{apis}->{$field} = $api;
|
||||
} elsif ($line =~ /};/) {
|
||||
$ingrp = undef;
|
||||
my $api;
|
||||
if (exists $apis{"vir$name"}) {
|
||||
$api = "vir$name";
|
||||
} elsif ($name =~ /\w+(Open|Close)/) {
|
||||
next;
|
||||
} else {
|
||||
die "driver $name does not have a public API";
|
||||
}
|
||||
$groups{$ingrp}->{apis}->{$field} = $api;
|
||||
} elsif ($line =~ /};/) {
|
||||
$ingrp = undef;
|
||||
}
|
||||
}
|
||||
|
||||
close FILE;
|
||||
}
|
||||
|
||||
close FILE;
|
||||
|
||||
|
||||
# Finally, we read all the primary driver files and extract
|
||||
# the driver API tables from each one.
|
||||
@@ -316,43 +290,43 @@ foreach my $src (@srcs) {
|
||||
# have a bit of manual fixup todo with the per-driver versioning
|
||||
# and support matrix
|
||||
|
||||
$groups{virHypervisorDriver}->{apis}->{"openAuth"} = "virConnectOpenAuth";
|
||||
$groups{virHypervisorDriver}->{apis}->{"openReadOnly"} = "virConnectOpenReadOnly";
|
||||
$groups{virHypervisorDriver}->{apis}->{"domainMigrate"} = "virDomainMigrate";
|
||||
$groups{virDriver}->{apis}->{"openAuth"} = "virConnectOpenAuth";
|
||||
$groups{virDriver}->{apis}->{"openReadOnly"} = "virConnectOpenReadOnly";
|
||||
$groups{virDriver}->{apis}->{"domainMigrate"} = "virDomainMigrate";
|
||||
|
||||
my $openAuthVers = (0 * 1000 * 1000) + (4 * 1000) + 0;
|
||||
|
||||
foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
|
||||
my $openVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
|
||||
my $openVersStr = $groups{"virDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
my $openVers;
|
||||
if ($openVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
|
||||
$openVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
|
||||
}
|
||||
|
||||
# virConnectOpenReadOnly always matches virConnectOpen version
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenReadOnly"} =
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenReadOnly"} =
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
|
||||
# virConnectOpenAuth is always 0.4.0 if the driver existed
|
||||
# before this time, otherwise it matches the version of
|
||||
# the driver's virConnectOpen entry
|
||||
if ($openVersStr eq "Y" ||
|
||||
$openVers >= $openAuthVers) {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = $openVersStr;
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = $openVersStr;
|
||||
} else {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = "0.4.0";
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = "0.4.0";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Another special case for the virDomainCreateLinux which was replaced
|
||||
# with virDomainCreateXML
|
||||
$groups{virHypervisorDriver}->{apis}->{"domainCreateLinux"} = "virDomainCreateLinux";
|
||||
$groups{virDriver}->{apis}->{"domainCreateLinux"} = "virDomainCreateLinux";
|
||||
|
||||
my $createAPIVers = (0 * 1000 * 1000) + (0 * 1000) + 3;
|
||||
|
||||
foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
|
||||
my $createVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
|
||||
foreach my $drv (keys %{$groups{"virDriver"}->{drivers}}) {
|
||||
my $createVersStr = $groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
|
||||
next unless defined $createVersStr;
|
||||
my $createVers;
|
||||
if ($createVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
|
||||
@@ -364,9 +338,9 @@ foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
|
||||
# the driver's virCreateXML entry
|
||||
if ($createVersStr eq "Y" ||
|
||||
$createVers >= $createAPIVers) {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = $createVersStr;
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = $createVersStr;
|
||||
} else {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = "0.0.3";
|
||||
$groups{"virDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = "0.0.3";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -393,7 +367,7 @@ in.
|
||||
|
||||
EOF
|
||||
|
||||
foreach my $grp (sort { $a cmp $b } keys %groups) {
|
||||
foreach my $grp (sort { $a cmp $b } keys %groups) {
|
||||
print "<h2><a name=\"$grp\">", $groupheaders{$grp}, "</a></h2>\n";
|
||||
print <<EOF;
|
||||
<table class="top_table">
|
||||
@@ -420,23 +394,10 @@ EOF
|
||||
$groups{$grp}->{apis}->{$b}
|
||||
} keys %{$groups{$grp}->{apis}}) {
|
||||
my $api = $groups{$grp}->{apis}->{$field};
|
||||
my $vers = $apis{$api}->{vers};
|
||||
my $htmlgrp = $apis{$api}->{file};
|
||||
my $vers = $apis{$api};
|
||||
print <<EOF;
|
||||
<tr>
|
||||
<td>
|
||||
EOF
|
||||
|
||||
if (defined $htmlgrp) {
|
||||
print <<EOF;
|
||||
<a href=\"html/libvirt-$htmlgrp.html#$api\">$api</a>
|
||||
EOF
|
||||
|
||||
} else {
|
||||
print $api;
|
||||
}
|
||||
print <<EOF;
|
||||
</td>
|
||||
<td><a href=\"html/libvirt-libvirt.html#$api\">$api</a></td>
|
||||
<td>$vers</td>
|
||||
EOF
|
||||
|
||||
|
||||
@@ -30,11 +30,6 @@
|
||||
<li>
|
||||
A <a href="/qpid/">QMF agent</a> for the AMQP/QPid messaging system
|
||||
</li>
|
||||
<li>
|
||||
A <a href="governance.html">technical meritocracy</a>, in which
|
||||
participants gain influence over a project through recognition
|
||||
of their contributions.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2>libvirt supports:</h2>
|
||||
@@ -74,9 +69,6 @@
|
||||
<li>
|
||||
The <a href="http://libvirt.org/drvparallels.html">Parallels</a> hypervisor
|
||||
</li>
|
||||
<li>
|
||||
The <a href="http://libvirt.org/drvbhyve.html">Bhyve</a> hypervisor
|
||||
</li>
|
||||
<li>
|
||||
Virtual networks using bridging, NAT, VEPA and VN-LINK.
|
||||
</li>
|
||||
|
||||
@@ -430,7 +430,7 @@
|
||||
if (string)
|
||||
VIR_DEBUG("about to run %s", string);
|
||||
VIR_FREE(string);
|
||||
if (virCommandRun(cmd, NULL) < 0)
|
||||
if (virCommandRun(cmd) < 0)
|
||||
return -1;
|
||||
</pre>
|
||||
|
||||
@@ -458,24 +458,15 @@
|
||||
non-zero exit status can represent a success condition,
|
||||
it is possible to request the exit status and perform
|
||||
that check manually instead of letting <code>virCommandRun</code>
|
||||
raise the error. By default, the captured status is only
|
||||
for a normal exit (death from a signal is treated as an error),
|
||||
but a caller can use <code>virCommandRawStatus</code> to get
|
||||
encoded status that includes any terminating signals.
|
||||
raise the error
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
int status;
|
||||
if (virCommandRun(cmd, &status) < 0)
|
||||
return -1;
|
||||
if (status == 1) {
|
||||
...do stuff...
|
||||
}
|
||||
return -1;
|
||||
|
||||
virCommandRawStatus(cmd2);
|
||||
if (virCommandRun(cmd2, &status) < 0)
|
||||
return -1;
|
||||
if (WIFEXITED(status) && WEXITSTATUS(status) == 1) {
|
||||
if (WEXITSTATUS(status) ...) {
|
||||
...do stuff...
|
||||
}
|
||||
</pre>
|
||||
@@ -547,7 +538,7 @@
|
||||
There is no need to check if <code>cmd</code> is NULL
|
||||
before calling <code>virCommandFree</code>. This scenario
|
||||
is handled automatically. If the command is still running,
|
||||
it will be forcibly killed and cleaned up (via waitpid).
|
||||
it will be forcably killed and cleaned up (via waitpid).
|
||||
</p>
|
||||
|
||||
<h2><a name="example">Complete examples</a></h2>
|
||||
@@ -560,8 +551,7 @@
|
||||
<pre>
|
||||
int runhook(const char *drvstr, const char *id,
|
||||
const char *opstr, const char *subopstr,
|
||||
const char *extra)
|
||||
{
|
||||
const char *extra) {
|
||||
int ret;
|
||||
char *path;
|
||||
virCommandPtr cmd;
|
||||
|
||||
@@ -1,213 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Out of memory testing</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
|
||||
<p>
|
||||
This page describes how to use the test suite todo out of memory
|
||||
testing.
|
||||
</p>
|
||||
|
||||
<h2>Building with OOM testing</h2>
|
||||
|
||||
<p>
|
||||
Since OOM testing requires hooking into the malloc APIs, it is
|
||||
not enabled by default. The flag <code>--enable-test-oom</code>
|
||||
must be given to <code>configure</code>. When this is done the
|
||||
libvirt allocation APIs will have some hooks enabled.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ ./configure --enable-test-oom
|
||||
</pre>
|
||||
|
||||
|
||||
<h2><a name="basicoom">Basic OOM testing support</a></h2>
|
||||
|
||||
<p>
|
||||
The first step in validating OOM usage is to run a test suite
|
||||
with full OOM testing enabled. This is done by setting the
|
||||
<code>VIR_TEST_OOM=1</code> environment variable. The way this
|
||||
works is that it runs the test once normally to "prime" any
|
||||
static memory allocations. Then it runs it once more counting
|
||||
the total number of memory allocations. Then it runs it in a
|
||||
loop failing a different memory allocation each time. For every
|
||||
memory allocation failure triggered, it expects the test case
|
||||
to return an error. OOM testing is quite slow requiring each
|
||||
test case to be executed O(n) times, where 'n' is the total
|
||||
number of memory allocations. This results in a total number
|
||||
of memory allocations of '(n * (n + 1) ) / 2'
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM=1 ./qemuxml2argvtest
|
||||
1) QEMU XML-2-ARGV minimal ... OK
|
||||
Test OOM for nalloc=42 .......................................... OK
|
||||
2) QEMU XML-2-ARGV minimal-s390 ... OK
|
||||
Test OOM for nalloc=28 ............................ OK
|
||||
3) QEMU XML-2-ARGV machine-aliases1 ... OK
|
||||
Test OOM for nalloc=38 ...................................... OK
|
||||
4) QEMU XML-2-ARGV machine-aliases2 ... OK
|
||||
Test OOM for nalloc=38 ...................................... OK
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 ..................................... OK
|
||||
...snip...
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
In this output, the first line shows the normal execution and
|
||||
the test number, and the second line shows the total number
|
||||
of memory allocations from that test case.
|
||||
</p>
|
||||
|
||||
<h3><a name="valgrind">Tracking failures with valgrind</a></h3>
|
||||
|
||||
<p>
|
||||
The test suite should obviously *not* crash during OOM testing.
|
||||
If it does crash, then to assist in tracking down the problem
|
||||
it is worth using valgrind and only running a single test case.
|
||||
For example, supposing test case 5 crashed. Then re-run the
|
||||
test with
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM=1 VIR_TEST_RANGE=5 ../run valgrind ./qemuxml2argvtest
|
||||
...snip...
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 ..................................... OK
|
||||
...snip...
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Valgrind should report the cause of the crash - for example a
|
||||
double free or use of uninitialized memory or NULL pointer
|
||||
access.
|
||||
</p>
|
||||
|
||||
<h3><a name="stacktraces">Tracking failures with stack traces</a></h3>
|
||||
|
||||
<p>
|
||||
With some really difficult bugs valgrind is not sufficient to
|
||||
identify the cause. In this case, it is useful to identify the
|
||||
precise allocation which was failed, to allow the code path
|
||||
to the error to be traced. The <code>VIR_TEST_OOM</code>
|
||||
env variable can be given a range of memory allocations to
|
||||
test. So if a test case has 150 allocations, it can be told
|
||||
to only test allocation numbers 7-10. The <code>VIR_TEST_OOM_TRACE</code>
|
||||
variable can be used to print out stack traces.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM_TRACE=2 VIR_TEST_OOM=1:7-10 VIR_TEST_RANGE=5 \
|
||||
../run valgrind ./qemuxml2argvtest
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 !virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11786 (discriminator 1)
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAlloc
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:133
|
||||
virDomainDiskDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:4790
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11797
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virXPathNodeSet
|
||||
/home/berrange/src/virt/libvirt/src/util/virxml.c:609
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11805
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11808 (discriminator 1)
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
</pre>
|
||||
|
||||
<h3><a name="noncrash">Non-crash related problems</a></h3>
|
||||
|
||||
<p>
|
||||
Not all memory allocation bugs result in code crashing. Sometimes
|
||||
the code will be silently ignoring the allocation failure, resulting
|
||||
in incorrect data being produced. For example the XML parser may
|
||||
mistakenly treat an allocation failure as indicating that an XML
|
||||
attribute was not set in the input document. It is hard to identify
|
||||
these problems from the test suite automatically. For this, the
|
||||
test suites should be run with <code>VIR_TEST_DEBUG=1</code> set
|
||||
and then stderr analysed for any unexpected data. For example,
|
||||
the XML conversion may show an embedded "(null)" literal, or the
|
||||
test suite might complain about missing elements / attributes
|
||||
in the actual vs expected data. These are all signs of bugs in
|
||||
OOM handling. In the future the OOM tests will be enhanced to
|
||||
validate that an error VIR_ERR_NO_MEMORY is returned for each
|
||||
allocation failed, rather than some other error.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -597,7 +597,7 @@
|
||||
<h4><a name="apiclientdispatchex1">Example with buck passing</a></h4>
|
||||
|
||||
<p>
|
||||
In the first example, a second thread issues an API call
|
||||
In the first example, a second thread issues a API call
|
||||
while the first thread holds the buck. The reply to the
|
||||
first call arrives first, so the buck is passed to the
|
||||
second thread.
|
||||
|
||||
@@ -98,18 +98,18 @@ the code you can build the code with</p>
|
||||
<p>The bindings are articulated around a few
|
||||
classes in the <code>org/libvirt</code> package, notably the
|
||||
<code>Connect</code>, <code>Domain</code> and <code>Network</code>
|
||||
ones. Functions in the <a href="html/index.html">C API</a>
|
||||
ones. Functions in the <a href="html/libvirt-libvirt.html">C API</a>
|
||||
taking <code>virConnectPtr</code>, <code>virDomainPtr</code> or
|
||||
<code>virNetworkPtr</code> as their first argument usually become
|
||||
methods for the classes, their name is just stripped from the
|
||||
virConnect or virDomain(Get) prefix and the first letter gets converted to
|
||||
lower case, for example the C functions:</p>
|
||||
<p>
|
||||
<code>int <a href="html/libvirt-libvirt-domain.html#virConnectNumOfDomains">virConnectNumOfDomains</a>
|
||||
<code>int <a href="html/libvirt-libvirt.html#virConnectNumOfDomains">virConnectNumOfDomains</a>
|
||||
(virConnectPtr conn);</code>
|
||||
</p>
|
||||
<p>
|
||||
<code>int <a href="html/libvirt-libvirt-domain.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a>
|
||||
<code>int <a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a>
|
||||
(virDomainPtr domain, unsigned long memory);</code>
|
||||
</p>
|
||||
<p>become</p>
|
||||
@@ -130,7 +130,7 @@ public class minitest {
|
||||
Connect conn=null;
|
||||
try{
|
||||
conn = new <span style="color: #0071FF; background-color: #FFFFFF">Connect</span>("test:///default", true);
|
||||
} catch (<span style="color: #0071FF; background-color: #FFFFFF">LibvirtException</span> e) {
|
||||
} catch (<span style="color: #0071FF; background-color: #FFFFFF">LibvirtException</span> e){
|
||||
System.out.println("exception caught:"+e);
|
||||
System.out.println(e.getError());
|
||||
}
|
||||
@@ -139,7 +139,7 @@ public class minitest {
|
||||
System.out.println("Domain:" + testDomain.<span style="color: #E50073; background-color: #FFFFFF">getName</span>() + " id " +
|
||||
testDomain.<span style="color: #E50073; background-color: #FFFFFF">getID</span>() + " running " +
|
||||
testDomain.<span style="color: #E50073; background-color: #FFFFFF">getOSType</span>());
|
||||
} catch (<span style="color: #0071FF; background-color: #FFFFFF">LibvirtException</span> e) {
|
||||
} catch (<span style="color: #0071FF; background-color: #FFFFFF">LibvirtException</span> e){
|
||||
System.out.println("exception caught:"+e);
|
||||
System.out.println(e.getError());
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
|
||||
|
||||
h1 {
|
||||
font-weight: normal;
|
||||
color: #3c857c;
|
||||
@@ -496,16 +498,3 @@ div.description pre.code {
|
||||
padding: 5px 10px 5px 10px;
|
||||
margin-left: 2.5em;
|
||||
}
|
||||
|
||||
a.headerlink {
|
||||
text-decoration: none!important;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
h4:hover > a.headerlink,
|
||||
h5:hover > a.headerlink,
|
||||
h6:hover > a.headerlink {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Virtual machine lock manager, virtlockd plugin</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
This page describes use of the <code>virtlockd</code>
|
||||
service as a <a href="locking.html">lock driver</a>
|
||||
plugin for virtual machine disk mutual exclusion.
|
||||
</p>
|
||||
|
||||
<h2><a name="background">virtlockd background</a></h2>
|
||||
|
||||
<p>
|
||||
The virtlockd daemon is a single purpose binary which
|
||||
focuses exclusively on the task of acquiring and holding
|
||||
locks on behalf of running virtual machines. It is
|
||||
designed to offer a low overhead, portable locking
|
||||
scheme can be used out of the box on virtualization
|
||||
hosts with minimal configuration overheads. It makes
|
||||
use of the POSIX fcntl advisory locking capability
|
||||
to hold locks, which is supported by the majority of
|
||||
commonly used filesystems.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlock">virtlockd daemon setup</a></h2>
|
||||
|
||||
<p>
|
||||
In most OS, the virtlockd daemon itself will not require
|
||||
any upfront configuration work. It is installed by default
|
||||
when libvirtd is present, and a systemd socket unit is
|
||||
registered such that the daemon will be automatically
|
||||
started when first required. With OS that predate systemd
|
||||
though, it will be necessary to start it at boot time,
|
||||
prior to libvirtd being started. On RHEL/Fedora distros,
|
||||
this can be achieved as follows
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# chkconfig virtlockd on
|
||||
# service virtlockd start
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The above instructions apply to the instance of virtlockd
|
||||
that runs privileged, and is used by the libvirtd daemon
|
||||
that runs privileged. If running libvirtd as an unprivileged
|
||||
user, it will always automatically spawn an instance of
|
||||
the virtlockd daemon unprivileged too. This requires no
|
||||
setup at all.
|
||||
</p>
|
||||
|
||||
<h2><a name="lockdplugin">libvirt lockd plugin configuration</a></h2>
|
||||
|
||||
<p>
|
||||
Once the virtlockd daemon is running, or setup to autostart,
|
||||
the next step is to configure the libvirt lockd plugin.
|
||||
There is a separate configuration file for each libvirt
|
||||
driver that is using virtlockd. For QEMU, we will edit
|
||||
<code>/etc/libvirt/qemu-lockd.conf</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The default behaviour of the lockd plugin is to acquire locks
|
||||
directly on the virtual disk images associated with the guest
|
||||
<disk> elements. This ensures it can run out of the box
|
||||
with no configuration, providing locking for disk images on
|
||||
shared filesystems such as NFS. It does not provide any cross
|
||||
host protection for storage that is backed by block devices,
|
||||
since locks acquired on device nodes in /dev only apply within
|
||||
the host. It may also be the case that the filesystem holding
|
||||
the disk images is not capable of supporting fcntl locks.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To address these problems it is possible to tell lockd to
|
||||
acquire locks on an indirect file. Essentially lockd will
|
||||
calculate the SHA256 checksum of the fully qualified path,
|
||||
and create a zero length file in a given directory whose
|
||||
filename is the checksum. It will then acquire a lock on
|
||||
that file. Assuming the block devices assigned to the guest
|
||||
are using stable paths (eg /dev/disk/by-path/XXXXXXX) then
|
||||
this will allow for locks to apply across hosts. This
|
||||
feature can be enabled by setting a configuration setting
|
||||
that specifies the directory in which to create the lock
|
||||
files. The directory referred to should of course be
|
||||
placed on a shared filesystem (eg NFS) that is accessible
|
||||
to all hosts which can see the shared block devices.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set \
|
||||
/files/etc/libvirt/qemu-lockd.conf/file_lockspace_dir \
|
||||
"/var/lib/libvirt/lockd/files"
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If the guests are using either LVM and SCSI block devices
|
||||
for their virtual disks, there is a unique identifier
|
||||
associated with each device. It is possible to tell lockd
|
||||
to use this UUID as the basis for acquiring locks, rather
|
||||
than the SHA256 sum of the filename. The benefit of this
|
||||
is that the locking protection will work even if the file
|
||||
paths to the given block device are different on each
|
||||
host.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set \
|
||||
/files/etc/libvirt/qemu-lockd.conf/scsi_lockspace_dir \
|
||||
"/var/lib/libvirt/lockd/scsi"
|
||||
# augtool -s set \
|
||||
/files/etc/libvirt/qemu-lockd.conf/lvm_lockspace_dir \
|
||||
"/var/lib/libvirt/lockd/lvm"
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
It is important to remember that the changes made to the
|
||||
<code>/etc/libvirt/qemu-lockd.conf</code> file must be
|
||||
propagated to all hosts before any virtual machines are
|
||||
launched on them. This ensures that all hosts are using
|
||||
the same locking mechanism
|
||||
</p>
|
||||
|
||||
<h2><a name="qemuconfig">QEMU/KVM driver configuration</a></h2>
|
||||
|
||||
<p>
|
||||
The QEMU driver is capable of using the virtlockd plugin
|
||||
since the release <span>1.0.2</span>.
|
||||
The out of the box configuration, however, currently
|
||||
uses the <strong>nop</strong> lock manager plugin.
|
||||
To get protection for disks, it is thus necessary
|
||||
to reconfigure QEMU to activate the <strong>lockd</strong>
|
||||
driver. This is achieved by editing the QEMU driver
|
||||
configuration file (<code>/etc/libvirt/qemu.conf</code>)
|
||||
and changing the <code>lock_manager</code> configuration
|
||||
tunable.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set /files/etc/libvirt/qemu.conf/lock_manager lockd
|
||||
# service libvirtd restart
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Every time you start a guest, the virtlockd daemon will acquire
|
||||
locks on the disk files directly, or in one of the configured
|
||||
lookaside directories based on SHA256 sum. To check that locks
|
||||
are being acquired as expected, the <code>lslocks</code> tool
|
||||
can be run.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,247 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Virtual machine lock manager, sanlock plugin</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
This page describes use of the
|
||||
<a href="https://fedorahosted.org/sanlock/">sanlock</a>
|
||||
service as a <a href="locking.html">lock driver</a>
|
||||
plugin for virtual machine disk mutual exclusion.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlock">Sanlock daemon setup</a></h2>
|
||||
|
||||
<p>
|
||||
On many operating systems, the <strong>sanlock</strong> plugin
|
||||
is distributed in a sub-package which needs to be installed
|
||||
separately from the main libvirt RPM. On a Fedora/RHEL host
|
||||
this can be done with the <code>yum</code> command
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# yum install libvirt-lock-sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The next step is to start the sanlock daemon. For maximum
|
||||
safety sanlock prefers to have a connection to a watchdog
|
||||
daemon. This will cause the entire host to be rebooted in
|
||||
the event that sanlock crashes / terminates abnormally.
|
||||
To start the watchdog daemon on a Fedora/RHEL host
|
||||
the following commands can be run:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# chkconfig wdmd on
|
||||
# service wdmd start
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Once the watchdog is running, sanlock can be started
|
||||
as follows
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# chkconfig sanlock on
|
||||
# service sanlock start
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
<em>Note:</em> if you wish to avoid the use of the
|
||||
watchdog, add the following line to <code>/etc/sysconfig/sanlock</code>
|
||||
before starting it
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
SANLOCKOPTS="-w 0"
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The sanlock daemon must be started on every single host
|
||||
that will be running virtual machines. So repeat these
|
||||
steps as necessary.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlockplugin">libvirt sanlock plugin configuration</a></h2>
|
||||
|
||||
<p>
|
||||
Once the sanlock daemon is running, the next step is to
|
||||
configure the libvirt sanlock plugin. There is a separate
|
||||
configuration file for each libvirt driver that is using
|
||||
sanlock. For QEMU, we will edit <code>/etc/libvirt/qemu-sanlock.conf</code>
|
||||
There is one mandatory parameter that needs to be set,
|
||||
the <code>host_id</code>. This is a integer between
|
||||
1 and 2000, which must be set to a <strong>unique</strong>
|
||||
value on each host running virtual machines.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set /files/etc/libvirt/qemu-sanlock.conf/host_id 1
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Repeat this on every host, changing <strong>1</strong> to a
|
||||
unique value for the host.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlockstorage">libvirt sanlock storage configuration</a></h2>
|
||||
|
||||
<p>
|
||||
The sanlock plugin needs to create leases in a directory
|
||||
that is on a filesystem shared between all hosts running
|
||||
virtual machines. Obvious choices for this include NFS
|
||||
or GFS2. The libvirt sanlock plugin expects its lease
|
||||
directory be at <code>/var/lib/libvirt/sanlock</code>
|
||||
so update the host's <code>/etc/fstab</code> to mount
|
||||
a suitable shared/cluster filesystem at that location
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# echo "some.nfs.server:/export/sanlock /var/lib/libvirt/sanlock nfs hard,nointr 0 0" >> /etc/fstab
|
||||
# mount /var/lib/libvirt/sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If your sanlock daemon happen to run under non-root
|
||||
privileges, you need to tell this to libvirt so it
|
||||
chowns created files correctly. This can be done by
|
||||
setting <code>user</code> and/or <code>group</code>
|
||||
variables in the configuration file. Accepted values
|
||||
range is specified in description to the same
|
||||
variables in <code>/etc/libvirt/qemu.conf</code>. For
|
||||
example:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/user sanlock
|
||||
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/group sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
But remember, that if this is NFS share, you need a
|
||||
no_root_squash-ed one for chown (and chmod possibly)
|
||||
to succeed.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In terms of storage requirements, if the filesystem
|
||||
uses 512 byte sectors, you need to allow for <code>1MB</code>
|
||||
of storage for each guest disk. So if you have a network
|
||||
with 20 virtualization hosts, each running 50 virtual
|
||||
machines and an average of 2 disks per guest, you will
|
||||
need <code>20*50*2 == 2000 MB</code> of storage for
|
||||
sanlock.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
On one of the hosts on the network is it wise to setup
|
||||
a cron job which runs the <code>virt-sanlock-cleanup</code>
|
||||
script periodically. This scripts deletes any lease
|
||||
files which are not currently in use by running virtual
|
||||
machines, freeing up disk space on the shared filesystem.
|
||||
Unless VM disks are very frequently created + deleted
|
||||
it should be sufficient to run the cleanup once a week.
|
||||
</p>
|
||||
|
||||
<h2><a name="qemuconfig">QEMU/KVM driver configuration</a></h2>
|
||||
|
||||
<p>
|
||||
The QEMU/KVM driver is fully integrated with the lock
|
||||
manager framework as of release <span>0.9.3</span>.
|
||||
The out of the box configuration, however, currently
|
||||
uses the <strong>nop</strong> lock manager plugin.
|
||||
To get protection for disks, it is thus necessary
|
||||
to reconfigure QEMU to activate the <strong>sanlock</strong>
|
||||
driver. This is achieved by editing the QEMU driver
|
||||
configuration file (<code>/etc/libvirt/qemu.conf</code>)
|
||||
and changing the <code>lock_manager</code> configuration
|
||||
tunable.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set /files/etc/libvirt/qemu.conf/lock_manager sanlock
|
||||
# service libvirtd restart
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If all went well, libvirtd will have talked to sanlock
|
||||
and created the basic lockspace. This can be checked
|
||||
by looking for existence of the following file
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# ls /var/lib/libvirt/sanlock/
|
||||
__LIBVIRT__DISKS__
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Every time you start a guest, additional lease files will appear
|
||||
in this directory, one for each virtual disk. The lease
|
||||
files are named based on the MD5 checksum of the fully qualified
|
||||
path of the virtual disk backing file. So if the guest is given
|
||||
a disk backed by <code>/var/lib/libvirt/images/demo.img</code>
|
||||
expect to see a lease <code>/var/lib/libvirt/sanlock/bfa0240911bc17753e0b473688822159</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
It should be obvious that for locking to work correctly, every
|
||||
host running virtual machines should have storage configured
|
||||
in the same way. The easiest way to do this is to use the libvirt
|
||||
storage pool capability to configure any NFS volumes, iSCSI targets,
|
||||
or SCSI HBAs used for guest storage. Simply replicate the same
|
||||
storage pool XML across every host. It is important that any
|
||||
storage pools exposing block devices are configured to create
|
||||
volume paths under <code>/dev/disks/by-path</code> to ensure
|
||||
stable paths across hosts. An example iSCSI configuration
|
||||
which ensures this is:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<pool type='iscsi'>
|
||||
<name>myiscsipool</name>
|
||||
<source>
|
||||
<host name='192.168.254.8'/>
|
||||
<device path='your-iscsi-target-iqn'/>
|
||||
</source>
|
||||
<target>
|
||||
<path>/dev/disk/by-path</path>
|
||||
</target>
|
||||
</pool>
|
||||
</pre>
|
||||
|
||||
<h2><a name="domainconfig">Domain configuration</a></h2>
|
||||
|
||||
<p>
|
||||
In case sanlock loses access to disk locks for some reason, it will
|
||||
kill all domains that lost their locks. This default behavior may
|
||||
be changed using
|
||||
<a href="formatdomain.html#elementsEvents">on_lockfailure
|
||||
element</a> in domain XML. When this element is present, sanlock
|
||||
will call <code>sanlock_helper</code> (provided by libvirt) with
|
||||
the specified action. This helper binary will connect to libvirtd
|
||||
and thus it may need to authenticate if libvirtd was configured to
|
||||
require that on the read-write UNIX socket. To provide the
|
||||
appropriate credentials to sanlock_helper, a
|
||||
<a href="auth.html#Auth_client_config">client authentication
|
||||
file</a> needs to contain something like the following:
|
||||
</p>
|
||||
<pre>
|
||||
[auth-libvirt-localhost]
|
||||
credentials=sanlock
|
||||
|
||||
[credentials-sanlock]
|
||||
authname=login
|
||||
password=password
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,47 +2,258 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Virtual machine lock manager</h1>
|
||||
<h1>Virtual machine disk locking</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
Libvirt includes a framework for ensuring mutual exclusion
|
||||
between virtual machines using host resources. Typically
|
||||
this is used to prevent two VM processes from having concurrent
|
||||
write access to the same disk image, as this would result in
|
||||
data corruption if the guest was not using a cluster
|
||||
aware filesystem.
|
||||
This page describes how to ensure a single disk cannot be
|
||||
used by more than one running VM at a time, across any
|
||||
host in a network. This is critical to avoid data corruption
|
||||
of guest files systems that are not cluster aware.
|
||||
</p>
|
||||
|
||||
<h2><a name="plugins">Lock manager plugins</a></h2>
|
||||
|
||||
<p>
|
||||
The lock manager framework has a pluggable architecture,
|
||||
to allow different locking technologies to be used.
|
||||
libvirt includes a pluggable framework for lock managers,
|
||||
which hypervisor drivers can use to ensure safety for
|
||||
guest domain disks, and potentially other resources.
|
||||
At this time there are only two plugin implementations,
|
||||
a "no op" implementation which does absolutely nothing,
|
||||
and a <a href="https://fedorahosted.org/sanlock/">sanlock</a> implementation which uses
|
||||
the Disk Paxos algorithm to ensure safety.
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt>nop</dt>
|
||||
<dd>This is a "no op" implementation which does absolutely
|
||||
nothing. This can be used if mutual exclusion between
|
||||
virtual machines is not required, or if it is being
|
||||
solved at another level in the management stack.</dd>
|
||||
<dt><a href="locking-lockd.html">lockd</a></dt>
|
||||
<dd>This is the current preferred implementation shipped
|
||||
with libvirt. It uses the <code>virtlockd</code> daemon
|
||||
to manage locks using the POSIX fcntl() advisory locking
|
||||
capability. As such it requires a shared filesystem of
|
||||
some kind be accessible to all hosts which share the
|
||||
same image storage.</dd>
|
||||
<dt><a href="locking-sanlock.html">sanlock</a></dt>
|
||||
<dd>This is an alternative implementation preferred by
|
||||
the oVirt project. It uses a disk paxos algorithm for
|
||||
maintaining continuously renewed leases. In the default
|
||||
setup it requires some shared filesystem, but it is
|
||||
possible to use it in a manual mode where the management
|
||||
application creates leases in SAN storage volumes.
|
||||
</dd>
|
||||
</dl>
|
||||
<h2><a name="sanlock">Sanlock daemon setup</a></h2>
|
||||
|
||||
<p>
|
||||
On many operating systems, the <strong>sanlock</strong> plugin
|
||||
is distributed in a sub-package which needs to be installed
|
||||
separately from the main libvirt RPM. On a Fedora/RHEL host
|
||||
this can be done with the <code>yum</code> command
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# yum install libvirt-lock-sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The next step is to start the sanlock daemon. For maximum
|
||||
safety sanlock prefers to have a connection to a watchdog
|
||||
daemon. This will cause the entire host to be rebooted in
|
||||
the event that sanlock crashes / terminates abnormally.
|
||||
To start the watchdog daemon on a Fedora/RHEL host
|
||||
the following commands can be run:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# chkconfig wdmd on
|
||||
# service wdmd start
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Once the watchdog is running, sanlock can be started
|
||||
as follows
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# chkconfig sanlock on
|
||||
# service sanlock start
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
<em>Note:</em> if you wish to avoid the use of the
|
||||
watchdog, add the following line to <code>/etc/sysconfig/sanlock</code>
|
||||
before starting it
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
SANLOCKOPTS="-w 0"
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The sanlock daemon must be started on every single host
|
||||
that will be running virtual machines. So repeat these
|
||||
steps as necessary.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlockplugin">libvirt sanlock plugin configuration</a></h2>
|
||||
|
||||
<p>
|
||||
Once the sanlock daemon is running, the next step is to
|
||||
configure the libvirt sanlock plugin. There is a separate
|
||||
configuration file for each libvirt driver that is using
|
||||
sanlock. For QEMU, we will edit <code>/etc/libvirt/qemu-sanlock.conf</code>
|
||||
There is one mandatory parameter that needs to be set,
|
||||
the <code>host_id</code>. This is a integer between
|
||||
1 and 2000, which must be set to a <strong>unique</strong>
|
||||
value on each host running virtual machines.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set /files/etc/libvirt/qemu-sanlock.conf/host_id 1
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Repeat this on every host, changing <strong>1</strong> to a
|
||||
unique value for the host.
|
||||
</p>
|
||||
|
||||
<h2><a name="sanlockstorage">libvirt sanlock storage configuration</a></h2>
|
||||
|
||||
<p>
|
||||
The sanlock plugin needs to create leases in a directory
|
||||
that is on a filesystem shared between all hosts running
|
||||
virtual machines. Obvious choices for this include NFS
|
||||
or GFS2. The libvirt sanlock plugin expects its lease
|
||||
directory be at <code>/var/lib/libvirt/sanlock</code>
|
||||
so update the host's <code>/etc/fstab</code> to mount
|
||||
a suitable shared/cluster filesystem at that location
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# echo "some.nfs.server:/export/sanlock /var/lib/libvirt/sanlock nfs hard,nointr 0 0" >> /etc/fstab
|
||||
# mount /var/lib/libvirt/sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If your sanlock daemon happen to run under non-root
|
||||
privileges, you need to tell this to libvirt so it
|
||||
chowns created files correctly. This can be done by
|
||||
setting <code>user</code> and/or <code>group</code>
|
||||
variables in the configuration file. Accepted values
|
||||
range is specified in description to the same
|
||||
variables in <code>/etc/libvirt/qemu.conf</code>. For
|
||||
example:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/user sanlock
|
||||
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/group sanlock
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
But remember, that if this is NFS share, you need a
|
||||
no_root_squash-ed one for chown (and chmod possibly)
|
||||
to succeed.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In terms of storage requirements, if the filesystem
|
||||
uses 512 byte sectors, you need to allow for <code>1MB</code>
|
||||
of storage for each guest disk. So if you have a network
|
||||
with 20 virtualization hosts, each running 50 virtual
|
||||
machines and an average of 2 disks per guest, you will
|
||||
need <code>20*50*2 == 2000 MB</code> of storage for
|
||||
sanlock.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
On one of the hosts on the network is it wise to setup
|
||||
a cron job which runs the <code>virt-sanlock-cleanup</code>
|
||||
script periodically. This scripts deletes any lease
|
||||
files which are not currently in use by running virtual
|
||||
machines, freeing up disk space on the shared filesystem.
|
||||
Unless VM disks are very frequently created + deleted
|
||||
it should be sufficient to run the cleanup once a week.
|
||||
</p>
|
||||
|
||||
<h2><a name="qemuconfig">QEMU/KVM driver configuration</a></h2>
|
||||
|
||||
<p>
|
||||
The QEMU/KVM driver is fully integrated with the lock
|
||||
manager framework as of release <span>0.9.3</span>.
|
||||
The out of the box configuration, however, currently
|
||||
uses the <strong>nop</strong> lock manager plugin.
|
||||
To get protection for disks, it is thus necessary
|
||||
to reconfigure QEMU to activate the <strong>sanlock</strong>
|
||||
driver. This is achieved by editing the QEMU driver
|
||||
configuration file (<code>/etc/libvirt/qemu.conf</code>)
|
||||
and changing the <code>lock_manager</code> configuration
|
||||
tunable.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ su - root
|
||||
# augtool -s set /files/etc/libvirt/qemu.conf/lock_manager sanlock
|
||||
# service libvirtd restart
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If all went well, libvirtd will have talked to sanlock
|
||||
and created the basic lockspace. This can be checked
|
||||
by looking for existence of the following file
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# ls /var/lib/libvirt/sanlock/
|
||||
__LIBVIRT__DISKS__
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Every time you start a guest, additional lease files will appear
|
||||
in this directory, one for each virtual disk. The lease
|
||||
files are named based on the MD5 checksum of the fully qualified
|
||||
path of the virtual disk backing file. So if the guest is given
|
||||
a disk backed by <code>/var/lib/libvirt/images/demo.img</code>
|
||||
expect to see a lease <code>/var/lib/libvirt/sanlock/bfa0240911bc17753e0b473688822159</code>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
It should be obvious that for locking to work correctly, every
|
||||
host running virtual machines should have storage configured
|
||||
in the same way. The easiest way to do this is to use the libvirt
|
||||
storage pool capability to configure any NFS volumes, iSCSI targets,
|
||||
or SCSI HBAs used for guest storage. Simply replicate the same
|
||||
storage pool XML across every host. It is important that any
|
||||
storage pools exposing block devices are configured to create
|
||||
volume paths under <code>/dev/disks/by-path</code> to ensure
|
||||
stable paths across hosts. An example iSCSI configuration
|
||||
which ensures this is:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<pool type='iscsi'>
|
||||
<name>myiscsipool</name>
|
||||
<source>
|
||||
<host name='192.168.254.8'/>
|
||||
<device path='your-iscsi-target-iqn'/>
|
||||
</source>
|
||||
<target>
|
||||
<path>/dev/disk/by-path</path>
|
||||
</target>
|
||||
</pool>
|
||||
</pre>
|
||||
|
||||
<h2><a name="domainconfig">Domain configuration</a></h2>
|
||||
|
||||
<p>
|
||||
In case sanlock loses access to disk locks for some reason, it will
|
||||
kill all domains that lost their locks. This default behavior may
|
||||
be changed using
|
||||
<a href="formatdomain.html#elementsEvents">on_lockfailure
|
||||
element</a> in domain XML. When this element is present, sanlock
|
||||
will call <code>sanlock_helper</code> (provided by libvirt) with
|
||||
the specified action. This helper binary will connect to libvirtd
|
||||
and thus it may need to authenticate if libvirtd was configured to
|
||||
require that on the read-write UNIX socket. To provide the
|
||||
appropriate credentials to sanlock_helper, a
|
||||
<a href="auth.html#Auth_client_config">client authentication
|
||||
file</a> needs to contain something like the following:
|
||||
</p>
|
||||
<pre>
|
||||
[auth-libvirt-localhost]
|
||||
credentials=sanlock
|
||||
|
||||
[credentials-sanlock]
|
||||
authname=login
|
||||
password=password
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,17 +3,30 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1 >Logging in the library and the daemon</h1>
|
||||
|
||||
<p>Libvirt includes logging facilities starting from version 0.6.0,
|
||||
this complements the <a href="errors.html">error handling</a>
|
||||
mechanism and APIs to allow tracing through the execution of the
|
||||
library as well as in the libvirtd daemon.</p>
|
||||
|
||||
<ul id="toc"/>
|
||||
|
||||
<h2>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="#log_library">Logging in the library</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#log_config">Configuring logging in the library</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#log_daemon">Logging in the daemon</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#log_syntax">Syntax for filters and output values</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#log_examples">Examples</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>
|
||||
<a name="log_library">Logging in the library</a>
|
||||
</h2>
|
||||
</h3>
|
||||
<p>The logging functionalities in libvirt are based on 3 key concepts,
|
||||
similar to the one present in other generic logging facilities like
|
||||
log4j:</p>
|
||||
@@ -38,10 +51,16 @@
|
||||
all messages to a debugging file but only allow errors to be
|
||||
logged through syslog.</li>
|
||||
</ul>
|
||||
<p>Note that the logging module saves all logs to a <b>debug buffer</b>
|
||||
filled in a round-robin fashion as to keep a full log of the
|
||||
recent logs including all debug. The debug buffer can be resized
|
||||
or deactivated in the daemon using the log_buffer_size variable,
|
||||
default is 64 kB. This can be used when debugging the library
|
||||
(see the virLogBuffer variable content).</p>
|
||||
|
||||
<h2>
|
||||
<h3>
|
||||
<a name="log_config">Configuring logging in the library</a>
|
||||
</h2>
|
||||
</h3>
|
||||
<p>The library configuration of logging is through 3 environment variables
|
||||
allowing to control the logging behaviour:</p>
|
||||
<ul>
|
||||
@@ -60,9 +79,9 @@
|
||||
you specify an invalid value, it will be ignored with a warning. If you
|
||||
have an error in a filter or output string, some of the settings may be
|
||||
applied up to the point at which libvirt encountered the error.</p>
|
||||
<h2>
|
||||
<h3>
|
||||
<a name="log_daemon">Logging in the daemon</a>
|
||||
</h2>
|
||||
</h3>
|
||||
<p>Similarly the daemon logging behaviour can be tuned using 3 config
|
||||
variables, stored in the configuration file:</p>
|
||||
<ul>
|
||||
@@ -79,13 +98,9 @@
|
||||
<p>When starting the libvirt daemon, any logging environment variable
|
||||
settings will override settings in the config file. Command line options
|
||||
take precedence over all. If no outputs are defined for libvirtd, it
|
||||
will try to use</p>
|
||||
<ul>
|
||||
<li>0.10.0 or later: systemd journal, if <code>/run/systemd/journal/socket</code> exists</li>
|
||||
<li>0.9.0 or later: file <code>/var/log/libvirt/libvirtd.log</code> if running as a daemon</li>
|
||||
<li>before 0.9.0: syslog if running as a daemon</li>
|
||||
<li>all versions: to stderr stream if running in the foreground</li>
|
||||
</ul>
|
||||
defaults to logging to /var/log/libvirt/libvirtd.log (before 0.9.0
|
||||
it was using syslog) when it is running as a daemon, or to
|
||||
stderr when it is running in the foreground.</p>
|
||||
<p>Libvirtd does not reload its logging configuration when issued a SIGHUP.
|
||||
If you want to reload the configuration, you must do a <code>service
|
||||
libvirtd restart</code> or manually stop and restart the daemon
|
||||
@@ -95,9 +110,9 @@
|
||||
by default) in case of crash, this can also be activated explicitly
|
||||
for debugging purposes by sending the daemon a USR2 signal:</p>
|
||||
<pre>killall -USR2 libvirtd</pre>
|
||||
<h2>
|
||||
<h3>
|
||||
<a name="log_syntax">Syntax for filters and output values</a>
|
||||
</h2>
|
||||
</h3>
|
||||
<p>The syntax for filters and outputs is the same for both types of
|
||||
variables.</p>
|
||||
<p>The format for a filter is one of:</p>
|
||||
@@ -131,7 +146,6 @@
|
||||
given <code>name</code> as the ident</li>
|
||||
<li><code>x:file:file_path</code> output to a file, with the given
|
||||
filepath</li>
|
||||
<li><code>x:journald</code> output goes to systemd journal</li>
|
||||
</ul>
|
||||
<p>In all cases the x prefix is the minimal level, acting as a filter:</p>
|
||||
<ul>
|
||||
@@ -145,81 +159,9 @@
|
||||
will log all warnings and errors to syslog under the libvirtd ident
|
||||
but also log all debug and information included in the
|
||||
file <code>/tmp/libvirt.log</code></p>
|
||||
|
||||
<h2><a name="journald">Systemd journal fields</a></h2>
|
||||
|
||||
<p>
|
||||
When logging to the systemd journal, the following fields
|
||||
are defined, in addition to any automatically recorded
|
||||
<a href="http://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html">standard fields</a>:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>MESSAGE</code></dt>
|
||||
<dd>The log message string</dd>
|
||||
<dt><code>PRIORITY</code></dt>
|
||||
<dd>The log priority value</dd>
|
||||
<dt><code>LIBVIRT_SOURCE</code></dt>
|
||||
<dd>The source type, one of "file", "error", "audit", "trace", "library"</dd>
|
||||
<dt><code>CODE_FILE</code></dt>
|
||||
<dd>The name of the file emitting the log record</dd>
|
||||
<dt><code>CODE_LINE</code></dt>
|
||||
<dd>The line number of the file emitting the log record</dd>
|
||||
<dt><code>CODE_FUNC</code></dt>
|
||||
<dd>The name of the function emitting the log record</dd>
|
||||
<dt><code>LIBVIRT_DOMAIN</code></dt>
|
||||
<dd>The libvirt error domain (values from virErrorDomain enum), if LIBVIRT_SOURCE="error"</dd>
|
||||
<dt><code>LIBVIRT_CODE</code></dt>
|
||||
<dd>The libvirt error code (values from virErrorCode enum), if LIBVIRT_SOURCE="error"</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="journaldids">Well known message ID values</a></h3>
|
||||
|
||||
<p>
|
||||
Certain areas of the code will emit log records tagged with well known
|
||||
unique id values, which are guaranteed never to change in the future.
|
||||
This allows applications to identify critical log events without doing
|
||||
string matching on the <code>MESSAGE</code> field.
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>MESSAGE_ID=8ae2f3fb-2dbe-498e-8fbd-012d40afa361</code></dt>
|
||||
<dd>Generated by the QEMU driver when it identifies a QEMU system
|
||||
emulator binary, but is unable to extract information about its
|
||||
capabilities. This is usually an indicator of a broken QEMU
|
||||
build or installation. When this is emitted, the <code>LIBVIRT_QEMU_BINARY</code>
|
||||
message field will provide the full path of the QEMU binary that failed.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
The <code>journalctl</code> command can be used to search the journal
|
||||
matching on specific message ID values
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ journalctl MESSAGE_ID=8ae2f3fb-2dbe-498e-8fbd-012d40afa361 --output=json
|
||||
{ ...snip...
|
||||
"LIBVIRT_SOURCE" : "file",
|
||||
"PRIORITY" : "3",
|
||||
"CODE_FILE" : "qemu/qemu_capabilities.c",
|
||||
"CODE_LINE" : "2770",
|
||||
"CODE_FUNC" : "virQEMUCapsLogProbeFailure",
|
||||
"MESSAGE_ID" : "8ae2f3fb-2dbe-498e-8fbd-012d40afa361",
|
||||
"LIBVIRT_QEMU_BINARY" : "/bin/qemu-system-xtensa",
|
||||
"MESSAGE" : "Failed to probe capabilities for /bin/qemu-system-xtensa:" \
|
||||
"internal error: Child process (LC_ALL=C LD_LIBRARY_PATH=/home/berrange" \
|
||||
"/src/virt/libvirt/src/.libs PATH=/usr/lib64/ccache:/usr/local/sbin:" \
|
||||
"/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin HOME=/root " \
|
||||
"USER=root LOGNAME=root /bin/qemu-system-xtensa -help) unexpected " \
|
||||
"exit status 127: /bin/qemu-system-xtensa: error while loading shared " \
|
||||
"libraries: libglapi.so.0: cannot open shared object file: No such " \
|
||||
"file or directory\n" }
|
||||
</pre>
|
||||
|
||||
<h2>
|
||||
<h3>
|
||||
<a name="log_examples">Examples</a>
|
||||
</h2>
|
||||
</h3>
|
||||
<p>For example setting up the following:</p>
|
||||
<pre>export LIBVIRT_DEBUG=1
|
||||
export LIBVIRT_LOG_OUTPUTS="1:file:virsh.log"</pre>
|
||||
@@ -239,5 +181,9 @@ log_outputs="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>
|
||||
<p>On the other hand to deactivate the logbuffer in the daemon
|
||||
for stable high load servers, set</p>
|
||||
<pre>log_buffer_size=0</pre>
|
||||
<p>in the libvirtd.conf.</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
3563
docs/news.html.in
3563
docs/news.html.in
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,11 @@
|
||||
<!-- The sitemap.html.in page contains the master navigation structure -->
|
||||
<xsl:variable name="sitemap" select="document('sitemap.html.in')/html:html/html:body/html:div[@id='sitemap']"/>
|
||||
|
||||
<xsl:template match="html:code[@class='docref']" mode="content">
|
||||
<xsl:variable name="name"><xsl:value-of select="."/></xsl:variable>
|
||||
<a href="html/libvirt-libvirt.html#{$name}"><code><xsl:value-of select="$name"/></code></a>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="node() | @*" mode="content">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="node() | @*" mode="content"/>
|
||||
@@ -180,24 +185,4 @@
|
||||
|
||||
<xsl:apply-templates select="exsl:node-set($inchtml)/html:html/html:body/*" mode="content"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="html:h2 | html:h3 | html:h4 | html:h5 | html:h6" mode="content">
|
||||
<xsl:element name="{name()}">
|
||||
<xsl:apply-templates mode="copy" />
|
||||
<xsl:if test="./html:a/@name">
|
||||
<a class="headerlink" href="#{html:a/@name}" title="Permalink to this headline">¶</a>
|
||||
</xsl:if>
|
||||
</xsl:element>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="text()" mode="copy">
|
||||
<xsl:value-of select="."/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="node()" mode="copy">
|
||||
<xsl:element name="{name()}">
|
||||
<xsl:copy-of select="./@*"/>
|
||||
<xsl:apply-templates mode="copy" />
|
||||
</xsl:element>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
|
||||
@@ -12,11 +12,11 @@ becomes methods for the classes, their name is just stripped from the
|
||||
virConnect or virDomain(Get) prefix and the first letter gets converted to
|
||||
lower case, for example the C functions:</p>
|
||||
<p>
|
||||
<code>int <a href="html/libvirt-libvirt-domain.html#virConnectNumOfDomains">virConnectNumOfDomains</a>
|
||||
<code>int <a href="html/libvirt-libvirt.html#virConnectNumOfDomains">virConnectNumOfDomains</a>
|
||||
(virConnectPtr conn);</code>
|
||||
</p>
|
||||
<p>
|
||||
<code>int <a href="html/libvirt-libvirt-domain.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a>
|
||||
<code>int <a href="html/libvirt-libvirt.html#virDomainSetMaxMemory">virDomainSetMaxMemory</a>
|
||||
(virDomainPtr domain, unsigned long memory);</code>
|
||||
</p>
|
||||
<p>become</p>
|
||||
@@ -31,10 +31,10 @@ in the file libvirtclass.txt present in the python dir or in the docs.There
|
||||
is a couple of function who don't map directly to their C counterparts due to
|
||||
specificities in their argument conversions:</p>
|
||||
<ul>
|
||||
<li><code><a href="html/libvirt-libvirt-domain.html#virConnectListDomains">virConnectListDomains</a></code>
|
||||
<li><code><a href="html/libvirt-libvirt.html#virConnectListDomains">virConnectListDomains</a></code>
|
||||
is replaced by <code>virDomain::listDomainsID(self)</code> which returns
|
||||
a list of the integer ID for the currently running domains</li>
|
||||
<li><code><a href="html/libvirt-libvirt-domain.html#virDomainGetInfo">virDomainGetInfo</a></code>
|
||||
<li><code><a href="html/libvirt-libvirt.html#virDomainGetInfo">virDomainGetInfo</a></code>
|
||||
is replaced by <code>virDomain::info()</code> which returns a list of
|
||||
<ol><li>state: one of the state values (virDomainState)</li><li>maxMemory: the maximum memory used by the domain</li><li>memory: the current amount of memory used by the domain</li><li>nbVirtCPU: the number of virtual CPU</li><li>cpuTime: the time used by the domain in nanoseconds</li></ol></li>
|
||||
</ul>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## Copyright (C) 2005-2011, 2013-2014 Red Hat, Inc.
|
||||
## Copyright (C) 2005-2011, 2013 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
|
||||
@@ -19,7 +19,6 @@ schema_DATA = \
|
||||
basictypes.rng \
|
||||
capability.rng \
|
||||
domain.rng \
|
||||
domaincaps.rng \
|
||||
domaincommon.rng \
|
||||
domainsnapshot.rng \
|
||||
interface.rng \
|
||||
@@ -28,7 +27,8 @@ schema_DATA = \
|
||||
nodedev.rng \
|
||||
nwfilter.rng \
|
||||
secret.rng \
|
||||
storagecommon.rng \
|
||||
storageencryption.rng \
|
||||
storagefilefeatures.rng \
|
||||
storagepool.rng \
|
||||
storagevol.rng
|
||||
|
||||
|
||||
@@ -14,12 +14,6 @@
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name='hexuint'>
|
||||
<data type='string'>
|
||||
<param name="pattern">(0x)?[0-9a-f]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name="positiveInteger">
|
||||
<data type="positiveInteger">
|
||||
<param name="pattern">[0-9]+</param>
|
||||
@@ -83,7 +77,10 @@
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="multifunction">
|
||||
<ref name="virOnOff"/>
|
||||
<choice>
|
||||
<value>on</value>
|
||||
<value>off</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</define>
|
||||
@@ -115,7 +112,7 @@
|
||||
<!--interface on a device (system). The duid is often used by servers -->
|
||||
<!--such as dnsmasq to assign a specific IP address (and optionally a -->
|
||||
<!--name to an interface. The applicable standards are RFC3315 and -->
|
||||
<!--RFC6355. These standards actually require the duid to be fixed for -->
|
||||
<!--RFC6355. These standards actualy require the duid to be fixed for -->
|
||||
<!--the hardward device and applicable to all network interfaces on -->
|
||||
<!--that device. It is not clear that any software currently enforces -->
|
||||
<!--this requirement although it could be implemented manually. -->
|
||||
@@ -180,7 +177,7 @@
|
||||
<define name="ipv6Addr">
|
||||
<data type="string">
|
||||
<!-- To understand this better, take apart the toplevel "|"s -->
|
||||
<param name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(([0-9A-Fa-f]{1,4}:){0,5}:(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(::([0-9A-Fa-f]{1,4}:){0,5}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(::)</param>
|
||||
<param name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(([0-9A-Fa-f]{1,4}:){0,5}:(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(::([0-9A-Fa-f]{1,4}:){0,5}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
@@ -234,15 +231,9 @@
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name="dirPath">
|
||||
<data type="string">
|
||||
<param name="pattern">[a-zA-Z0-9_\.\+\-\\&"'<>/%]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name="absFilePath">
|
||||
<data type="string">
|
||||
<param name="pattern">/[a-zA-Z0-9_\.\+\-\\&"'<>/%,:]+</param>
|
||||
<param name="pattern">/[a-zA-Z0-9_\.\+\-\\&"'<>/%,]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
@@ -333,7 +324,6 @@
|
||||
<value>parisc64</value>
|
||||
<value>ppc</value>
|
||||
<value>ppc64</value>
|
||||
<value>ppc64le</value>
|
||||
<value>ppcemb</value>
|
||||
<value>s390</value>
|
||||
<value>s390x</value>
|
||||
@@ -365,27 +355,9 @@
|
||||
<value>scsi_host</value>
|
||||
</attribute>
|
||||
</optional>
|
||||
<choice>
|
||||
<group>
|
||||
<attribute name='name'>
|
||||
<text/>
|
||||
</attribute>
|
||||
</group>
|
||||
<group>
|
||||
<interleave>
|
||||
<element name="parentaddr">
|
||||
<optional>
|
||||
<attribute name='unique_id'>
|
||||
<ref name='positiveInteger'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<element name="address">
|
||||
<ref name="pciaddress"/>
|
||||
</element>
|
||||
</element>
|
||||
</interleave>
|
||||
</group>
|
||||
</choice>
|
||||
<attribute name='name'>
|
||||
<text/>
|
||||
</attribute>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name='type'>
|
||||
@@ -396,11 +368,6 @@
|
||||
<text/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='managed'>
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name='wwnn'>
|
||||
<ref name='wwn'/>
|
||||
</attribute>
|
||||
@@ -430,43 +397,4 @@
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name="link-speed-state">
|
||||
<optional>
|
||||
<element name="link">
|
||||
<optional>
|
||||
<attribute name="speed">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="state">
|
||||
<choice>
|
||||
<value>unknown</value>
|
||||
<value>notpresent</value>
|
||||
<value>down</value>
|
||||
<value>lowerlayerdown</value>
|
||||
<value>testing</value>
|
||||
<value>dormant</value>
|
||||
<value>up</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name="virYesNo">
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name="virOnOff">
|
||||
<choice>
|
||||
<value>on</value>
|
||||
<value>off</value>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
</grammar>
|
||||
|
||||
@@ -118,9 +118,6 @@
|
||||
<empty/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<zeroOrMore>
|
||||
<ref name='pagesElem'/>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name='power_management'>
|
||||
@@ -191,25 +188,6 @@
|
||||
<ref name='memory'/>
|
||||
</optional>
|
||||
|
||||
<zeroOrMore>
|
||||
<ref name='pagesElem'/>
|
||||
</zeroOrMore>
|
||||
|
||||
<optional>
|
||||
<element name='distances'>
|
||||
<zeroOrMore>
|
||||
<element name='sibling'>
|
||||
<attribute name='id'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
<attribute name='value'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<element name='cpus'>
|
||||
<attribute name='num'>
|
||||
@@ -393,22 +371,22 @@
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name='disksnapshot'>
|
||||
<ref name='featuretoggle'/>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='featuretoggle'>
|
||||
<attribute name='toggle'>
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name='default'>
|
||||
<ref name="virOnOff"/>
|
||||
<choice>
|
||||
<value>on</value>
|
||||
<value>off</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
@@ -417,18 +395,4 @@
|
||||
<param name='pattern'>[a-zA-Z0-9\-_]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name='pagesElem'>
|
||||
<element name='pages'>
|
||||
<optional>
|
||||
<attribute name='unit'>
|
||||
<ref name='unit'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name='size'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
<ref name='unsignedInt'/>
|
||||
</element>
|
||||
</define>
|
||||
</grammar>
|
||||
|
||||
@@ -1,21 +1,9 @@
|
||||
<?xml version="1.0"?>
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
<!-- Grammar for accepting a domain element, both as top level, and
|
||||
also suitable for inclusion in domainsnapshot.rng -->
|
||||
<!-- We handle only document defining a domain -->
|
||||
<start>
|
||||
<ref name="domain"/>
|
||||
</start>
|
||||
|
||||
<include href='domaincommon.rng'/>
|
||||
|
||||
<define name='storageStartupPolicy' combine='choice'>
|
||||
<!-- overrides the no-op version in storagecommon.rng -->
|
||||
<ref name='startupPolicy'/>
|
||||
</define>
|
||||
|
||||
<define name='storageSourceExtra' combine='choice'>
|
||||
<!-- overrides the no-op version in storagecommon.rng -->
|
||||
<ref name='diskspec'/>
|
||||
</define>
|
||||
|
||||
</grammar>
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- A Relax NG schema for the libvirt domain 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='domainCapabilities'/>
|
||||
</start>
|
||||
|
||||
|
||||
<define name='domainCapabilities'>
|
||||
<element name='domainCapabilities'>
|
||||
<interleave>
|
||||
<element name='path'>
|
||||
<ref name="absFilePath"/>
|
||||
</element>
|
||||
<element name='domain'>
|
||||
<text/>
|
||||
</element>
|
||||
<element name='machine'>
|
||||
<text/>
|
||||
</element>
|
||||
<element name='arch'>
|
||||
<text/>
|
||||
</element>
|
||||
<optional>
|
||||
<ref name='vcpu'/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='os'/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='devices'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='vcpu'>
|
||||
<element name='vcpu'>
|
||||
<attribute name='max'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='loader'>
|
||||
<element name='loader'>
|
||||
<ref name='supported'/>
|
||||
<optional>
|
||||
<ref name='value'/>
|
||||
</optional>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='os'>
|
||||
<element name='os'>
|
||||
<interleave>
|
||||
<ref name='supported'/>
|
||||
<optional>
|
||||
<ref name='loader'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='devices'>
|
||||
<element name='devices'>
|
||||
<interleave>
|
||||
<ref name='disk'/>
|
||||
<ref name='hostdev'/>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='disk'>
|
||||
<element name='disk'>
|
||||
<ref name='supported'/>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='hostdev'>
|
||||
<element name='hostdev'>
|
||||
<ref name='supported'/>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='value'>
|
||||
<zeroOrMore>
|
||||
<element name='value'>
|
||||
<text/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name='supported'>
|
||||
<attribute name='supported'>
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</define>
|
||||
|
||||
<define name='enum'>
|
||||
<zeroOrMore>
|
||||
<element name='enum'>
|
||||
<attribute name='name'>
|
||||
<text/>
|
||||
</attribute>
|
||||
<ref name='value'/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
</grammar>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -75,12 +75,7 @@
|
||||
<ref name="UUID"/>
|
||||
</element>
|
||||
</element>
|
||||
<!-- Nested grammar ensures that any of our overrides of
|
||||
storagecommon/domaincommon defines do not conflict
|
||||
with any domain.rng overrides. -->
|
||||
<grammar>
|
||||
<include href='domain.rng'/>
|
||||
</grammar>
|
||||
<ref name='domain'/>
|
||||
</choice>
|
||||
</optional>
|
||||
<optional>
|
||||
@@ -107,11 +102,6 @@
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name='storageSourceExtra' combine='choice'>
|
||||
<!-- overrides the no-op version in storagecommon.rng -->
|
||||
<ref name='disksnapshotdriver'/>
|
||||
</define>
|
||||
|
||||
<define name='disksnapshot'>
|
||||
<element name='disk'>
|
||||
<attribute name='name'>
|
||||
@@ -133,48 +123,19 @@
|
||||
<value>external</value>
|
||||
</attribute>
|
||||
</optional>
|
||||
<choice>
|
||||
<group>
|
||||
<optional>
|
||||
<attribute name='type'>
|
||||
<value>file</value>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
<interleave>
|
||||
<ref name='disksnapshotdriver'/>
|
||||
<optional>
|
||||
<element name='source'>
|
||||
<optional>
|
||||
<element name='source'>
|
||||
<optional>
|
||||
<attribute name='file'>
|
||||
<ref name='absFilePath'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='storageStartupPolicy'/>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
<attribute name='file'>
|
||||
<ref name='absFilePath'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<ref name='storageSourceExtra'/>
|
||||
</interleave>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name='type'>
|
||||
<value>block</value>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name="source">
|
||||
<attribute name="dev">
|
||||
<ref name="absFilePath"/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<ref name='storageSourceExtra'/>
|
||||
</interleave>
|
||||
</group>
|
||||
<ref name='diskSourceNetwork'/>
|
||||
</choice>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
@@ -185,7 +146,7 @@
|
||||
<element name='driver'>
|
||||
<optional>
|
||||
<attribute name='type'>
|
||||
<ref name='storageFormatBacking'/>
|
||||
<ref name='storageFormat'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<empty/>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:v="http://netcf.org/xml/version/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
<!-- Versions for this schema are simple integers that are incremented
|
||||
every time a changed (but backwards compatible) version
|
||||
everytime a changed (but backwards compatible) version
|
||||
is released. The current version is indicated with the v:serial
|
||||
attribute on the start element.
|
||||
-->
|
||||
@@ -29,41 +29,34 @@
|
||||
Ethernet adapter
|
||||
-->
|
||||
<define name="basic-ethernet-content">
|
||||
<interleave>
|
||||
<attribute name="type">
|
||||
<value>ethernet</value>
|
||||
</attribute>
|
||||
<ref name="name-attr"/>
|
||||
<!-- If no MAC is given when the interface is defined, it is determined
|
||||
by using the device name.
|
||||
FIXME: What if device name and MAC don't specify the same NIC ? -->
|
||||
<optional>
|
||||
<element name="mac">
|
||||
<attribute name="address"><ref name="macAddr"/></attribute>
|
||||
</element>
|
||||
</optional>
|
||||
<ref name="link-speed-state"/>
|
||||
<!-- FIXME: Allow (some) ethtool options -->
|
||||
</interleave>
|
||||
<attribute name="type">
|
||||
<value>ethernet</value>
|
||||
</attribute>
|
||||
<ref name="name-attr"/>
|
||||
<!-- If no MAC is given when the interface is defined, it is determined
|
||||
by using the device name.
|
||||
FIXME: What if device name and MAC don't specify the same NIC ? -->
|
||||
<optional>
|
||||
<element name="mac">
|
||||
<attribute name="address"><ref name="macAddr"/></attribute>
|
||||
</element>
|
||||
</optional>
|
||||
<!-- FIXME: Allow (some) ethtool options -->
|
||||
</define>
|
||||
|
||||
<!-- Ethernet adapter without IP addressing, e.g. for a bridge -->
|
||||
<define name="bare-ethernet-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="basic-ethernet-content"/>
|
||||
</interleave>
|
||||
<ref name="basic-ethernet-content"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="ethernet-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="startmode"/>
|
||||
<ref name="basic-ethernet-content"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
</interleave>
|
||||
<ref name="startmode"/>
|
||||
<ref name="basic-ethernet-content"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
@@ -78,7 +71,6 @@
|
||||
of the form DEVICE.VLAN
|
||||
-->
|
||||
<optional><ref name="name-attr"/></optional>
|
||||
<ref name="link-speed-state"/>
|
||||
</define>
|
||||
|
||||
<define name="vlan-device">
|
||||
@@ -92,22 +84,18 @@
|
||||
|
||||
<define name="bare-vlan-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="vlan-interface-common"/>
|
||||
<ref name="vlan-device"/>
|
||||
</interleave>
|
||||
<ref name="vlan-interface-common"/>
|
||||
<ref name="vlan-device"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="vlan-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="vlan-interface-common"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<ref name="vlan-device"/>
|
||||
</interleave>
|
||||
<ref name="vlan-interface-common"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<ref name="vlan-device"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
@@ -116,33 +104,31 @@
|
||||
-->
|
||||
<define name="bridge-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<attribute name="type">
|
||||
<value>bridge</value>
|
||||
</attribute>
|
||||
<ref name="name-attr"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<element name="bridge">
|
||||
<optional>
|
||||
<attribute name="stp">
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<!-- Bridge forward delay (see 'brctl setfd') -->
|
||||
<optional v:since="2">
|
||||
<attribute name="delay"><ref name="timeval"/></attribute>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<choice>
|
||||
<ref name="bare-ethernet-interface"/>
|
||||
<ref name="bare-vlan-interface"/>
|
||||
<ref v:since="2" name="bare-bond-interface"/>
|
||||
</choice>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</interleave>
|
||||
<attribute name="type">
|
||||
<value>bridge</value>
|
||||
</attribute>
|
||||
<ref name="name-attr"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<element name="bridge">
|
||||
<optional>
|
||||
<attribute name="stp">
|
||||
<ref name="on-or-off"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<!-- Bridge forward delay (see 'brctl setfd') -->
|
||||
<optional v:since="2">
|
||||
<attribute name="delay"><ref name="timeval"/></attribute>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<choice>
|
||||
<ref name="bare-ethernet-interface"/>
|
||||
<ref name="bare-vlan-interface"/>
|
||||
<ref v:since="2" name="bare-bond-interface"/>
|
||||
</choice>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</element>
|
||||
</define>
|
||||
<!-- Jim Fehlig would like support for other bridge attributes, in
|
||||
@@ -157,7 +143,6 @@
|
||||
<value>bond</value>
|
||||
</attribute>
|
||||
<ref name="name-attr"/>
|
||||
<ref name="link-speed-state"/>
|
||||
</define>
|
||||
|
||||
<define name="bond-element">
|
||||
@@ -194,73 +179,67 @@
|
||||
xmit_hash_policy (since 2.6.3/3.2.2)
|
||||
-->
|
||||
|
||||
<interleave>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="miimon">
|
||||
<!-- miimon frequency in ms -->
|
||||
<attribute name="freq"><ref name="unsignedInt"/></attribute>
|
||||
<optional>
|
||||
<attribute name="downdelay"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="updelay"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<!-- use_carrier -->
|
||||
<attribute name="carrier">
|
||||
<choice>
|
||||
<!-- use MII/ETHTOOL ioctl -->
|
||||
<value>ioctl</value>
|
||||
<!-- use netif_carrier_ok() -->
|
||||
<value>netif</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
<element name="arpmon">
|
||||
<attribute name="interval"><ref name="unsignedInt"/></attribute>
|
||||
<attribute name="target"><ref name="ipv4Addr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="validate">
|
||||
<choice>
|
||||
<value>none</value>
|
||||
<value>active</value>
|
||||
<value>backup</value>
|
||||
<value>all</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</choice>
|
||||
</optional>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="miimon">
|
||||
<!-- miimon frequency in ms -->
|
||||
<attribute name="freq"><ref name="unsignedInt"/></attribute>
|
||||
<optional>
|
||||
<attribute name="downdelay"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="updelay"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<!-- use_carrier -->
|
||||
<attribute name="carrier">
|
||||
<choice>
|
||||
<!-- use MII/ETHTOOL ioctl -->
|
||||
<value>ioctl</value>
|
||||
<!-- use netif_carrier_ok() -->
|
||||
<value>netif</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
<element name="arpmon">
|
||||
<attribute name="interval"><ref name="unsignedInt"/></attribute>
|
||||
<attribute name="target"><ref name="ipv4Addr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="validate">
|
||||
<choice>
|
||||
<value>none</value>
|
||||
<value>active</value>
|
||||
<value>backup</value>
|
||||
<value>all</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</choice>
|
||||
</optional>
|
||||
|
||||
<oneOrMore>
|
||||
<!-- The slave interfaces -->
|
||||
<ref name="bare-ethernet-interface"/>
|
||||
</oneOrMore>
|
||||
</interleave>
|
||||
<oneOrMore>
|
||||
<!-- The slave interfaces -->
|
||||
<ref name="bare-ethernet-interface"/>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="bare-bond-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="bond-interface-common"/>
|
||||
<ref name="bond-element"/>
|
||||
</interleave>
|
||||
<ref name="bond-interface-common"/>
|
||||
<ref name="bond-element"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="bond-interface">
|
||||
<element name="interface">
|
||||
<interleave>
|
||||
<ref name="bond-interface-common"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<ref name="bond-element"/>
|
||||
</interleave>
|
||||
<ref name="bond-interface-common"/>
|
||||
<ref name="startmode"/>
|
||||
<ref name="mtu"/>
|
||||
<ref name="interface-addressing"/>
|
||||
<ref name="bond-element"/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
@@ -322,24 +301,22 @@
|
||||
<attribute name="family">
|
||||
<value>ipv4</value>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<choice>
|
||||
<ref name="dhcp-element"/>
|
||||
<group>
|
||||
<element name="ip">
|
||||
<attribute name="address"><ref name="ipv4Addr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="prefix"><ref name="ipv4Prefix"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
<choice>
|
||||
<ref name="dhcp-element"/>
|
||||
<group>
|
||||
<element name="ip">
|
||||
<attribute name="address"><ref name="ipv4Addr"/></attribute>
|
||||
<optional>
|
||||
<element name="route">
|
||||
<attribute name="gateway"><ref name="ipv4Addr"/></attribute>
|
||||
</element>
|
||||
<attribute name="prefix"><ref name="ipv4Prefix"/></attribute>
|
||||
</optional>
|
||||
</group>
|
||||
</choice>
|
||||
</interleave>
|
||||
</element>
|
||||
<optional>
|
||||
<element name="route">
|
||||
<attribute name="gateway"><ref name="ipv4Addr"/></attribute>
|
||||
</element>
|
||||
</optional>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
@@ -348,27 +325,25 @@
|
||||
<attribute name="family">
|
||||
<value>ipv6</value>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name="autoconf"><empty/></element>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="dhcp-element"/>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<element name="ip">
|
||||
<attribute name="address"><ref name="ipv6Addr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="prefix"><ref name="ipv6Prefix"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<element name="route">
|
||||
<attribute name="gateway"><ref name="ipv6Addr"/></attribute>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
<optional>
|
||||
<element name="autoconf"><empty/></element>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="dhcp-element"/>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<element name="ip">
|
||||
<attribute name="address"><ref name="ipv6Addr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="prefix"><ref name="ipv6Prefix"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<element name="route">
|
||||
<attribute name="gateway"><ref name="ipv6Addr"/></attribute>
|
||||
</element>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
@@ -376,7 +351,7 @@
|
||||
<element name="dhcp">
|
||||
<optional>
|
||||
<attribute name="peerdns">
|
||||
<ref name="virYesNo"/>
|
||||
<ref name="yes-or-no"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
@@ -415,6 +390,21 @@
|
||||
instead of destination and nexthop instead of gateway.
|
||||
-->
|
||||
|
||||
<!-- Auxiliary definitions -->
|
||||
<define name="on-or-off">
|
||||
<choice>
|
||||
<value>on</value>
|
||||
<value>off</value>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name="yes-or-no">
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<!-- Type library -->
|
||||
|
||||
<define name="timeval">
|
||||
@@ -425,7 +415,7 @@
|
||||
|
||||
<define name='vlan-id'>
|
||||
<data type="unsignedInt">
|
||||
<param name="maxInclusive">4095</param>
|
||||
<param name="maxInclusive">4096</param>
|
||||
</data>
|
||||
</define>
|
||||
</grammar>
|
||||
|
||||
@@ -21,14 +21,12 @@
|
||||
with no gateways addresses specified -->
|
||||
<optional>
|
||||
<attribute name="ipv6">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="trustGuestRxFilters">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
|
||||
<!-- The name of the network, used to refer to it through the API
|
||||
@@ -55,22 +53,16 @@
|
||||
|
||||
<optional>
|
||||
<attribute name="stp">
|
||||
<ref name="virOnOff"/>
|
||||
<choice>
|
||||
<value>on</value>
|
||||
<value>off</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<attribute name="delay">
|
||||
<data type="unsignedLong"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<attribute name="macTableManager">
|
||||
<choice>
|
||||
<value>kernel</value>
|
||||
<value>libvirt</value>
|
||||
</choice>
|
||||
<data type="integer"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
|
||||
@@ -112,7 +104,10 @@
|
||||
|
||||
<optional>
|
||||
<attribute name="managed">
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
@@ -208,12 +203,10 @@
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="default">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="trustGuestRxFilters">
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
@@ -234,9 +227,6 @@
|
||||
<optional>
|
||||
<element name="domain">
|
||||
<attribute name="name"><ref name="dnsName"/></attribute>
|
||||
<optional>
|
||||
<attribute name="localOnly"><ref name="virYesNo"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
@@ -246,7 +236,10 @@
|
||||
<element name="dns">
|
||||
<optional>
|
||||
<attribute name="forwardPlainNames">
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
@@ -299,6 +292,17 @@
|
||||
<optional>
|
||||
<ref name="vlan"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="link">
|
||||
<attribute name="state">
|
||||
<choice>
|
||||
<value>up</value>
|
||||
<value>down</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<!-- <ip> element -->
|
||||
<zeroOrMore>
|
||||
@@ -363,7 +367,25 @@
|
||||
</zeroOrMore>
|
||||
<!-- <route> element -->
|
||||
<zeroOrMore>
|
||||
<ref name="route"/>
|
||||
<!-- The (static) route element specifies a network address and gateway
|
||||
address to access that network. Both the network address and
|
||||
the gateway address must be specified. -->
|
||||
<element name="route">
|
||||
<optional>
|
||||
<attribute name="family"><ref name="addr-family"/></attribute>
|
||||
</optional>
|
||||
<attribute name="address"><ref name="ipAddr"/></attribute>
|
||||
<optional>
|
||||
<choice>
|
||||
<attribute name="netmask"><ref name="ipv4Addr"/></attribute>
|
||||
<attribute name="prefix"><ref name="ipPrefix"/></attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<attribute name="gateway"><ref name="ipAddr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="metric"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</interleave>
|
||||
</element>
|
||||
|
||||
@@ -78,18 +78,6 @@
|
||||
</optional>
|
||||
</element>
|
||||
</group>
|
||||
<group>
|
||||
<element name="virtualport">
|
||||
<attribute name="type">
|
||||
<value>midonet</value>
|
||||
</attribute>
|
||||
<element name="parameters">
|
||||
<attribute name="interfaceid">
|
||||
<ref name="UUID"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</element>
|
||||
</group>
|
||||
<group>
|
||||
<!-- use this when no type attribute is present -->
|
||||
<element name="virtualport">
|
||||
@@ -236,26 +224,4 @@
|
||||
<param name='maxInclusive'>65535</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<!-- The (static) route element specifies a network address and gateway
|
||||
address to access that network. Both the network address and
|
||||
the gateway address must be specified. -->
|
||||
<define name='route'>
|
||||
<element name="route">
|
||||
<optional>
|
||||
<attribute name="family"><ref name="addr-family"/></attribute>
|
||||
</optional>
|
||||
<attribute name="address"><ref name="ipAddr"/></attribute>
|
||||
<optional>
|
||||
<choice>
|
||||
<attribute name="netmask"><ref name="ipv4Addr"/></attribute>
|
||||
<attribute name="prefix"><ref name="ipPrefix"/></attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<attribute name="gateway"><ref name="ipAddr"/></attribute>
|
||||
<optional>
|
||||
<attribute name="metric"><ref name="unsignedInt"/></attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
</grammar>
|
||||
|
||||
@@ -158,45 +158,6 @@
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<element name='numa'>
|
||||
<optional>
|
||||
<attribute name='node'>
|
||||
<data type='int'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<element name='pci-express'>
|
||||
<zeroOrMore>
|
||||
<element name='link'>
|
||||
<attribute name='validity'>
|
||||
<choice>
|
||||
<value>cap</value>
|
||||
<value>sta</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name='port'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='speed'>
|
||||
<data type="string">
|
||||
<param name="pattern">[0-9]+(.[0-9]+)?</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name='width'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name='capusbdev'>
|
||||
@@ -272,27 +233,12 @@
|
||||
<ref name='mac'/>
|
||||
</element>
|
||||
</optional>
|
||||
<ref name="link-speed-state"/>
|
||||
|
||||
<zeroOrMore>
|
||||
<element name='feature'>
|
||||
<attribute name='name'>
|
||||
<ref name='netfeaturename'/>
|
||||
</attribute>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
|
||||
<zeroOrMore>
|
||||
<ref name='subcapnet'/>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name='netfeaturename'>
|
||||
<data type='string'>
|
||||
<param name='pattern'>[a-zA-Z\-_]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name='subcapnet'>
|
||||
<element name='capability'>
|
||||
<choice>
|
||||
@@ -353,12 +299,6 @@
|
||||
<ref name='unsignedLong'/>
|
||||
</element>
|
||||
|
||||
<optional>
|
||||
<element name='unique_id'>
|
||||
<ref name='positiveInteger'/>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<zeroOrMore>
|
||||
<element name='capability'>
|
||||
@@ -481,6 +421,12 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='hexuint'>
|
||||
<data type='string'>
|
||||
<param name="pattern">(0x)?[0-9a-f]+</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name='mac'>
|
||||
<data type='string'>
|
||||
<param name="pattern">([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}</param>
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
<ref name="common-ipv6-attributes-p1"/>
|
||||
<ref name="common-port-attributes"/>
|
||||
<ref name="ip-attributes"/>
|
||||
<ref name="icmp-attribute-ranges"/>
|
||||
<ref name="comment-attribute"/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
@@ -378,7 +377,10 @@
|
||||
<interleave>
|
||||
<optional>
|
||||
<attribute name="match">
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
@@ -589,31 +591,6 @@
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name="icmp-attribute-ranges">
|
||||
<interleave>
|
||||
<optional>
|
||||
<attribute name="type">
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeend">
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="code">
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="codeend">
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name="mac-attributes">
|
||||
<interleave>
|
||||
<optional>
|
||||
|
||||
@@ -11,12 +11,18 @@
|
||||
<element name='secret'>
|
||||
<optional>
|
||||
<attribute name='ephemeral'>
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='private'>
|
||||
<ref name="virYesNo"/>
|
||||
<choice>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
<interleave>
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- A Relax NG schema for common libvirt XML storage elements -->
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
|
||||
<!-- This schema is not designed for standalone use; another file
|
||||
must include both this file and basictypes.rng -->
|
||||
|
||||
<define name='encryption'>
|
||||
<element name='encryption'>
|
||||
<attribute name='format'>
|
||||
<choice>
|
||||
<value>default</value>
|
||||
<value>qcow</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<zeroOrMore>
|
||||
<ref name='secret'/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='secret'>
|
||||
<element name='secret'>
|
||||
<attribute name='type'>
|
||||
<choice>
|
||||
<value>passphrase</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name='uuid'>
|
||||
<ref name="UUID"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='compat'>
|
||||
<element name='compat'>
|
||||
<data type='string'>
|
||||
<param name='pattern'>[0-9]+\.[0-9]+</param>
|
||||
</data>
|
||||
</element>
|
||||
</define>
|
||||
<define name='fileFormatFeatures'>
|
||||
<element name='features'>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name='lazy_refcounts'>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!-- split the list of known storage formats into two, those where
|
||||
we know how to follow backing chains, and all others -->
|
||||
<define name='storageFormatBacking'>
|
||||
<choice>
|
||||
<value>cow</value>
|
||||
<value>qcow</value>
|
||||
<value>qcow2</value>
|
||||
<value>qed</value>
|
||||
<value>vmdk</value>
|
||||
</choice>
|
||||
</define>
|
||||
<define name='storageFormat'>
|
||||
<choice>
|
||||
<value>raw</value>
|
||||
<value>dir</value>
|
||||
<value>bochs</value>
|
||||
<value>cloop</value>
|
||||
<value>dmg</value>
|
||||
<value>iso</value>
|
||||
<value>vpc</value>
|
||||
<value>vdi</value>
|
||||
<value>fat</value>
|
||||
<value>vhd</value>
|
||||
<value>ploop</value>
|
||||
<ref name='storageFormatBacking'/>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
<define name='storageStartupPolicy'>
|
||||
<!-- Use a combine='choice' override in client files that want to
|
||||
add additional attributes to a <source> sub-element
|
||||
associated with a storage source -->
|
||||
<notAllowed/>
|
||||
</define>
|
||||
|
||||
<define name='storageSourceExtra'>
|
||||
<!-- Use a combine='choice' override in client files that want to
|
||||
add additional elements as siblings of a <source> sub-element
|
||||
associated with a storage source -->
|
||||
<notAllowed/>
|
||||
</define>
|
||||
|
||||
<define name='permissions'>
|
||||
<optional>
|
||||
<element name='permissions'>
|
||||
<interleave>
|
||||
<element name='mode'>
|
||||
<ref name='octalMode'/>
|
||||
</element>
|
||||
<element name='owner'>
|
||||
<choice>
|
||||
<ref name='unsignedInt'/>
|
||||
<value>-1</value>
|
||||
</choice>
|
||||
</element>
|
||||
<element name='group'>
|
||||
<choice>
|
||||
<ref name='unsignedInt'/>
|
||||
<value>-1</value>
|
||||
</choice>
|
||||
</element>
|
||||
<optional>
|
||||
<element name='label'>
|
||||
<text/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
</grammar>
|
||||
33
docs/schemas/storageencryption.rng
Normal file
33
docs/schemas/storageencryption.rng
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- A Relax NG schema for the libvirt volume encryption XML format -->
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
|
||||
<define name='encryption'>
|
||||
<element name='encryption'>
|
||||
<attribute name='format'>
|
||||
<choice>
|
||||
<value>default</value>
|
||||
<value>qcow</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<zeroOrMore>
|
||||
<ref name='secret'/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='secret'>
|
||||
<element name='secret'>
|
||||
<attribute name='type'>
|
||||
<choice>
|
||||
<value>passphrase</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name='uuid'>
|
||||
<ref name="UUID"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
</grammar>
|
||||
24
docs/schemas/storagefilefeatures.rng
Normal file
24
docs/schemas/storagefilefeatures.rng
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- A Relax NG schema for the libvirt volume features XML format -->
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
|
||||
<define name='compat'>
|
||||
<element name='compat'>
|
||||
<data type='string'>
|
||||
<param name='pattern'>[0-9]+\.[0-9]+</param>
|
||||
</data>
|
||||
</element>
|
||||
</define>
|
||||
<define name='fileFormatFeatures'>
|
||||
<element name='features'>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name='lazy_refcounts'>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
</grammar>
|
||||
@@ -3,7 +3,6 @@
|
||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
|
||||
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
<include href='basictypes.rng'/>
|
||||
<include href='storagecommon.rng'/>
|
||||
<start>
|
||||
<ref name='pool'/>
|
||||
</start>
|
||||
@@ -23,7 +22,6 @@
|
||||
<ref name='poolrbd'/>
|
||||
<ref name='poolsheepdog'/>
|
||||
<ref name='poolgluster'/>
|
||||
<ref name='poolzfs'/>
|
||||
</choice>
|
||||
</element>
|
||||
</define>
|
||||
@@ -159,20 +157,6 @@
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name='poolzfs'>
|
||||
<attribute name='type'>
|
||||
<value>zfs</value>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<ref name='commonmetadata'/>
|
||||
<ref name='sizing'/>
|
||||
<ref name='sourcezfs'/>
|
||||
<optional>
|
||||
<ref name='target'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name='sourceinfovendor'>
|
||||
<interleave>
|
||||
<optional>
|
||||
@@ -225,6 +209,35 @@
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name='permissions'>
|
||||
<optional>
|
||||
<element name='permissions'>
|
||||
<interleave>
|
||||
<element name='mode'>
|
||||
<ref name='octalMode'/>
|
||||
</element>
|
||||
<element name='owner'>
|
||||
<choice>
|
||||
<ref name='unsignedInt'/>
|
||||
<value>-1</value>
|
||||
</choice>
|
||||
</element>
|
||||
<element name='group'>
|
||||
<choice>
|
||||
<ref name='unsignedInt'/>
|
||||
<value>-1</value>
|
||||
</choice>
|
||||
</element>
|
||||
<optional>
|
||||
<element name='label'>
|
||||
<text/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name='target'>
|
||||
<element name='target'>
|
||||
<interleave>
|
||||
@@ -314,15 +327,6 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='sourceinfonetfsgluster'>
|
||||
<element name='dir'>
|
||||
<attribute name='path'>
|
||||
<ref name='dirPath'/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='sourceinfoname'>
|
||||
<element name='name'>
|
||||
<text/>
|
||||
@@ -357,17 +361,6 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='sourcezfs'>
|
||||
<element name='source'>
|
||||
<interleave>
|
||||
<ref name='sourceinfoname'/>
|
||||
<optional>
|
||||
<ref name='sourceinfodev'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='sourcefmtfs'>
|
||||
<optional>
|
||||
<element name='format'>
|
||||
@@ -401,6 +394,7 @@
|
||||
<value>auto</value>
|
||||
<value>nfs</value>
|
||||
<value>cifs</value>
|
||||
<value>glusterfs</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</element>
|
||||
@@ -437,7 +431,7 @@
|
||||
<element name='format'>
|
||||
<attribute name='type'>
|
||||
<choice>
|
||||
<value>unknown</value> <!-- back-compat requires keeping 'unknown' not 'auto' -->
|
||||
<value>auto</value>
|
||||
<value>lvm2</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
@@ -474,32 +468,14 @@
|
||||
|
||||
<define name='sourcenetfs'>
|
||||
<element name='source'>
|
||||
<choice>
|
||||
<group>
|
||||
<interleave>
|
||||
<ref name='sourceinfohost'/>
|
||||
<ref name='sourceinfodir'/>
|
||||
<ref name='sourcefmtnetfs'/>
|
||||
<optional>
|
||||
<ref name='sourceinfovendor'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</group>
|
||||
<group>
|
||||
<interleave>
|
||||
<ref name='sourceinfohost'/>
|
||||
<ref name='sourceinfonetfsgluster'/>
|
||||
<element name='format'>
|
||||
<attribute name='type'>
|
||||
<value>glusterfs</value>
|
||||
</attribute>
|
||||
</element>
|
||||
<optional>
|
||||
<ref name='sourceinfovendor'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</group>
|
||||
</choice>
|
||||
<interleave>
|
||||
<ref name='sourceinfohost'/>
|
||||
<ref name='sourceinfodir'/>
|
||||
<ref name='sourcefmtnetfs'/>
|
||||
<optional>
|
||||
<ref name='sourceinfovendor'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
<ref name='vol'/>
|
||||
</start>
|
||||
|
||||
<include href='storagecommon.rng'/>
|
||||
<include href='storageencryption.rng'/>
|
||||
<include href='storagefilefeatures.rng'/>
|
||||
|
||||
|
||||
<define name='vol'>
|
||||
@@ -59,6 +60,29 @@
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<define name='permissions'>
|
||||
<optional>
|
||||
<element name='permissions'>
|
||||
<interleave>
|
||||
<element name='mode'>
|
||||
<ref name='octalMode'/>
|
||||
</element>
|
||||
<element name='owner'>
|
||||
<ref name='unsignedInt'/>
|
||||
</element>
|
||||
<element name='group'>
|
||||
<ref name='unsignedInt'/>
|
||||
</element>
|
||||
<optional>
|
||||
<element name='label'>
|
||||
<text/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name='timestamps'>
|
||||
<optional>
|
||||
<element name='timestamps'>
|
||||
@@ -114,11 +138,6 @@
|
||||
<optional>
|
||||
<ref name='compat'/>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name='nocow'>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='fileFormatFeatures'/>
|
||||
</optional>
|
||||
@@ -194,7 +213,18 @@
|
||||
<define name='formatfile'>
|
||||
<choice>
|
||||
<value>unknown</value>
|
||||
<ref name='storageFormat'/>
|
||||
<value>raw</value>
|
||||
<value>dir</value>
|
||||
<value>bochs</value>
|
||||
<value>cloop</value>
|
||||
<value>cow</value>
|
||||
<value>dmg</value>
|
||||
<value>iso</value>
|
||||
<value>qcow</value>
|
||||
<value>qcow2</value>
|
||||
<value>qed</value>
|
||||
<value>vmdk</value>
|
||||
<value>vpc</value>
|
||||
</choice>
|
||||
</define>
|
||||
|
||||
|
||||
@@ -66,9 +66,9 @@
|
||||
<p>
|
||||
The libvirt security team operates a policy of
|
||||
<a href="http://en.wikipedia.org/wiki/Responsible_disclosure">responsible disclosure</a>.
|
||||
As such any security issue reported, that is not already publicly disclosed
|
||||
As such any security issue reported, that is not already publically disclosed
|
||||
elsewhere, will have an embargo date assigned. Members of the security team agree
|
||||
not to publicly disclose any details of the security issue until the embargo
|
||||
not to publically disclose any details of the security issue until the embargo
|
||||
date expires.
|
||||
</p>
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
are two weeks or less in duration. If a problem is identified
|
||||
with a proposed patch for a security issue, requiring further
|
||||
investigation and bug fixing, the embargo clock may be restarted.
|
||||
In exceptional circumstances longer initial embargoes may be
|
||||
In exceptional circumstances longer initial embargos may be
|
||||
negotiated by mutual agreement between members of the security
|
||||
team and other relevant parties to the problem. Any such extended
|
||||
embargoes will aim to be at most one month in duration.
|
||||
|
||||
@@ -101,16 +101,6 @@
|
||||
<li>
|
||||
<a href="locking.html">Disk locking</a>
|
||||
<span>Ensuring exclusive guest access to disks</span>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="locking-lockd.html">virtlockd</a>
|
||||
<span>virtlockd lock manager plugin</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="locking-sanlock.html">Sanlock</a>
|
||||
<span>Sanlock lock manager plugin</span>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<a href="cgroups.html">CGroups</a>
|
||||
@@ -184,10 +174,6 @@
|
||||
<a href="formatcaps.html">Capabilities</a>
|
||||
<span>The driver capabilities XML format</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="formatdomaincaps.html">Domain capabilities</a>
|
||||
<span>The domain capabilities XML format</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="formatnode.html">Node Devices</a>
|
||||
<span>The host device XML format</span>
|
||||
@@ -262,10 +248,6 @@
|
||||
<a href="drvparallels.html">Parallels</a>
|
||||
<span>Driver for Parallels Cloud Server</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="drvbhyve.html">Bhyve</a>
|
||||
<span>Driver for bhyve</span>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
@@ -301,52 +283,12 @@
|
||||
-->
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html">Domain</a>
|
||||
<span>domain APIs for the libvirt library</span>
|
||||
<a href="html/libvirt-libvirt.html">libvirt</a>
|
||||
<span>core interfaces for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain-snapshot.html">Domain snapshot</a>
|
||||
<span>domain snapshot APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-virterror.html">Error</a>
|
||||
<span>error handling APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-event.html">Event</a>
|
||||
<span>event APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-host.html">Host</a>
|
||||
<span>host APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-interface.html">Interface</a>
|
||||
<span>interface APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-network.html">Network</a>
|
||||
<span>network APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-nodedev.html">Node device</a>
|
||||
<span>node device APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-nwfilter.html">Network filter</a>
|
||||
<span>network filter APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-secret.html">Secret</a>
|
||||
<span>secret APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-storage.html">Storage</a>
|
||||
<span>storage APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-stream.html">Stream</a>
|
||||
<span>stream APIs for the libvirt library</span>
|
||||
<a href="html/libvirt-virterror.html">virterror</a>
|
||||
<span>error handling interfaces for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="hvsupport.html">Driver support</a>
|
||||
@@ -400,10 +342,6 @@
|
||||
<a href="internals/locking.html">Lock managers</a>
|
||||
<span>Use lock managers to protect disk content</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="internals/oomtesting.html">Out of memory testing</a>
|
||||
<span>Simulating OOM conditions in the test suite</span>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
@@ -414,10 +352,6 @@
|
||||
<a href="virshcmdref.html">Virsh Commands</a>
|
||||
<span>Command reference for virsh</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="governance.html">Governance</a>
|
||||
<span>Project governance and code of conduct</span>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
@@ -117,9 +117,6 @@
|
||||
<li>
|
||||
<a href="#StorageBackendGluster">Gluster backend</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#StorageBackendZFS">ZFS backend</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="StorageBackendDir">Directory pool</a></h2>
|
||||
@@ -328,10 +325,14 @@
|
||||
|
||||
<h3>Valid pool format types</h3>
|
||||
<p>
|
||||
The logical volume pool supports only the <code>lvm2</code> format,
|
||||
although not supplying a format value will result in automatic
|
||||
selection of the<code>lvm2</code> format.
|
||||
The logical volume pool supports the following formats:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>auto</code> - automatically determine format</li>
|
||||
<li>
|
||||
<code>lvm2</code>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Valid volume format types</h3>
|
||||
<p>
|
||||
@@ -346,7 +347,6 @@
|
||||
on the size and placement of volumes. The 'free extents'
|
||||
information will detail the regions which are available for creating
|
||||
new volumes. A volume cannot span across 2 different free extents.
|
||||
It will default to using <code>msdos</code> as the pool source format.
|
||||
</p>
|
||||
|
||||
<h3>Example pool input</h3>
|
||||
@@ -552,12 +552,12 @@
|
||||
<name>myrbdpool</name>
|
||||
<source>
|
||||
<name>rbdpool</name>
|
||||
<host name='1.2.3.4' port='6789'/>
|
||||
<host name='my.ceph.monitor' port='6789'/>
|
||||
<host name='third.ceph.monitor' port='6789'/>
|
||||
<auth username='admin' type='ceph'>
|
||||
<secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
|
||||
</auth>
|
||||
<host name='1.2.3.4' port='6789'/>
|
||||
<host name='my.ceph.monitor' port='6789'/>
|
||||
<host name='third.ceph.monitor' port='6789'/>
|
||||
<auth username='admin' type='ceph'>
|
||||
<secret uuid='2ec115d7-3a88-3ceb-bc12-0ac909a6fd87'/>
|
||||
</auth>
|
||||
</source>
|
||||
</pool></pre>
|
||||
|
||||
@@ -711,14 +711,12 @@
|
||||
correspond to the files that can be found when mounting the
|
||||
gluster volume. The <code>name</code> is the path relative to
|
||||
the effective mount specified for the pool; and
|
||||
the <code>key</code> is a string that identifies a single volume
|
||||
uniquely. Currently the <code>key</code> attribute consists of the
|
||||
URI of the volume but it may be changed to a UUID of the volume
|
||||
in the future.</p>
|
||||
the <code>key</code> is a path including the gluster volume
|
||||
name and any subdirectory specified by the pool.</p>
|
||||
<pre>
|
||||
<volume>
|
||||
<name>myfile</name>
|
||||
<key>gluster://localhost/volname/myfile</key>
|
||||
<key>volname/myfile</key>
|
||||
<source>
|
||||
</source>
|
||||
<capacity unit='bytes'>53687091200</capacity>
|
||||
@@ -743,42 +741,5 @@
|
||||
pool type.
|
||||
</p>
|
||||
|
||||
<h2><a name="StorageBackendZFS">ZFS pools</a></h2>
|
||||
<p>
|
||||
This provides a pool based on the ZFS filesystem. It is currently
|
||||
supported on FreeBSD only.
|
||||
</p>
|
||||
|
||||
<p>A pool could either be created manually using the <code>zpool create</code>
|
||||
command and its name specified in the source section or <span class="since">
|
||||
since 1.2.9</span> source devices could be specified to create a pool using
|
||||
libvirt.
|
||||
</p>
|
||||
|
||||
<p>Please refer to the ZFS documentation for details on a pool creation.</p>
|
||||
|
||||
<p><span class="since">Since 1.2.8</span></p>.
|
||||
|
||||
<h3>Example pool input</h3>
|
||||
<pre>
|
||||
<pool type="zfs">
|
||||
<name>myzfspool</name>
|
||||
<source>
|
||||
<name>zpoolname</name>
|
||||
<device path="/dev/ada1"/>
|
||||
<device path="/dev/ada2"/>
|
||||
</source>
|
||||
</pool></pre>
|
||||
|
||||
<h3>Valid pool format types</h3>
|
||||
<p>
|
||||
The ZFS volume pool does not use the pool format type element.
|
||||
</p>
|
||||
|
||||
<h3>Valid pool format types</h3>
|
||||
<p>
|
||||
The ZFS volume pool does not use the volume format type element.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -19,15 +19,7 @@ documents libvirt URIs.
|
||||
<h2><a name="URI_libvirt">Specifying URIs to libvirt</a></h2>
|
||||
|
||||
<p>
|
||||
The URI is passed as the <code>name</code> parameter to
|
||||
<a href="html/libvirt-libvirt-host.html#virConnectOpen">
|
||||
<code>virConnectOpen</code>
|
||||
</a>
|
||||
or
|
||||
<a href="html/libvirt-libvirt-host.html#virConnectOpenReadOnly">
|
||||
<code>virConnectOpenReadOnly</code>
|
||||
</a>.
|
||||
For example:
|
||||
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>);
|
||||
@@ -299,7 +291,7 @@ Notes:
|
||||
<ol>
|
||||
<li> The HTTP client does not fully support IPv6. </li>
|
||||
<li> Many features do not work as expected across HTTP connections, in
|
||||
particular, <a href="html/libvirt-libvirt-host.html#virConnectGetCapabilities">virConnectGetCapabilities</a>.
|
||||
particular, <a href="html/libvirt-libvirt.html#virConnectGetCapabilities">virConnectGetCapabilities</a>.
|
||||
The <a href="remote.html">remote support</a> however does work
|
||||
correctly. </li>
|
||||
<li> XenD's new-style XMLRPC interface is not supported by
|
||||
|
||||
@@ -15,10 +15,8 @@
|
||||
## <http://www.gnu.org/licenses/>.
|
||||
|
||||
EXTRA_DIST= \
|
||||
TEMPLATE.qemu \
|
||||
TEMPLATE.lxc \
|
||||
TEMPLATE \
|
||||
libvirt-qemu \
|
||||
libvirt-lxc \
|
||||
usr.lib.libvirt.virt-aa-helper \
|
||||
usr.sbin.libvirtd
|
||||
|
||||
@@ -32,12 +30,10 @@ apparmor_DATA = \
|
||||
abstractionsdir = $(apparmordir)/abstractions
|
||||
abstractions_DATA = \
|
||||
libvirt-qemu \
|
||||
libvirt-lxc \
|
||||
$(NULL)
|
||||
|
||||
templatesdir = $(apparmordir)/libvirt
|
||||
templatesdir = $(apparmordir)/libvirtd
|
||||
templates_DATA = \
|
||||
TEMPLATE.qemu \
|
||||
TEMPLATE.lxc \
|
||||
TEMPLATE \
|
||||
$(NULL)
|
||||
endif WITH_APPARMOR_PROFILES
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#
|
||||
# This profile is for the domain whose UUID matches this file.
|
||||
#
|
||||
|
||||
#include <tunables/global>
|
||||
|
||||
profile LIBVIRT_TEMPLATE {
|
||||
#include <abstractions/libvirt-lxc>
|
||||
|
||||
# Globally allows everything to run under this profile
|
||||
# These can be narrowed depending on the container's use.
|
||||
file,
|
||||
capability,
|
||||
network,
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
# Last Modified: Fri Feb 7 13:01:36 2014
|
||||
|
||||
#include <abstractions/base>
|
||||
|
||||
umount,
|
||||
|
||||
# ignore DENIED message on / remount
|
||||
deny mount options=(ro, remount) -> /,
|
||||
|
||||
# allow tmpfs mounts everywhere
|
||||
mount fstype=tmpfs,
|
||||
|
||||
# allow mqueue mounts everywhere
|
||||
mount fstype=mqueue,
|
||||
|
||||
# allow fuse mounts everywhere
|
||||
mount fstype=fuse.*,
|
||||
|
||||
# deny writes in /proc/sys/fs but allow binfmt_misc to be mounted
|
||||
mount fstype=binfmt_misc -> /proc/sys/fs/binfmt_misc/,
|
||||
deny @{PROC}/sys/fs/** wklx,
|
||||
|
||||
# allow efivars to be mounted, writing to it will be blocked though
|
||||
mount fstype=efivarfs -> /sys/firmware/efi/efivars/,
|
||||
|
||||
# block some other dangerous paths
|
||||
deny @{PROC}/sysrq-trigger rwklx,
|
||||
deny @{PROC}/mem rwklx,
|
||||
deny @{PROC}/kmem rwklx,
|
||||
|
||||
# deny writes in /sys except for /sys/fs/cgroup, also allow
|
||||
# fusectl, securityfs and debugfs to be mounted there (read-only)
|
||||
mount fstype=fusectl -> /sys/fs/fuse/connections/,
|
||||
mount fstype=securityfs -> /sys/kernel/security/,
|
||||
mount fstype=debugfs -> /sys/kernel/debug/,
|
||||
mount fstype=proc -> /proc/,
|
||||
mount fstype=sysfs -> /sys/,
|
||||
deny /sys/firmware/efi/efivars/** rwklx,
|
||||
deny /sys/kernel/security/** rwklx,
|
||||
|
||||
# generated by: lxc-generate-aa-rules.py container-rules.base
|
||||
deny /proc/sys/[^kn]*{,/**} wklx,
|
||||
deny /proc/sys/k[^e]*{,/**} wklx,
|
||||
deny /proc/sys/ke[^r]*{,/**} wklx,
|
||||
deny /proc/sys/ker[^n]*{,/**} wklx,
|
||||
deny /proc/sys/kern[^e]*{,/**} wklx,
|
||||
deny /proc/sys/kerne[^l]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/[^smhd]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/d[^o]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/do[^m]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/dom[^a]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/doma[^i]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domai[^n]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domain[^n]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domainn[^a]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domainna[^m]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domainnam[^e]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/domainname?*{,/**} wklx,
|
||||
deny /proc/sys/kernel/h[^o]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/ho[^s]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/hos[^t]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/host[^n]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/hostn[^a]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/hostna[^m]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/hostnam[^e]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/hostname?*{,/**} wklx,
|
||||
deny /proc/sys/kernel/m[^s]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/ms[^g]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/msg*/** wklx,
|
||||
deny /proc/sys/kernel/s[^he]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/se[^m]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/sem*/** wklx,
|
||||
deny /proc/sys/kernel/sh[^m]*{,/**} wklx,
|
||||
deny /proc/sys/kernel/shm*/** wklx,
|
||||
deny /proc/sys/kernel?*{,/**} wklx,
|
||||
deny /proc/sys/n[^e]*{,/**} wklx,
|
||||
deny /proc/sys/ne[^t]*{,/**} wklx,
|
||||
deny /proc/sys/net?*{,/**} wklx,
|
||||
deny /sys/[^fdc]*{,/**} wklx,
|
||||
deny /sys/c[^l]*{,/**} wklx,
|
||||
deny /sys/cl[^a]*{,/**} wklx,
|
||||
deny /sys/cla[^s]*{,/**} wklx,
|
||||
deny /sys/clas[^s]*{,/**} wklx,
|
||||
deny /sys/class/[^n]*{,/**} wklx,
|
||||
deny /sys/class/n[^e]*{,/**} wklx,
|
||||
deny /sys/class/ne[^t]*{,/**} wklx,
|
||||
deny /sys/class/net?*{,/**} wklx,
|
||||
deny /sys/class?*{,/**} wklx,
|
||||
deny /sys/d[^e]*{,/**} wklx,
|
||||
deny /sys/de[^v]*{,/**} wklx,
|
||||
deny /sys/dev[^i]*{,/**} wklx,
|
||||
deny /sys/devi[^c]*{,/**} wklx,
|
||||
deny /sys/devic[^e]*{,/**} wklx,
|
||||
deny /sys/device[^s]*{,/**} wklx,
|
||||
deny /sys/devices/[^v]*{,/**} wklx,
|
||||
deny /sys/devices/v[^i]*{,/**} wklx,
|
||||
deny /sys/devices/vi[^r]*{,/**} wklx,
|
||||
deny /sys/devices/vir[^t]*{,/**} wklx,
|
||||
deny /sys/devices/virt[^u]*{,/**} wklx,
|
||||
deny /sys/devices/virtu[^a]*{,/**} wklx,
|
||||
deny /sys/devices/virtua[^l]*{,/**} wklx,
|
||||
deny /sys/devices/virtual/[^n]*{,/**} wklx,
|
||||
deny /sys/devices/virtual/n[^e]*{,/**} wklx,
|
||||
deny /sys/devices/virtual/ne[^t]*{,/**} wklx,
|
||||
deny /sys/devices/virtual/net?*{,/**} wklx,
|
||||
deny /sys/devices/virtual?*{,/**} wklx,
|
||||
deny /sys/devices?*{,/**} wklx,
|
||||
deny /sys/f[^s]*{,/**} wklx,
|
||||
deny /sys/fs/[^c]*{,/**} wklx,
|
||||
deny /sys/fs/c[^g]*{,/**} wklx,
|
||||
deny /sys/fs/cg[^r]*{,/**} wklx,
|
||||
deny /sys/fs/cgr[^o]*{,/**} wklx,
|
||||
deny /sys/fs/cgro[^u]*{,/**} wklx,
|
||||
deny /sys/fs/cgrou[^p]*{,/**} wklx,
|
||||
deny /sys/fs/cgroup?*{,/**} wklx,
|
||||
deny /sys/fs?*{,/**} wklx,
|
||||
@@ -1,4 +1,4 @@
|
||||
# Last Modified: Wed Sep 3 21:52:03 2014
|
||||
# Last Modified: Fri Mar 9 14:43:22 2012
|
||||
|
||||
#include <abstractions/base>
|
||||
#include <abstractions/consoles>
|
||||
@@ -9,10 +9,6 @@
|
||||
capability dac_read_search,
|
||||
capability chown,
|
||||
|
||||
# needed to drop privileges
|
||||
capability setgid,
|
||||
capability setuid,
|
||||
|
||||
network inet stream,
|
||||
network inet6 stream,
|
||||
|
||||
@@ -21,11 +17,10 @@
|
||||
/dev/ptmx rw,
|
||||
/dev/kqemu rw,
|
||||
@{PROC}/*/status r,
|
||||
@{PROC}/sys/kernel/cap_last_cap r,
|
||||
|
||||
# For hostdev access. The actual devices will be added dynamically
|
||||
/sys/bus/usb/devices/ r,
|
||||
/sys/devices/**/usb[0-9]*/** r,
|
||||
/sys/devices/*/*/usb[0-9]*/** r,
|
||||
|
||||
# WARNING: this gives the guest direct access to host hardware and specific
|
||||
# portions of shared memory. This is required for sound using ALSA with kvm,
|
||||
@@ -37,8 +32,6 @@
|
||||
/{dev,run}/shmpulse-shm* rwk,
|
||||
/dev/snd/* rw,
|
||||
capability ipc_lock,
|
||||
# spice
|
||||
owner /{dev,run}/shm/spice.* rw,
|
||||
# 'kill' is not required for sound and is a security risk. Do not enable
|
||||
# unless you absolutely need it.
|
||||
deny capability kill,
|
||||
@@ -65,7 +58,6 @@
|
||||
/usr/share/proll/** r,
|
||||
/usr/share/vgabios/** r,
|
||||
/usr/share/seabios/** r,
|
||||
/usr/share/ovmf/** r,
|
||||
|
||||
# access PKI infrastructure
|
||||
/etc/pki/libvirt-vnc/** r,
|
||||
@@ -111,22 +103,15 @@
|
||||
/usr/bin/qemu-sparc32plus rmix,
|
||||
/usr/bin/qemu-sparc64 rmix,
|
||||
/usr/bin/qemu-x86_64 rmix,
|
||||
/usr/{lib,lib64}/qemu/block-curl.so mr,
|
||||
|
||||
# for save and resume
|
||||
/bin/dash rmix,
|
||||
/bin/dd rmix,
|
||||
/bin/cat rmix,
|
||||
|
||||
# for usb access
|
||||
/dev/bus/usb/ r,
|
||||
/etc/udev/udev.conf r,
|
||||
/sys/bus/ r,
|
||||
/sys/class/ r,
|
||||
|
||||
/usr/{lib,libexec}/qemu-bridge-helper Cx -> qemu_bridge_helper,
|
||||
/usr/libexec/qemu-bridge-helper Cx,
|
||||
# child profile for bridge helper process
|
||||
profile qemu_bridge_helper {
|
||||
profile /usr/libexec/qemu-bridge-helper {
|
||||
#include <abstractions/base>
|
||||
|
||||
capability setuid,
|
||||
@@ -140,5 +125,5 @@
|
||||
/etc/qemu/** r,
|
||||
owner @{PROC}/*/status r,
|
||||
|
||||
/usr/{lib,libexec}/qemu-bridge-helper rmix,
|
||||
/usr/libexec/qemu-bridge-helper rmix,
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user