mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-12-04 20:25:57 +03:00
Compare commits
3 Commits
v4.1.0-rc2
...
v2.1-maint
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e322b6f73d | ||
|
|
dea40b4218 | ||
|
|
f398d4b423 |
@@ -1,40 +0,0 @@
|
|||||||
-I@abs_top_builddir@
|
|
||||||
-I@abs_top_srcdir@
|
|
||||||
-I@abs_top_builddir@/gnulib/lib
|
|
||||||
-I@abs_top_srcdir@/gnulib/lib
|
|
||||||
-I@abs_top_builddir@/include
|
|
||||||
-I@abs_top_srcdir@/include
|
|
||||||
-I@abs_top_builddir@/src
|
|
||||||
-I@abs_top_srcdir@/src
|
|
||||||
-I@abs_top_builddir@/src/access
|
|
||||||
-I@abs_top_srcdir@/src/access
|
|
||||||
-I@abs_top_builddir@/src/admin
|
|
||||||
-I@abs_top_srcdir@/src/admin
|
|
||||||
-I@abs_top_builddir@/src/bhyve
|
|
||||||
-I@abs_top_srcdir@/src/bhyve
|
|
||||||
-I@abs_top_builddir@/src/conf
|
|
||||||
-I@abs_top_srcdir@/src/conf
|
|
||||||
-I@abs_top_builddir@/src/libxl
|
|
||||||
-I@abs_top_srcdir@/src/libxl
|
|
||||||
-I@abs_top_builddir@/src/locking
|
|
||||||
-I@abs_top_srcdir@/src/locking
|
|
||||||
-I@abs_top_builddir@/src/logging
|
|
||||||
-I@abs_top_srcdir@/src/logging
|
|
||||||
-I@abs_top_builddir@/src/lxc
|
|
||||||
-I@abs_top_srcdir@/src/lxc
|
|
||||||
-I@abs_top_builddir@/src/qemu
|
|
||||||
-I@abs_top_srcdir@/src/qemu
|
|
||||||
-I@abs_top_builddir@/src/remote
|
|
||||||
-I@abs_top_srcdir@/src/remote
|
|
||||||
-I@abs_top_builddir@/src/rpc
|
|
||||||
-I@abs_top_srcdir@/src/rpc
|
|
||||||
-I@abs_top_builddir@/src/secret
|
|
||||||
-I@abs_top_srcdir@/src/secret
|
|
||||||
-I@abs_top_builddir@/src/security
|
|
||||||
-I@abs_top_srcdir@/src/security
|
|
||||||
-I@abs_top_builddir@/src/util
|
|
||||||
-I@abs_top_srcdir@/src/util
|
|
||||||
-I@abs_top_builddir@/src/vmx
|
|
||||||
-I@abs_top_srcdir@/src/vmx
|
|
||||||
-I@abs_top_builddir@/src/xenconfig
|
|
||||||
-I@abs_top_srcdir@/src/xenconfig
|
|
||||||
26
.gitignore
vendored
26
.gitignore
vendored
@@ -1,7 +1,7 @@
|
|||||||
*#*#
|
*#*#
|
||||||
*.#*#
|
*.#*#
|
||||||
*.[187]
|
*.[18]
|
||||||
*.[187].in
|
*.[18].in
|
||||||
*.a
|
*.a
|
||||||
*.cov
|
*.cov
|
||||||
*.exe
|
*.exe
|
||||||
@@ -26,7 +26,6 @@
|
|||||||
*.swp
|
*.swp
|
||||||
*~
|
*~
|
||||||
.#*
|
.#*
|
||||||
.color_coded
|
|
||||||
.deps
|
.deps
|
||||||
.dirstamp
|
.dirstamp
|
||||||
.gdb_history
|
.gdb_history
|
||||||
@@ -36,7 +35,6 @@
|
|||||||
.lvimrc
|
.lvimrc
|
||||||
.memdump
|
.memdump
|
||||||
.sc-start-sc_*
|
.sc-start-sc_*
|
||||||
.ycm_extra_conf.py
|
|
||||||
/ABOUT-NLS
|
/ABOUT-NLS
|
||||||
/AUTHORS
|
/AUTHORS
|
||||||
/ChangeLog
|
/ChangeLog
|
||||||
@@ -45,7 +43,7 @@
|
|||||||
/NEWS
|
/NEWS
|
||||||
/aclocal.m4
|
/aclocal.m4
|
||||||
/autom4te.cache
|
/autom4te.cache
|
||||||
/build-aux/*
|
/build-aux/
|
||||||
/build/
|
/build/
|
||||||
/confdefs.h
|
/confdefs.h
|
||||||
/config.cache
|
/config.cache
|
||||||
@@ -59,6 +57,12 @@
|
|||||||
/configure
|
/configure
|
||||||
/configure.lineno
|
/configure.lineno
|
||||||
/conftest.*
|
/conftest.*
|
||||||
|
/daemon/*_dispatch.h
|
||||||
|
/daemon/libvirt_qemud
|
||||||
|
/daemon/libvirtd
|
||||||
|
/daemon/libvirtd*.logrotate
|
||||||
|
/daemon/libvirtd.policy
|
||||||
|
/daemon/test_libvirtd.aug
|
||||||
/docs/aclperms.htmlinc
|
/docs/aclperms.htmlinc
|
||||||
/docs/apibuild.py.stamp
|
/docs/apibuild.py.stamp
|
||||||
/docs/devhelp/libvirt.devhelp
|
/docs/devhelp/libvirt.devhelp
|
||||||
@@ -68,7 +72,6 @@
|
|||||||
/docs/libvirt-lxc-*.xml
|
/docs/libvirt-lxc-*.xml
|
||||||
/docs/libvirt-qemu-*.xml
|
/docs/libvirt-qemu-*.xml
|
||||||
/docs/libvirt-refs.xml
|
/docs/libvirt-refs.xml
|
||||||
/docs/news.html.in
|
|
||||||
/docs/search.php
|
/docs/search.php
|
||||||
/docs/todo.html.in
|
/docs/todo.html.in
|
||||||
/examples/admin/client_close
|
/examples/admin/client_close
|
||||||
@@ -76,7 +79,6 @@
|
|||||||
/examples/admin/client_limits
|
/examples/admin/client_limits
|
||||||
/examples/admin/list_clients
|
/examples/admin/list_clients
|
||||||
/examples/admin/list_servers
|
/examples/admin/list_servers
|
||||||
/examples/admin/logging
|
|
||||||
/examples/admin/threadpool_params
|
/examples/admin/threadpool_params
|
||||||
/examples/object-events/event-test
|
/examples/object-events/event-test
|
||||||
/examples/dominfo/info1
|
/examples/dominfo/info1
|
||||||
@@ -117,7 +119,6 @@
|
|||||||
/src/access/viraccessapicheckqemu.h
|
/src/access/viraccessapicheckqemu.h
|
||||||
/src/admin/admin_client.h
|
/src/admin/admin_client.h
|
||||||
/src/admin/admin_protocol.[ch]
|
/src/admin/admin_protocol.[ch]
|
||||||
/src/admin/admin_server_dispatch_stubs.h
|
|
||||||
/src/esx/*.generated.*
|
/src/esx/*.generated.*
|
||||||
/src/hyperv/*.generated.*
|
/src/hyperv/*.generated.*
|
||||||
/src/libvirt*.def
|
/src/libvirt*.def
|
||||||
@@ -133,9 +134,6 @@
|
|||||||
/src/libvirt_*helper
|
/src/libvirt_*helper
|
||||||
/src/libvirt_*probes.h
|
/src/libvirt_*probes.h
|
||||||
/src/libvirt_lxc
|
/src/libvirt_lxc
|
||||||
/src/libvirtd
|
|
||||||
/src/libvirtd*.logrotate
|
|
||||||
/src/libvirtd.policy
|
|
||||||
/src/locking/libxl-lockd.conf
|
/src/locking/libxl-lockd.conf
|
||||||
/src/locking/libxl-sanlock.conf
|
/src/locking/libxl-sanlock.conf
|
||||||
/src/locking/lock_daemon_dispatch_stubs.h
|
/src/locking/lock_daemon_dispatch_stubs.h
|
||||||
@@ -154,18 +152,15 @@
|
|||||||
/src/qemu/test_libvirtd_qemu.aug
|
/src/qemu/test_libvirtd_qemu.aug
|
||||||
/src/remote/*_client_bodies.h
|
/src/remote/*_client_bodies.h
|
||||||
/src/remote/*_protocol.[ch]
|
/src/remote/*_protocol.[ch]
|
||||||
/src/remote/*_stubs.h
|
|
||||||
/src/rpc/virkeepaliveprotocol.[ch]
|
/src/rpc/virkeepaliveprotocol.[ch]
|
||||||
/src/rpc/virnetprotocol.[ch]
|
/src/rpc/virnetprotocol.[ch]
|
||||||
/src/test_libvirt*.aug
|
/src/test_libvirt*.aug
|
||||||
/src/test_virtlockd.aug
|
/src/test_virtlockd.aug
|
||||||
/src/test_virtlogd.aug
|
/src/test_virtlogd.aug
|
||||||
/src/util/virkeycodetable*.h
|
/src/util/virkeymaps.h
|
||||||
/src/util/virkeynametable*.h
|
|
||||||
/src/virt-aa-helper
|
/src/virt-aa-helper
|
||||||
/src/virtlockd
|
/src/virtlockd
|
||||||
/src/virtlogd
|
/src/virtlogd
|
||||||
/src/virt-guest-shutdown.target
|
|
||||||
/tests/*.log
|
/tests/*.log
|
||||||
/tests/*.pid
|
/tests/*.pid
|
||||||
/tests/*.trs
|
/tests/*.trs
|
||||||
@@ -174,7 +169,6 @@
|
|||||||
/tests/qemucapsprobe
|
/tests/qemucapsprobe
|
||||||
!/tests/virsh-self-test
|
!/tests/virsh-self-test
|
||||||
!/tests/virt-aa-helper-test
|
!/tests/virt-aa-helper-test
|
||||||
!/tests/virt-admin-self-test
|
|
||||||
/tests/objectlocking
|
/tests/objectlocking
|
||||||
/tests/objectlocking-files.txt
|
/tests/objectlocking-files.txt
|
||||||
/tests/objectlocking.cm[ix]
|
/tests/objectlocking.cm[ix]
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,6 +1,3 @@
|
|||||||
[submodule "gnulib"]
|
[submodule "gnulib"]
|
||||||
path = .gnulib
|
path = .gnulib
|
||||||
url = git://git.sv.gnu.org/gnulib.git
|
url = git://git.sv.gnu.org/gnulib.git
|
||||||
[submodule "keycodemapdb"]
|
|
||||||
path = src/keycodemapdb
|
|
||||||
url = https://gitlab.com/keycodemap/keycodemapdb.git
|
|
||||||
|
|||||||
2
.gnulib
2
.gnulib
Submodule .gnulib updated: 7e7c5c7952...68b6adebef
1
.mailmap
1
.mailmap
@@ -61,4 +61,3 @@ Marco Bozzolan <redshift@gmx.com>
|
|||||||
Pritesh Kothari <pritesh.kothari@sun.com>
|
Pritesh Kothari <pritesh.kothari@sun.com>
|
||||||
Wang Yufei (James) <james.wangyufei@huawei.com>
|
Wang Yufei (James) <james.wangyufei@huawei.com>
|
||||||
Deepak C Shetty <dpkshetty@gmail.com>
|
Deepak C Shetty <dpkshetty@gmail.com>
|
||||||
Daniel P. Berrangé <berrange@redhat.com>
|
|
||||||
|
|||||||
130
.travis.yml
130
.travis.yml
@@ -1,130 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
language: c
|
|
||||||
cache: ccache
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- compiler: gcc
|
|
||||||
dist: precise
|
|
||||||
- compiler: gcc
|
|
||||||
dist: trusty
|
|
||||||
- compiler: clang
|
|
||||||
dist: precise
|
|
||||||
- compiler: clang
|
|
||||||
dist: trusty
|
|
||||||
- compiler: clang
|
|
||||||
os: osx
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
# Please keep this list sorted alphabetically
|
|
||||||
packages:
|
|
||||||
- augeas-tools
|
|
||||||
- autoconf
|
|
||||||
- automake
|
|
||||||
- autopoint
|
|
||||||
- ccache
|
|
||||||
- dnsmasq-base
|
|
||||||
- dwarves
|
|
||||||
- ebtables
|
|
||||||
- gcc
|
|
||||||
- gettext
|
|
||||||
- glusterfs-client
|
|
||||||
- libacl1-dev
|
|
||||||
- libapparmor-dev
|
|
||||||
- libattr1-dev
|
|
||||||
- libaudit-dev
|
|
||||||
- libavahi-client-dev
|
|
||||||
- libblkid-dev
|
|
||||||
- libc-dev-bin
|
|
||||||
- libc6-dev
|
|
||||||
- libcap-ng-dev
|
|
||||||
- libcurl4-gnutls-dev
|
|
||||||
- libdbus-1-dev
|
|
||||||
- libdevmapper-dev
|
|
||||||
- libfuse-dev
|
|
||||||
- libgnutls-dev
|
|
||||||
- libnetcf-dev
|
|
||||||
- libnl-3-dev
|
|
||||||
- libnl-route-3-dev
|
|
||||||
- libnuma-dev
|
|
||||||
- libopenwsman-dev
|
|
||||||
- libparted-dev
|
|
||||||
- libpcap-dev
|
|
||||||
- libpciaccess-dev
|
|
||||||
- librbd-dev
|
|
||||||
- libreadline-dev
|
|
||||||
- libsasl2-dev
|
|
||||||
- libselinux1-dev
|
|
||||||
- libssh2-1-dev
|
|
||||||
- libssh-dev
|
|
||||||
- libtool
|
|
||||||
- libudev-dev
|
|
||||||
- libxen-dev
|
|
||||||
- libxml2-dev
|
|
||||||
- libxml2-utils
|
|
||||||
- libyajl-dev
|
|
||||||
- lvm2
|
|
||||||
- make
|
|
||||||
# - nfs-common # broken on trusty since build #807 (2018-01-09)
|
|
||||||
- open-iscsi
|
|
||||||
- parted
|
|
||||||
- patch
|
|
||||||
- perl
|
|
||||||
- pkg-config
|
|
||||||
- policykit-1
|
|
||||||
- qemu-utils
|
|
||||||
- radvd
|
|
||||||
- scrub
|
|
||||||
- sheepdog
|
|
||||||
- systemtap-sdt-dev
|
|
||||||
- xsltproc
|
|
||||||
- zfs-fuse
|
|
||||||
|
|
||||||
git:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
# The custom $PATH is just to pick up some extra binaries installed
|
|
||||||
# through homebrew on macOS and it's completely harmless on Linux
|
|
||||||
- PATH="/usr/local/opt/gettext/bin:/usr/local/opt/rpcgen/bin:$PATH"
|
|
||||||
# The hyperv driver fails to build with clang on precise due to this
|
|
||||||
# error being raised in one of openwsman header files
|
|
||||||
- CFLAGS="-Wno-error=variadic-macros"
|
|
||||||
- VIR_TEST_DEBUG=1
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update && brew upgrade && brew install rpcgen yajl; fi
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- ./autogen.sh
|
|
||||||
|
|
||||||
script:
|
|
||||||
# Many unit tests still fail on macOS, and there are a bunch of issues with
|
|
||||||
# syntax-check as well, so skip those steps on that platform for now
|
|
||||||
- make -j3 && if [ "$TRAVIS_OS_NAME" != "osx" ]; then make -j3 syntax-check && make -j3 check; fi
|
|
||||||
|
|
||||||
after_failure:
|
|
||||||
- echo '============================================================================'
|
|
||||||
- 'if [ -f $(pwd)/tests/test-suite.log ]; then
|
|
||||||
cat $(pwd)/tests/test-suite.log;
|
|
||||||
else
|
|
||||||
echo "=== NO LOG FILE FOUND ===";
|
|
||||||
fi'
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
irc:
|
|
||||||
# The channel name "irc.oftc.net#virt" is encrypted against libvirt/libvirt
|
|
||||||
# to prevent IRC notifications from github forks. This was created using:
|
|
||||||
# $ travis encrypt -r "libvirt/libvirt" "irc.oftc.net#virt"
|
|
||||||
channels:
|
|
||||||
- secure: "hUPdkLxX7nh75+clpnk4U0XLExLfV9DFKSvQSAUtf5JtDNMslj7AeOCf2wcbkNsEhkiF557odTAnov1s5m1w/yaa56zbjFAh5agzqRKya3QjqsrvlBKw/WuN+l82iMNLLeebTgCPAXrbAbGWH8YmYssp/7+eMsnKaVh84EQQNbMCHlLg6ovE26Fs18mZ6J5RC3OPa1vbv+xkdCHvGg/Oyp4K8bpU7RYyimA56jdxI/OfdTH9HxntHYSzykR7hDbyzZhdIlAUyRKReQVjcV5+R8fdDL/1imyGA/88KTztMeKXpZ5Rf+Ss3vYLZb6qsLLegCZ4AU/q0vvbWxjpZGJZoeyrVpfBTZdYGIzmLTMl9GYXXa/gDwFlbvRDiPDG4TIy6GlMUROinj7KRKEHu1fWRYu012ife5OjidxcwrTnz21vYaCv3AKWPpMPxwIzQPkY1hex9uLLX6z+TrAxxDLF+7UzRT9w2RLFBkLYlj2aDVrLAVb/ynRsxDz5CGzC61FSQVft2e308SkGjdn8YxvguCuXv+N70Fu1cvFyh5XYeHb4fbBRo0Ctzaec78leHlQvRGWKJxXDXRkE2lvvBc7YbBNSAYh7Fs8Y+zY7l7rMxvXdrt3nuaNQhe74V3yhxPDAld66qmAn9TYMmaZW2f5/KKKILLbCa0t2MxiAc6L2OI8="
|
|
||||||
on_success: change
|
|
||||||
on_failure: always
|
|
||||||
email:
|
|
||||||
# The list name 'libvirt-ci@redhat.com" is encrypted against libvirt/libvirt
|
|
||||||
# to prevent IRC notifications from github forks. This was created using:
|
|
||||||
# $ travis encrypt -r "libvirt/libvirt" "libvirt-ci@redhat.com"
|
|
||||||
recipients:
|
|
||||||
- secure: "QcU9eP96P0RlDNzVRZl/4sxyydPStGzECrpgJhr2IPB/7pHk23yaBrmUsq9S830tB+jwLGma1IscNB8uf7Sf7WY+cYIpfR8v030OffWnaipo/Gcs0dpnlfURWHjOFQI3RJzGEihsqvbwUFOwsM+3IDyO3qdWaiT6cN2Tj9ROlwYCySSX5YWzLyX7arBZ4lp8ESs7ohQaEwp2cegnMP2oGPJJe4SebvlCDjHZbjkU5aEradwUWnRQDJZWTKknpNLArVFxN2/ixp6f/MGY4DmkHoDweio6mHIPN5zTs5Jt32aiX6wDBa+bBa4v8TCRqzhYkQ63ZZhNV8bY5Uf9ufTdyvt96yIANyakd85b1QpMdAX76IyJi1l0/Uub6DTQZAcq3vK7iPjGeTVSpyoXrqTfGy4JxMjqDoocpWvv8ALX1wrYI/HfN2R2Aepw9jModTimOsebYhJ1yMhSt8qnh5AQNftGKL2JBKoA1LWdU2YJ5fO1bGjKNiVEkGFQTPYFWrYCUY5JcT+s5WCzNeMNm8s9na8liYhGl3WtS3rPr5M8bof+BMsBhG2hQ0loduc94x2GkvyhQZUgRbqrwNR+y4hn+rWFC3hBzzyiAULs43vY/PJ+eBdKEf3VAc0MkhQ8GgXGSA61fR6aXYonroI/WnBVItwDmUnnMfSziZXxk09GLl4="
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
flags = [
|
|
||||||
'-I@abs_top_builddir@',
|
|
||||||
'-I@abs_top_srcdir@',
|
|
||||||
'-I@abs_top_builddir@/gnulib/lib',
|
|
||||||
'-I@abs_top_srcdir@/gnulib/lib',
|
|
||||||
'-I@abs_top_builddir@/include',
|
|
||||||
'-I@abs_top_srcdir@/include',
|
|
||||||
'-I@abs_top_builddir@/src',
|
|
||||||
'-I@abs_top_srcdir@/src',
|
|
||||||
'-I@abs_top_builddir@/src/access',
|
|
||||||
'-I@abs_top_srcdir@/src/access',
|
|
||||||
'-I@abs_top_builddir@/src/admin',
|
|
||||||
'-I@abs_top_srcdir@/src/admin',
|
|
||||||
'-I@abs_top_builddir@/src/bhyve',
|
|
||||||
'-I@abs_top_srcdir@/src/bhyve',
|
|
||||||
'-I@abs_top_builddir@/src/conf',
|
|
||||||
'-I@abs_top_srcdir@/src/conf',
|
|
||||||
'-I@abs_top_builddir@/src/libxl',
|
|
||||||
'-I@abs_top_srcdir@/src/libxl',
|
|
||||||
'-I@abs_top_builddir@/src/locking',
|
|
||||||
'-I@abs_top_srcdir@/src/locking',
|
|
||||||
'-I@abs_top_builddir@/src/logging',
|
|
||||||
'-I@abs_top_srcdir@/src/logging',
|
|
||||||
'-I@abs_top_builddir@/src/lxc',
|
|
||||||
'-I@abs_top_srcdir@/src/lxc',
|
|
||||||
'-I@abs_top_builddir@/src/qemu',
|
|
||||||
'-I@abs_top_srcdir@/src/qemu',
|
|
||||||
'-I@abs_top_builddir@/src/remote',
|
|
||||||
'-I@abs_top_srcdir@/src/remote',
|
|
||||||
'-I@abs_top_builddir@/src/rpc',
|
|
||||||
'-I@abs_top_srcdir@/src/rpc',
|
|
||||||
'-I@abs_top_builddir@/src/secret',
|
|
||||||
'-I@abs_top_srcdir@/src/secret',
|
|
||||||
'-I@abs_top_builddir@/src/security',
|
|
||||||
'-I@abs_top_srcdir@/src/security',
|
|
||||||
'-I@abs_top_builddir@/src/util',
|
|
||||||
'-I@abs_top_srcdir@/src/util',
|
|
||||||
'-I@abs_top_builddir@/src/vmx',
|
|
||||||
'-I@abs_top_srcdir@/src/vmx',
|
|
||||||
'-I@abs_top_builddir@/src/xenconfig',
|
|
||||||
'-I@abs_top_srcdir@/src/xenconfig',
|
|
||||||
]
|
|
||||||
|
|
||||||
def FlagsForFile(filename, **kwargs):
|
|
||||||
return { 'flags': flags, 'do_cache': True }
|
|
||||||
@@ -10,7 +10,6 @@ The primary maintainers and people with commit access rights:
|
|||||||
Alex Jia <ajia@redhat.com>
|
Alex Jia <ajia@redhat.com>
|
||||||
Andrea Bolognani <abologna@redhat.com>
|
Andrea Bolognani <abologna@redhat.com>
|
||||||
Cédric Bosdonnat <cbosdonnat@suse.com>
|
Cédric Bosdonnat <cbosdonnat@suse.com>
|
||||||
Christian Ehrhardt <christian.ehrhardt@canonical.com>
|
|
||||||
Christophe Fergeau <cfergeau@redhat.com>
|
Christophe Fergeau <cfergeau@redhat.com>
|
||||||
Claudio Bley <claudio.bley@gmail.com>
|
Claudio Bley <claudio.bley@gmail.com>
|
||||||
Cole Robinson <crobinso@redhat.com>
|
Cole Robinson <crobinso@redhat.com>
|
||||||
@@ -61,6 +60,7 @@ Amit Shah <amit.shah@redhat.com>
|
|||||||
Andrew Puch <apuch@redhat.com>
|
Andrew Puch <apuch@redhat.com>
|
||||||
Anton Protopopov <aspsk2@gmail.com>
|
Anton Protopopov <aspsk2@gmail.com>
|
||||||
Ben Guthro <ben.guthro@gmail.com>
|
Ben Guthro <ben.guthro@gmail.com>
|
||||||
|
Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
|
||||||
Daniel Hokka Zakrisson <daniel@hozac.com>
|
Daniel Hokka Zakrisson <daniel@hozac.com>
|
||||||
Dan Wendlandt <dan@nicira.com>
|
Dan Wendlandt <dan@nicira.com>
|
||||||
David Lively <dlively@virtualiron.com>
|
David Lively <dlively@virtualiron.com>
|
||||||
|
|||||||
41
Makefile.am
41
Makefile.am
@@ -19,7 +19,7 @@
|
|||||||
LCOV = lcov
|
LCOV = lcov
|
||||||
GENHTML = genhtml
|
GENHTML = genhtml
|
||||||
|
|
||||||
SUBDIRS = . gnulib/lib include/libvirt src tools docs gnulib/tests \
|
SUBDIRS = . gnulib/lib include/libvirt src daemon tools docs gnulib/tests \
|
||||||
tests po examples
|
tests po examples
|
||||||
|
|
||||||
XZ_OPT ?= -v -T0
|
XZ_OPT ?= -v -T0
|
||||||
@@ -36,35 +36,34 @@ EXTRA_DIST = \
|
|||||||
libvirt-qemu.pc.in \
|
libvirt-qemu.pc.in \
|
||||||
libvirt-lxc.pc.in \
|
libvirt-lxc.pc.in \
|
||||||
libvirt-admin.pc.in \
|
libvirt-admin.pc.in \
|
||||||
|
autobuild.sh \
|
||||||
Makefile.nonreentrant \
|
Makefile.nonreentrant \
|
||||||
autogen.sh \
|
autogen.sh \
|
||||||
cfg.mk \
|
cfg.mk \
|
||||||
run.in \
|
run.in \
|
||||||
README.md \
|
|
||||||
AUTHORS.in
|
AUTHORS.in
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
||||||
|
|
||||||
NEWS: \
|
NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in
|
||||||
$(srcdir)/docs/news.xml \
|
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||||
$(srcdir)/docs/news-ascii.xsl \
|
$(XSLTPROC) --nonet $(top_srcdir)/docs/news.xsl \
|
||||||
$(srcdir)/docs/reformat-news.py
|
$(top_srcdir)/docs/news.html.in \
|
||||||
$(AM_V_GEN) \
|
| perl -0777 -pe 's/\n\n+$$/\n/' \
|
||||||
if [ -x $(XSLTPROC) ]; then \
|
| perl -pe 's/[ \t]+$$//' \
|
||||||
$(XSLTPROC) --nonet \
|
> $@-t && mv $@-t $@ ; fi
|
||||||
$(srcdir)/docs/news-ascii.xsl \
|
|
||||||
$(srcdir)/docs/news.xml \
|
$(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \
|
||||||
>$@-tmp \
|
$(top_srcdir)/docs/hacking2.xsl \
|
||||||
|| { rm -f $@-tmp; exit 1; }; \
|
$(top_srcdir)/docs/wrapstring.xsl \
|
||||||
$(srcdir)/docs/reformat-news.py $@-tmp >$@ \
|
$(top_srcdir)/docs/hacking.html.in
|
||||||
|| { rm -f $@-tmp; exit 1; }; \
|
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||||
rm -f $@-tmp; \
|
$(XSLTPROC) --nonet $(top_srcdir)/docs/hacking1.xsl \
|
||||||
fi
|
$(top_srcdir)/docs/hacking.html.in | \
|
||||||
EXTRA_DIST += \
|
$(XSLTPROC) --nonet $(top_srcdir)/docs/hacking2.xsl - \
|
||||||
$(srcdir)/docs/news.xml \
|
| perl -0777 -pe 's/\n\n+$$/\n/' \
|
||||||
$(srcdir)/docs/news-ascii.xsl \
|
> $@-t && mv $@-t $@ ; fi;
|
||||||
$(srcdir)/docs/reformat-news.py
|
|
||||||
|
|
||||||
rpm: clean
|
rpm: clean
|
||||||
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
|
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
## <http://www.gnu.org/licenses/>.
|
## <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Generated by running the following on Fedora 26:
|
# Generated by running the following on Fedora 9:
|
||||||
#
|
#
|
||||||
# nm -D --defined-only /lib64/libc.so.6 \
|
# nm -D --defined-only /lib/libc.so.6 \
|
||||||
# | grep '_r$' \
|
# | grep '_r$' \
|
||||||
# | awk '{print $3}' \
|
# | awk '{print $3}' \
|
||||||
# | grep -v __ \
|
# | grep -v __ \
|
||||||
@@ -43,7 +43,6 @@ NON_REENTRANT += ether_ntoa
|
|||||||
NON_REENTRANT += fcvt
|
NON_REENTRANT += fcvt
|
||||||
NON_REENTRANT += fgetgrent
|
NON_REENTRANT += fgetgrent
|
||||||
NON_REENTRANT += fgetpwent
|
NON_REENTRANT += fgetpwent
|
||||||
NON_REENTRANT += fgetsgent
|
|
||||||
NON_REENTRANT += fgetspent
|
NON_REENTRANT += fgetspent
|
||||||
NON_REENTRANT += getaliasbyname
|
NON_REENTRANT += getaliasbyname
|
||||||
NON_REENTRANT += getaliasent
|
NON_REENTRANT += getaliasent
|
||||||
@@ -73,8 +72,6 @@ NON_REENTRANT += getrpcent
|
|||||||
NON_REENTRANT += getservbyname
|
NON_REENTRANT += getservbyname
|
||||||
NON_REENTRANT += getservbyport
|
NON_REENTRANT += getservbyport
|
||||||
NON_REENTRANT += getservent
|
NON_REENTRANT += getservent
|
||||||
NON_REENTRANT += getsgent
|
|
||||||
NON_REENTRANT += getsgnam
|
|
||||||
NON_REENTRANT += getspent
|
NON_REENTRANT += getspent
|
||||||
NON_REENTRANT += getspnam
|
NON_REENTRANT += getspnam
|
||||||
NON_REENTRANT += getutent
|
NON_REENTRANT += getutent
|
||||||
@@ -98,7 +95,6 @@ NON_REENTRANT += random
|
|||||||
NON_REENTRANT += rand
|
NON_REENTRANT += rand
|
||||||
NON_REENTRANT += seed48
|
NON_REENTRANT += seed48
|
||||||
NON_REENTRANT += setstate
|
NON_REENTRANT += setstate
|
||||||
NON_REENTRANT += sgetsgent
|
|
||||||
NON_REENTRANT += sgetspent
|
NON_REENTRANT += sgetspent
|
||||||
NON_REENTRANT += srand48
|
NON_REENTRANT += srand48
|
||||||
NON_REENTRANT += srandom
|
NON_REENTRANT += srandom
|
||||||
|
|||||||
13
README
Normal file
13
README
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
LibVirt : simple API for virtualization
|
||||||
|
|
||||||
|
Libvirt is a C toolkit to interact with the virtualization capabilities
|
||||||
|
of recent versions of Linux (and other OSes). It is free software
|
||||||
|
available under the GNU Lesser General Public License. Virtualization of
|
||||||
|
the Linux Operating System means the ability to run multiple instances of
|
||||||
|
Operating Systems concurrently on a single hardware system where the basic
|
||||||
|
resources are driven by a Linux instance. The library aim at providing
|
||||||
|
long term stable C API initially for the Xen paravirtualization but
|
||||||
|
should be able to integrate other virtualization mechanisms if needed.
|
||||||
|
|
||||||
|
Daniel Veillard <veillard@redhat.com>
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
These notes intend to help people working on the checked-out sources.
|
These notes intend to help people working on the checked-out sources.
|
||||||
These requirements do not apply when building from a distribution tarball.
|
These requirements do not apply when building from a distribution tarball.
|
||||||
See also docs/hacking.html (after building libvirt using the information
|
See also HACKING for more detailed libvirt contribution guidelines.
|
||||||
included in this file) for more detailed contribution guidelines.
|
|
||||||
|
|
||||||
* Requirements
|
* Requirements
|
||||||
|
|
||||||
|
|||||||
83
README.md
83
README.md
@@ -1,83 +0,0 @@
|
|||||||
[](https://travis-ci.org/libvirt/libvirt)
|
|
||||||
[](https://bestpractices.coreinfrastructure.org/projects/355)
|
|
||||||
|
|
||||||
Libvirt API for virtualization
|
|
||||||
==============================
|
|
||||||
|
|
||||||
Libvirt provides a portable, long term stable C API for managing the
|
|
||||||
virtualization technologies provided by many operating systems. It
|
|
||||||
includes support for QEMU, KVM, Xen, LXC, bhyve, Virtuozzo, VMware
|
|
||||||
vCenter and ESX, VMware Desktop, Hyper-V, VirtualBox and the POWER
|
|
||||||
Hypervisor.
|
|
||||||
|
|
||||||
For some of these hypervisors, it provides a stateful management
|
|
||||||
daemon which runs on the virtualization host allowing access to the
|
|
||||||
API both by non-privileged local users and remote users.
|
|
||||||
|
|
||||||
Layered packages provide bindings of the libvirt C API into other
|
|
||||||
languages including Python, Perl, PHP, Go, Java, OCaml, as well as
|
|
||||||
mappings into object systems such as GObject, CIM and SNMP.
|
|
||||||
|
|
||||||
Further information about the libvirt project can be found on the
|
|
||||||
website:
|
|
||||||
|
|
||||||
[https://libvirt.org](https://libvirt.org)
|
|
||||||
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
The libvirt C API is distributed under the terms of GNU Lesser General
|
|
||||||
Public License, version 2.1 (or later). Some parts of the code that are
|
|
||||||
not part of the C library may have the more restrictive GNU General
|
|
||||||
Public License, version 2.1 (or later). See the files `COPYING.LESSER`
|
|
||||||
and `COPYING` for full license terms & conditions.
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
Libvirt uses the GNU Autotools build system, so in general can be built
|
|
||||||
and installed with the usual commands. For example, to build in a manner
|
|
||||||
that is suitable for installing as root, use:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
```
|
|
||||||
|
|
||||||
While to build & install as an unprivileged user
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ./configure --prefix=$HOME/usr
|
|
||||||
$ make
|
|
||||||
$ make install
|
|
||||||
```
|
|
||||||
|
|
||||||
The libvirt code relies on a large number of 3rd party libraries. These will
|
|
||||||
be detected during execution of the `configure` script and a summary printed
|
|
||||||
which lists any missing (optional) dependencies.
|
|
||||||
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
The libvirt project welcomes contributions in many ways. For most components
|
|
||||||
the best way to contribute is to send patches to the primary development
|
|
||||||
mailing list. Further guidance on this can be found on the website:
|
|
||||||
|
|
||||||
[https://libvirt.org/contribute.html](https://libvirt.org/contribute.html)
|
|
||||||
|
|
||||||
|
|
||||||
Contact
|
|
||||||
-------
|
|
||||||
|
|
||||||
The libvirt project has two primary mailing lists:
|
|
||||||
|
|
||||||
* libvirt-users@redhat.com (**for user discussions**)
|
|
||||||
* libvir-list@redhat.com (**for development only**)
|
|
||||||
|
|
||||||
Further details on contacting the project are available on the website:
|
|
||||||
|
|
||||||
[https://libvirt.org/contact.html](https://libvirt.org/contact.html)
|
|
||||||
22
TODO
Normal file
22
TODO
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
libvirt TODO list
|
||||||
|
=================
|
||||||
|
|
||||||
|
The TODO list changes frequently, so is maintained online
|
||||||
|
in the libvirt bugzilla
|
||||||
|
|
||||||
|
http://bugzilla.redhat.com/
|
||||||
|
|
||||||
|
Search against
|
||||||
|
|
||||||
|
Product: Virtualization Tools
|
||||||
|
Component: libvirt
|
||||||
|
Subject: RFE
|
||||||
|
|
||||||
|
Or browse dependent bugs under
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=libvirtTodo
|
||||||
|
|
||||||
|
Summarized reports automatically generated from bugzilla
|
||||||
|
and provided online at
|
||||||
|
|
||||||
|
http://libvirt.org/todo.html
|
||||||
122
autobuild.sh
Executable file
122
autobuild.sh
Executable file
@@ -0,0 +1,122 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -v
|
||||||
|
|
||||||
|
# Make things clean.
|
||||||
|
|
||||||
|
test -n "$1" && RESULTS=$1 || RESULTS=results.log
|
||||||
|
: ${AUTOBUILD_INSTALL_ROOT=$HOME/builder}
|
||||||
|
|
||||||
|
# If run under the autobuilder, we must use --nodeps with rpmbuild;
|
||||||
|
# but this can lead to odd error diagnosis for normal development.
|
||||||
|
nodeps=
|
||||||
|
if test "${AUTOBUILD_COUNTER+set}"; then
|
||||||
|
nodeps=--nodeps
|
||||||
|
fi
|
||||||
|
|
||||||
|
test -f Makefile && make -k distclean || :
|
||||||
|
rm -rf coverage
|
||||||
|
|
||||||
|
rm -rf build
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
|
||||||
|
# Run with options not normally exercised by the rpm build, for
|
||||||
|
# more complete code coverage.
|
||||||
|
../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
|
||||||
|
--enable-expensive-tests \
|
||||||
|
--enable-test-coverage \
|
||||||
|
--disable-nls \
|
||||||
|
--enable-werror \
|
||||||
|
--enable-static
|
||||||
|
|
||||||
|
# If the MAKEFLAGS envvar does not yet include a -j option,
|
||||||
|
# add -jN where N depends on the number of processors.
|
||||||
|
case $MAKEFLAGS in
|
||||||
|
*-j*) ;;
|
||||||
|
*) n=$(getconf _NPROCESSORS_ONLN 2> /dev/null)
|
||||||
|
test "$n" -gt 0 || n=1
|
||||||
|
n=$(expr $n + 1)
|
||||||
|
MAKEFLAGS="$MAKEFLAGS -j$n"
|
||||||
|
export MAKEFLAGS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# set -o pipefail is a bashism; this use of exec is the POSIX alternative
|
||||||
|
exec 3>&1
|
||||||
|
st=$(
|
||||||
|
exec 4>&1 >&3
|
||||||
|
{ make check syntax-check 2>&1 3>&- 4>&-; echo $? >&4; } | tee "$RESULTS"
|
||||||
|
)
|
||||||
|
exec 3>&-
|
||||||
|
test "$st" = 0
|
||||||
|
test -x /usr/bin/lcov && make cov
|
||||||
|
|
||||||
|
rm -f *.tar.xz
|
||||||
|
make dist
|
||||||
|
|
||||||
|
if test -n "$AUTOBUILD_COUNTER" ; then
|
||||||
|
EXTRA_RELEASE=".auto$AUTOBUILD_COUNTER"
|
||||||
|
else
|
||||||
|
NOW=`date +"%s"`
|
||||||
|
EXTRA_RELEASE=".$USER$NOW"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -f /usr/bin/rpmbuild ; then
|
||||||
|
rpmbuild $nodeps \
|
||||||
|
--define "extra_release $EXTRA_RELEASE" \
|
||||||
|
--define "_sourcedir `pwd`" \
|
||||||
|
-ba --clean libvirt.spec
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test mingw32 cross-compile
|
||||||
|
if test -x /usr/bin/i686-w64-mingw32-gcc ; then
|
||||||
|
make distclean
|
||||||
|
|
||||||
|
PKG_CONFIG_LIBDIR="/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/i686-w64-mingw32/sys-root/mingw/share/pkgconfig" \
|
||||||
|
PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
|
||||||
|
CC="i686-w64-mingw32-gcc" \
|
||||||
|
../configure \
|
||||||
|
--build=$(uname -m)-w64-linux \
|
||||||
|
--host=i686-w64-mingw32 \
|
||||||
|
--prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \
|
||||||
|
--enable-expensive-tests \
|
||||||
|
--enable-werror
|
||||||
|
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test mingw64 cross-compile
|
||||||
|
if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
|
||||||
|
make distclean
|
||||||
|
|
||||||
|
PKG_CONFIG_LIBDIR="/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/x86_64-w64-mingw32/sys-root/mingw/share/pkgconfig" \
|
||||||
|
PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
|
||||||
|
CC="x86_64-w64-mingw32-gcc" \
|
||||||
|
../configure \
|
||||||
|
--build=$(uname -m)-w64-linux \
|
||||||
|
--host=x86_64-w64-mingw32 \
|
||||||
|
--prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \
|
||||||
|
--enable-expensive-tests \
|
||||||
|
--enable-werror
|
||||||
|
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test -x /usr/bin/i686-w64-mingw32-gcc && test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
|
||||||
|
if test -f /usr/bin/rpmbuild ; then
|
||||||
|
rpmbuild $nodeps \
|
||||||
|
--define "extra_release $EXTRA_RELEASE" \
|
||||||
|
--define "_sourcedir `pwd`" \
|
||||||
|
-ba --clean mingw-libvirt.spec
|
||||||
|
fi
|
||||||
|
fi
|
||||||
248
autogen.sh
248
autogen.sh
@@ -1,209 +1,117 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Run this to generate all the initial makefiles, etc.
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
die()
|
set -e
|
||||||
{
|
|
||||||
echo "error: $1" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
starting_point=$(pwd)
|
srcdir=`dirname "$0"`
|
||||||
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
srcdir=$(dirname "$0")
|
THEDIR=`pwd`
|
||||||
test "$srcdir" || srcdir=.
|
cd "$srcdir"
|
||||||
|
|
||||||
cd "$srcdir" || {
|
|
||||||
die "Failed to cd into $srcdir"
|
|
||||||
}
|
|
||||||
|
|
||||||
test -f src/libvirt.c || {
|
test -f src/libvirt.c || {
|
||||||
die "$0 must live in the top-level libvirt directory"
|
echo "You must run this script in the top-level libvirt directory"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
dry_run=
|
|
||||||
|
EXTRA_ARGS=
|
||||||
no_git=
|
no_git=
|
||||||
gnulib_srcdir=
|
if test "x$1" = "x--no-git"; then
|
||||||
extra_args=
|
|
||||||
while test "$#" -gt 0; do
|
|
||||||
case "$1" in
|
|
||||||
--dry-run)
|
|
||||||
# This variable will serve both as an indicator of the fact that
|
|
||||||
# a dry run has been requested, and to store the result of the
|
|
||||||
# dry run. It will be ultimately used as return code for the
|
|
||||||
# script: 0 means no action is necessary, 2 means that autogen.sh
|
|
||||||
# needs to be executed, and 1 is reserved for failures
|
|
||||||
dry_run=0
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--no-git)
|
|
||||||
no_git=" $1"
|
no_git=" $1"
|
||||||
shift
|
shift
|
||||||
;;
|
case "$1 $2" in
|
||||||
--gnulib-srcdir=*)
|
--gnulib-srcdir=*) no_git="$no_git $1"; shift ;;
|
||||||
gnulib_srcdir=" $1"
|
--gnulib-srcdir\ *) no_git="$no_git $1=$2"; shift; shift;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test -z "$NOCONFIGURE" ; then
|
||||||
|
if test "x$1" = "x--system"; then
|
||||||
shift
|
shift
|
||||||
;;
|
|
||||||
--gnulib-srcdir)
|
|
||||||
gnulib_srcdir=" $1=$2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--system)
|
|
||||||
prefix=/usr
|
prefix=/usr
|
||||||
|
libdir=$prefix/lib
|
||||||
sysconfdir=/etc
|
sysconfdir=/etc
|
||||||
localstatedir=/var
|
localstatedir=/var
|
||||||
if test -d $prefix/lib64; then
|
if [ -d /usr/lib64 ]; then
|
||||||
libdir=$prefix/lib64
|
libdir=$prefix/lib64
|
||||||
else
|
|
||||||
libdir=$prefix/lib
|
|
||||||
fi
|
fi
|
||||||
extra_args="--prefix=$prefix --localstatedir=$localstatedir"
|
EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir"
|
||||||
extra_args="$extra_args --sysconfdir=$sysconfdir --libdir=$libdir"
|
echo "Running ./configure with $EXTRA_ARGS $@"
|
||||||
shift
|
else
|
||||||
;;
|
if test -z "$*" && test ! -f "$THEDIR/config.status"; then
|
||||||
*)
|
echo "I am going to run ./configure with no arguments - if you wish"
|
||||||
# All remaining arguments will be passed to configure verbatim
|
echo "to pass any to it, please specify them on the $0 command line."
|
||||||
break
|
fi
|
||||||
;;
|
fi
|
||||||
esac
|
fi
|
||||||
done
|
|
||||||
no_git="$no_git$gnulib_srcdir"
|
|
||||||
|
|
||||||
gnulib_hash()
|
# Compute the hash we'll use to determine whether rerunning bootstrap
|
||||||
|
# is required. The first is just the SHA1 that selects a gnulib snapshot.
|
||||||
|
# The second ensures that whenever we change the set of gnulib modules used
|
||||||
|
# by this package, we rerun bootstrap to pull in the matching set of files.
|
||||||
|
# The third ensures that whenever we change the set of local gnulib diffs,
|
||||||
|
# we rerun bootstrap to pull in those diffs.
|
||||||
|
bootstrap_hash()
|
||||||
{
|
{
|
||||||
local no_git=$1
|
|
||||||
|
|
||||||
if test "$no_git"; then
|
if test "$no_git"; then
|
||||||
echo "no-git"
|
echo no-git
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
git submodule status | sed 's/^[ +-]//;s/ .*//'
|
||||||
# Compute the hash we'll use to determine whether rerunning bootstrap
|
|
||||||
# is required. The first is just the SHA1 that selects a gnulib snapshot.
|
|
||||||
# The second ensures that whenever we change the set of gnulib modules used
|
|
||||||
# by this package, we rerun bootstrap to pull in the matching set of files.
|
|
||||||
# The third ensures that whenever we change the set of local gnulib diffs,
|
|
||||||
# we rerun bootstrap to pull in those diffs.
|
|
||||||
git submodule status .gnulib | awk '{ print $1 }'
|
|
||||||
git hash-object bootstrap.conf
|
git hash-object bootstrap.conf
|
||||||
git ls-tree -d HEAD gnulib/local | awk '{ print $3 }'
|
git ls-tree -d HEAD gnulib/local | awk '{print $3}'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Only look into git submodules if we're in a git checkout
|
# Ensure that whenever we pull in a gnulib update or otherwise change to a
|
||||||
|
# different version (i.e., when switching branches), we also rerun ./bootstrap.
|
||||||
|
# Also, running 'make rpm' tends to litter the po/ directory, and some people
|
||||||
|
# like to run 'git clean -x -f po' to fix it; but only ./bootstrap regenerates
|
||||||
|
# the required file po/Makevars.
|
||||||
|
# Only run bootstrap from a git checkout, never from a tarball.
|
||||||
if test -d .git || test -f .git; then
|
if test -d .git || test -f .git; then
|
||||||
|
curr_status=.git-module-status t=
|
||||||
# Check for dirty submodules
|
if test "$no_git"; then
|
||||||
if test -z "$CLEAN_SUBMODULE"; then
|
t=no-git
|
||||||
for path in $(git submodule status | awk '{ print $2 }'); do
|
elif test -d .gnulib; then
|
||||||
case "$(git diff "$path")" in
|
t=$(bootstrap_hash; git diff .gnulib)
|
||||||
|
fi
|
||||||
|
case $t:${CLEAN_SUBMODULE+set} in
|
||||||
|
*:set) ;;
|
||||||
*-dirty*)
|
*-dirty*)
|
||||||
echo "error: $path is dirty, please investigate" >&2
|
echo "error: gnulib submodule is dirty, please investigate" 2>&1
|
||||||
echo "set CLEAN_SUBMODULE to discard submodule changes" >&2
|
echo "set env-var CLEAN_SUBMODULE to discard gnulib changes" 2>&1
|
||||||
exit 1
|
exit 1 ;;
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
done
|
# Keep this test in sync with cfg.mk:_update_required
|
||||||
fi
|
if test "$t" = "$(cat $curr_status 2>/dev/null)" \
|
||||||
if test "$CLEAN_SUBMODULE" && test -z "$no_git"; then
|
&& test -f "po/Makevars" && test -f AUTHORS; then
|
||||||
if test -z "$dry_run"; then
|
# good, it's up to date, all we need is autoreconf
|
||||||
echo "Cleaning up submodules..."
|
autoreconf -if
|
||||||
git submodule foreach 'git clean -dfqx && git reset --hard' || {
|
|
||||||
die "Cleaning up submodules failed"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update all submodules. If any of the submodules has not been
|
|
||||||
# initialized yet, it will be initialized now; moreover, any submodule
|
|
||||||
# with uncommitted changes will be returned to the expected state
|
|
||||||
echo "Updating submodules..."
|
|
||||||
git submodule update --init || {
|
|
||||||
die "Updating submodules failed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# The expected hash, eg. the one computed after the last
|
|
||||||
# successful bootstrap run, is stored on disk
|
|
||||||
state_file=.git-module-status
|
|
||||||
expected_hash=$(cat "$state_file" 2>/dev/null)
|
|
||||||
actual_hash=$(gnulib_hash "$no_git")
|
|
||||||
|
|
||||||
if test "$actual_hash" = "$expected_hash" && \
|
|
||||||
test -f po/Makevars && test -f AUTHORS; then
|
|
||||||
# The gnulib hash matches our expectations, and all the files
|
|
||||||
# that can only be generated through bootstrap are present:
|
|
||||||
# we just need to run autoreconf. Unless we're performing a
|
|
||||||
# dry run, of course...
|
|
||||||
if test -z "$dry_run"; then
|
|
||||||
echo "Running autoreconf..."
|
|
||||||
autoreconf -if || {
|
|
||||||
die "autoreconf failed"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
# Whenever the gnulib submodule or any of the related bits
|
if test -z "$no_git" && test ${CLEAN_SUBMODULE+set}; then
|
||||||
# has been changed in some way (see gnulib_hash) we need to
|
echo cleaning up submodules...
|
||||||
# run bootstrap again. If we're performing a dry run, we
|
git submodule foreach 'git clean -dfqx && git reset --hard'
|
||||||
# change the return code instead to signal our caller
|
|
||||||
if test "$dry_run"; then
|
|
||||||
dry_run=2
|
|
||||||
else
|
|
||||||
echo "Running bootstrap..."
|
|
||||||
./bootstrap$no_git --bootstrap-sync || {
|
|
||||||
die "bootstrap failed"
|
|
||||||
}
|
|
||||||
gnulib_hash >"$state_file"
|
|
||||||
fi
|
fi
|
||||||
|
echo running bootstrap$no_git...
|
||||||
|
./bootstrap$no_git --bootstrap-sync && bootstrap_hash > $curr_status \
|
||||||
|
|| { echo "Failed to bootstrap, please investigate."; exit 1; }
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# When performing a dry run, we can stop here
|
test -n "$NOCONFIGURE" && exit 0
|
||||||
test "$dry_run" && exit "$dry_run"
|
|
||||||
|
|
||||||
# If asked not to run configure, we can stop here
|
cd "$THEDIR"
|
||||||
test "$NOCONFIGURE" && exit 0
|
|
||||||
|
|
||||||
cd "$starting_point" || {
|
if test "x$OBJ_DIR" != x; then
|
||||||
die "Failed to cd into $starting_point"
|
mkdir -p "$OBJ_DIR"
|
||||||
}
|
cd "$OBJ_DIR"
|
||||||
|
|
||||||
if test "$OBJ_DIR"; then
|
|
||||||
mkdir -p "$OBJ_DIR" || {
|
|
||||||
die "Failed to create $OBJ_DIR"
|
|
||||||
}
|
|
||||||
cd "$OBJ_DIR" || {
|
|
||||||
die "Failed to cd into $OBJ_DIR"
|
|
||||||
}
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Make sure we can find GNU make and tell the user
|
if test -z "$*" && test -z "$EXTRA_ARGS" && test -f config.status; then
|
||||||
# the right command to run
|
./config.status --recheck
|
||||||
MAKE=
|
|
||||||
for cmd in make gmake; do
|
|
||||||
if $cmd -v 2>&1 | grep -q "GNU Make"; then
|
|
||||||
MAKE=$cmd
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
test "$MAKE" || {
|
|
||||||
die "GNU make is required to build libvirt"
|
|
||||||
}
|
|
||||||
|
|
||||||
if test -z "$*" && test -z "$extra_args" && test -f config.status; then
|
|
||||||
echo "Running config.status..."
|
|
||||||
./config.status --recheck || {
|
|
||||||
die "config.status failed"
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
if test -z "$*" && test -z "$extra_args"; then
|
$srcdir/configure $EXTRA_ARGS "$@"
|
||||||
echo "I am going to run configure with no arguments - if you wish"
|
fi && {
|
||||||
echo "to pass any to it, please specify them on the $0 command line."
|
echo
|
||||||
else
|
echo "Now type 'make' to compile libvirt."
|
||||||
echo "Running configure with $extra_args $@"
|
}
|
||||||
fi
|
|
||||||
"$srcdir/configure" $extra_args "$@" || {
|
|
||||||
die "configure failed"
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Now type '$MAKE' to compile libvirt."
|
|
||||||
|
|||||||
50
bootstrap
50
bootstrap
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Print a version string.
|
# Print a version string.
|
||||||
scriptversion=2017-09-19.08; # UTC
|
scriptversion=2016-01-24.06; # UTC
|
||||||
|
|
||||||
# Bootstrap this package from checked-out sources.
|
# Bootstrap this package from checked-out sources.
|
||||||
|
|
||||||
# Copyright (C) 2003-2018 Free Software Foundation, Inc.
|
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,7 +17,7 @@ scriptversion=2017-09-19.08; # UTC
|
|||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
# Originally written by Paul Eggert. The canonical version of this
|
# Originally written by Paul Eggert. The canonical version of this
|
||||||
# script is maintained as build-aux/bootstrap in gnulib, however, to
|
# script is maintained as build-aux/bootstrap in gnulib, however, to
|
||||||
@@ -141,7 +141,7 @@ po_download_command_format=\
|
|||||||
# Fallback for downloading .po files (if rsync fails).
|
# Fallback for downloading .po files (if rsync fails).
|
||||||
po_download_command_format2=\
|
po_download_command_format2=\
|
||||||
"wget --mirror -nd -q -np -A.po -P '%s' \
|
"wget --mirror -nd -q -np -A.po -P '%s' \
|
||||||
https://translationproject.org/latest/%s/"
|
http://translationproject.org/latest/%s/"
|
||||||
|
|
||||||
# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
|
# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
|
||||||
# fall back to the package name (1st argument with munging)
|
# fall back to the package name (1st argument with munging)
|
||||||
@@ -418,30 +418,28 @@ sort_ver() { # sort -V is not generally available
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
get_version_sed='
|
|
||||||
# Move version to start of line.
|
|
||||||
s/.*[v ]\([0-9]\)/\1/
|
|
||||||
|
|
||||||
# Skip lines that do not start with version.
|
|
||||||
/^[0-9]/!d
|
|
||||||
|
|
||||||
# Remove characters after the version.
|
|
||||||
s/[^.a-z0-9-].*//
|
|
||||||
|
|
||||||
# The first component must be digits only.
|
|
||||||
s/^\([0-9]*\)[a-z-].*/\1/
|
|
||||||
|
|
||||||
#the following essentially does s/5.005/5.5/
|
|
||||||
s/\.0*\([1-9]\)/.\1/g
|
|
||||||
p
|
|
||||||
q'
|
|
||||||
|
|
||||||
get_version() {
|
get_version() {
|
||||||
app=$1
|
app=$1
|
||||||
|
|
||||||
$app --version >/dev/null 2>&1 || { $app --version; return 1; }
|
$app --version >/dev/null 2>&1 || { $app --version; return 1; }
|
||||||
|
|
||||||
$app --version 2>&1 | sed -n "$get_version_sed"
|
$app --version 2>&1 |
|
||||||
|
sed -n '# Move version to start of line.
|
||||||
|
s/.*[v ]\([0-9]\)/\1/
|
||||||
|
|
||||||
|
# Skip lines that do not start with version.
|
||||||
|
/^[0-9]/!d
|
||||||
|
|
||||||
|
# Remove characters after the version.
|
||||||
|
s/[^.a-z0-9-].*//
|
||||||
|
|
||||||
|
# The first component must be digits only.
|
||||||
|
s/^\([0-9]*\)[a-z-].*/\1/
|
||||||
|
|
||||||
|
#the following essentially does s/5.005/5.5/
|
||||||
|
s/\.0*\([1-9]\)/.\1/g
|
||||||
|
p
|
||||||
|
q'
|
||||||
}
|
}
|
||||||
|
|
||||||
check_versions() {
|
check_versions() {
|
||||||
@@ -699,7 +697,7 @@ download_po_files() {
|
|||||||
echo "$me: getting translations into $subdir for $domain..."
|
echo "$me: getting translations into $subdir for $domain..."
|
||||||
cmd=$(printf "$po_download_command_format" "$domain" "$subdir")
|
cmd=$(printf "$po_download_command_format" "$domain" "$subdir")
|
||||||
eval "$cmd" && return
|
eval "$cmd" && return
|
||||||
# Fallback to HTTPS.
|
# Fallback to HTTP.
|
||||||
cmd=$(printf "$po_download_command_format2" "$subdir" "$domain")
|
cmd=$(printf "$po_download_command_format2" "$subdir" "$domain")
|
||||||
eval "$cmd"
|
eval "$cmd"
|
||||||
}
|
}
|
||||||
@@ -790,9 +788,9 @@ symlink_to_dir()
|
|||||||
# Leave any existing symlink alone, if it already points to the source,
|
# Leave any existing symlink alone, if it already points to the source,
|
||||||
# so that broken build tools that care about symlink times
|
# so that broken build tools that care about symlink times
|
||||||
# aren't confused into doing unnecessary builds. Conversely, if the
|
# aren't confused into doing unnecessary builds. Conversely, if the
|
||||||
# existing symlink's timestamp is older than the source, make it afresh,
|
# existing symlink's time stamp is older than the source, make it afresh,
|
||||||
# so that broken tools aren't confused into skipping needed builds. See
|
# so that broken tools aren't confused into skipping needed builds. See
|
||||||
# <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>.
|
# <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>.
|
||||||
test -h "$dst" &&
|
test -h "$dst" &&
|
||||||
src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
|
src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
|
||||||
dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
|
dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env perl
|
#!/usr/bin/perl
|
||||||
#
|
#
|
||||||
# augeas-gentest.pl: Generate an augeas test file, from an
|
# augeas-gentest.pl: Generate an augeas test file, from an
|
||||||
# example config file + test file template
|
# example config file + test file template
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env perl
|
#!/usr/bin/perl
|
||||||
#
|
#
|
||||||
# check-spacing.pl: Report any usage of 'function (..args..)'
|
# check-spacing.pl: Report any usage of 'function (..args..)'
|
||||||
# Also check for other syntax issues, such as correct use of ';'
|
# Also check for other syntax issues, such as correct use of ';'
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
#!/usr/bin/env perl
|
|
||||||
|
|
||||||
my %noninlined;
|
|
||||||
my %mocked;
|
|
||||||
|
|
||||||
# Functions in public header don't get the noinline annotation
|
|
||||||
# so whitelist them here
|
|
||||||
$noninlined{"virEventAddTimeout"} = 1;
|
|
||||||
|
|
||||||
foreach my $arg (@ARGV) {
|
|
||||||
if ($arg =~ /\.h$/) {
|
|
||||||
#print "Scan header $arg\n";
|
|
||||||
&scan_annotations($arg);
|
|
||||||
} elsif ($arg =~ /mock\.c$/) {
|
|
||||||
#print "Scan mock $arg\n";
|
|
||||||
&scan_overrides($arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
my $warned = 0;
|
|
||||||
foreach my $func (keys %mocked) {
|
|
||||||
next if exists $noninlined{$func};
|
|
||||||
|
|
||||||
$warned++;
|
|
||||||
print STDERR "$func is mocked at $mocked{$func} but missing noinline annotation\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
exit $warned ? 1 : 0;
|
|
||||||
|
|
||||||
|
|
||||||
sub scan_annotations {
|
|
||||||
my $file = shift;
|
|
||||||
|
|
||||||
open FH, $file or die "cannot read $file: $!";
|
|
||||||
|
|
||||||
my $func;
|
|
||||||
while (<FH>) {
|
|
||||||
if (/^\s*(\w+)\(/ || /^(?:\w+\*?\s+)+(?:\*\s*)?(\w+)\(/) {
|
|
||||||
my $name = $1;
|
|
||||||
if ($name !~ /ATTRIBUTE/) {
|
|
||||||
$func = $name;
|
|
||||||
}
|
|
||||||
} elsif (/^\s*$/) {
|
|
||||||
$func = undef;
|
|
||||||
}
|
|
||||||
if (/ATTRIBUTE_NOINLINE/) {
|
|
||||||
if (defined $func) {
|
|
||||||
$noninlined{$func} = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close FH
|
|
||||||
}
|
|
||||||
|
|
||||||
sub scan_overrides {
|
|
||||||
my $file = shift;
|
|
||||||
|
|
||||||
open FH, $file or die "cannot read $file: $!";
|
|
||||||
|
|
||||||
my $func;
|
|
||||||
while (<FH>) {
|
|
||||||
if (/^(\w+)\(/ || /^\w+\s*(?:\*\s*)?(\w+)\(/) {
|
|
||||||
my $name = $1;
|
|
||||||
if ($name =~ /^vir/) {
|
|
||||||
$mocked{$name} = "$file:$.";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close FH
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env perl
|
#!/usr/bin/perl
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
|
|||||||
233
cfg.mk
233
cfg.mk
@@ -32,8 +32,8 @@ gnulib_dir = $(srcdir)/.gnulib
|
|||||||
# List of additional files that we want to pick up in our POTFILES.in
|
# List of additional files that we want to pick up in our POTFILES.in
|
||||||
# This is all gnulib files, as well as generated files for RPC code.
|
# This is all gnulib files, as well as generated files for RPC code.
|
||||||
generated_files = \
|
generated_files = \
|
||||||
$(srcdir)/src/*/{remote_daemon,admin_server,log_daemon,lock_daemon}_dispatch_*stubs.h \
|
$(srcdir)/daemon/*_dispatch.h \
|
||||||
$(srcdir)/src/lxc/{lxc_monitor,lxc_controller}_dispatch.h \
|
$(srcdir)/src/*/*_dispatch.h \
|
||||||
$(srcdir)/src/remote/*_client_bodies.h \
|
$(srcdir)/src/remote/*_client_bodies.h \
|
||||||
$(srcdir)/src/*/*_protocol.[ch] \
|
$(srcdir)/src/*/*_protocol.[ch] \
|
||||||
$(srcdir)/gnulib/lib/*.[ch]
|
$(srcdir)/gnulib/lib/*.[ch]
|
||||||
@@ -91,7 +91,7 @@ endif
|
|||||||
|
|
||||||
# Files that should never cause syntax check failures.
|
# Files that should never cause syntax check failures.
|
||||||
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
||||||
(^(docs/(news(-[0-9]*)?\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
(^(HACKING|docs/(news(-[0-9]*)?\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
||||||
|
|
||||||
# Functions like free() that are no-ops on NULL arguments.
|
# Functions like free() that are no-ops on NULL arguments.
|
||||||
useless_free_options = \
|
useless_free_options = \
|
||||||
@@ -127,6 +127,7 @@ useless_free_options = \
|
|||||||
--name=virDomainDiskDefFree \
|
--name=virDomainDiskDefFree \
|
||||||
--name=virDomainEventCallbackListFree \
|
--name=virDomainEventCallbackListFree \
|
||||||
--name=virObjectEventQueueFree \
|
--name=virObjectEventQueueFree \
|
||||||
|
--name=virObjectEventStateFree \
|
||||||
--name=virDomainFSDefFree \
|
--name=virDomainFSDefFree \
|
||||||
--name=virDomainGraphicsDefFree \
|
--name=virDomainGraphicsDefFree \
|
||||||
--name=virDomainHostdevDefFree \
|
--name=virDomainHostdevDefFree \
|
||||||
@@ -284,11 +285,11 @@ sc_avoid_write:
|
|||||||
|
|
||||||
# In debug statements, print flags as bitmask and mode_t as octal.
|
# In debug statements, print flags as bitmask and mode_t as octal.
|
||||||
sc_flags_debug:
|
sc_flags_debug:
|
||||||
@prohibit='\<mode=%[0-9.]*[diuxo]' \
|
@prohibit='\<mode=%[0-9.]*[diux]' \
|
||||||
halt='use \"0%o\" to debug mode_t values' \
|
halt='use %o to debug mode_t values' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
@prohibit='[Ff]lags=%[0-9.]*l*[dioux]' \
|
@prohibit='[Ff]lags=%[0-9.]*l*[diou]' \
|
||||||
halt='use \"0x%x\" to debug flag values' \
|
halt='use %x to debug flag values' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
# Prefer 'unsigned int flags', along with checks for unknown flags.
|
# Prefer 'unsigned int flags', along with checks for unknown flags.
|
||||||
@@ -484,7 +485,7 @@ sc_size_of_brackets:
|
|||||||
# Ensure that no C source file, docs, or rng schema uses TABs for
|
# Ensure that no C source file, docs, or rng schema uses TABs for
|
||||||
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
|
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
|
||||||
# files in gnulib, since they're imported.
|
# files in gnulib, since they're imported.
|
||||||
space_indent_files=(\.(aug(\.in)?|rng|s?[ch](\.in)?|html.in|py|pl|syms)|(daemon|tools)/.*\.in)
|
space_indent_files=(\.(rng|s?[ch](\.in)?|html.in|py|pl|syms)|(daemon|tools)/.*\.in)
|
||||||
sc_TAB_in_indentation:
|
sc_TAB_in_indentation:
|
||||||
@prohibit='^ * ' \
|
@prohibit='^ * ' \
|
||||||
in_vc_files='$(space_indent_files)$$' \
|
in_vc_files='$(space_indent_files)$$' \
|
||||||
@@ -519,6 +520,13 @@ sc_forbid_manual_xml_indent:
|
|||||||
halt='use virBufferAdjustIndent instead of spaces when indenting xml' \
|
halt='use virBufferAdjustIndent instead of spaces when indenting xml' \
|
||||||
$(_sc_search_regexp)
|
$(_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:
|
||||||
|
@prohibit='\<gethostby(addr|name2?) *\(' \
|
||||||
|
halt='use getaddrinfo, not gethostby*' \
|
||||||
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
# dirname and basename from <libgen.h> are not required to be thread-safe
|
# dirname and basename from <libgen.h> are not required to be thread-safe
|
||||||
sc_prohibit_libgen:
|
sc_prohibit_libgen:
|
||||||
@prohibit='( (base|dir)name *\(|include .libgen\.h)' \
|
@prohibit='( (base|dir)name *\(|include .libgen\.h)' \
|
||||||
@@ -580,11 +588,6 @@ sc_prohibit_int_assign_bool:
|
|||||||
halt='use bool type for boolean values' \
|
halt='use bool type for boolean values' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
sc_prohibit_unsigned_pid:
|
|
||||||
@prohibit='\<unsigned\> [^,=;(]+pid' \
|
|
||||||
halt='use signed type for pid values' \
|
|
||||||
$(_sc_search_regexp)
|
|
||||||
|
|
||||||
# Many of the function names below came from this filter:
|
# Many of the function names below came from this filter:
|
||||||
# git grep -B2 '\<_('|grep -E '\.c- *[[:alpha:]_][[:alnum:]_]* ?\(.*[,;]$' \
|
# git grep -B2 '\<_('|grep -E '\.c- *[[:alpha:]_][[:alnum:]_]* ?\(.*[,;]$' \
|
||||||
# |sed 's/.*\.c- *//'|perl -pe 's/ ?\(.*//'|sort -u \
|
# |sed 's/.*\.c- *//'|perl -pe 's/ ?\(.*//'|sort -u \
|
||||||
@@ -611,9 +614,8 @@ msg_gen_function += xenapiSessionErrorHandler
|
|||||||
# msg_gen_function += vshPrint
|
# msg_gen_function += vshPrint
|
||||||
# msg_gen_function += vshError
|
# msg_gen_function += vshError
|
||||||
|
|
||||||
space =
|
func_or := $(shell echo $(msg_gen_function)|tr -s ' ' '|')
|
||||||
space +=
|
func_re := ($(func_or))
|
||||||
func_re= ($(subst $(space),|,$(msg_gen_function)))
|
|
||||||
|
|
||||||
# Look for diagnostics that aren't marked for translation.
|
# Look for diagnostics that aren't marked for translation.
|
||||||
# This won't find any for which error's format string is on a separate line.
|
# This won't find any for which error's format string is on a separate line.
|
||||||
@@ -666,7 +668,7 @@ sc_prohibit_useless_translation:
|
|||||||
halt='found useless translation' \
|
halt='found useless translation' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
@prohibit='\<N?_ *\(' \
|
@prohibit='\<N?_ *\(' \
|
||||||
in_vc_files='(tests|examples)/' \
|
in_vc_files='^(tests|examples)/' \
|
||||||
halt='no translations in tests or examples' \
|
halt='no translations in tests or examples' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
@@ -768,15 +770,16 @@ sc_prohibit_gettext_markup:
|
|||||||
# lower-level code must not include higher-level headers.
|
# lower-level code must not include higher-level headers.
|
||||||
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
|
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
|
||||||
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
|
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
|
||||||
mid_dirs=access|admin|conf|cpu|locking|logging|rpc|security
|
mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage
|
||||||
sc_prohibit_cross_inclusion:
|
sc_prohibit_cross_inclusion:
|
||||||
@for dir in $(cross_dirs); do \
|
@for dir in $(cross_dirs); do \
|
||||||
case $$dir in \
|
case $$dir in \
|
||||||
util/) safe="util";; \
|
util/) safe="util";; \
|
||||||
access/ | conf/) safe="($$dir|conf|util)";; \
|
access/ | conf/) safe="($$dir|conf|util)";; \
|
||||||
|
locking/) safe="($$dir|util|conf|rpc)";; \
|
||||||
cpu/| network/| node_device/| rpc/| security/| storage/) \
|
cpu/| network/| node_device/| rpc/| security/| storage/) \
|
||||||
safe="($$dir|util|conf|storage)";; \
|
safe="($$dir|util|conf|storage)";; \
|
||||||
xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
|
xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \
|
||||||
*) safe="($$dir|$(mid_dirs)|util)";; \
|
*) safe="($$dir|$(mid_dirs)|util)";; \
|
||||||
esac; \
|
esac; \
|
||||||
in_vc_files="^src/$$dir" \
|
in_vc_files="^src/$$dir" \
|
||||||
@@ -807,7 +810,7 @@ sc_prohibit_semicolon_at_eol_in_python:
|
|||||||
# mymain() in test files should use return, not exit, for nicer output
|
# mymain() in test files should use return, not exit, for nicer output
|
||||||
sc_prohibit_exit_in_tests:
|
sc_prohibit_exit_in_tests:
|
||||||
@prohibit='\<exit *\(' \
|
@prohibit='\<exit *\(' \
|
||||||
in_vc_files='tests/.*\.c$$' \
|
in_vc_files='^tests/' \
|
||||||
halt='use return, not exit(), in tests' \
|
halt='use return, not exit(), in tests' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
@@ -877,7 +880,7 @@ sc_prohibit_wrong_filename_in_comment:
|
|||||||
|
|
||||||
sc_prohibit_virConnectOpen_in_virsh:
|
sc_prohibit_virConnectOpen_in_virsh:
|
||||||
@prohibit='\bvirConnectOpen[a-zA-Z]* *\(' \
|
@prohibit='\bvirConnectOpen[a-zA-Z]* *\(' \
|
||||||
in_vc_files='tools/virsh-.*\.[ch]$$' \
|
in_vc_files='^tools/virsh-.*\.[ch]$$' \
|
||||||
halt='Use vshConnect() in virsh instead of virConnectOpen*' \
|
halt='Use vshConnect() in virsh instead of virConnectOpen*' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
@@ -909,11 +912,12 @@ sc_curly_braces_style:
|
|||||||
'^\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)\) ?\{' \
|
'^\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 \
|
$$files; then \
|
||||||
echo '$(ME): Non-K&R style used for curly braces around' \
|
echo '$(ME): Non-K&R style used for curly braces around' \
|
||||||
'function body' 1>&2; exit 1; \
|
'function body, see HACKING' 1>&2; exit 1; \
|
||||||
fi; \
|
fi; \
|
||||||
if $(GREP) -A1 -En ' ((if|for|while|switch) \(|(else|do)\b)[^{]*$$'\
|
if $(GREP) -A1 -En ' ((if|for|while|switch) \(|(else|do)\b)[^{]*$$'\
|
||||||
$$files | $(GREP) '^[^ ]*- *{'; then \
|
$$files | $(GREP) '^[^ ]*- *{'; then \
|
||||||
echo '$(ME): Use hanging braces for compound statements' 1>&2; exit 1; \
|
echo '$(ME): Use hanging braces for compound statements,' \
|
||||||
|
'see HACKING' 1>&2; exit 1; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sc_prohibit_windows_special_chars_in_filename:
|
sc_prohibit_windows_special_chars_in_filename:
|
||||||
@@ -981,11 +985,6 @@ sc_prohibit_sysconf_pagesize:
|
|||||||
halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
|
halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
sc_prohibit_virSecurity:
|
|
||||||
@grep -Pn 'virSecurityManager(?!Ptr)' $$($(VC_LIST_EXCEPT) | grep 'src/qemu/' | \
|
|
||||||
grep -v 'src/qemu/qemu_security') && \
|
|
||||||
{ echo '$(ME): prefer qemuSecurity wrappers' 1>&2; exit 1; } || :
|
|
||||||
|
|
||||||
sc_prohibit_pthread_create:
|
sc_prohibit_pthread_create:
|
||||||
@prohibit='\bpthread_create\b' \
|
@prohibit='\bpthread_create\b' \
|
||||||
exclude='sc_prohibit_pthread_create' \
|
exclude='sc_prohibit_pthread_create' \
|
||||||
@@ -993,8 +992,13 @@ sc_prohibit_pthread_create:
|
|||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
sc_prohibit_not_streq:
|
sc_prohibit_not_streq:
|
||||||
@prohibit='! *STRN?EQ *\(.*\)' \
|
@prohibit='! *STREQ *\(.*\)' \
|
||||||
halt='Use STRNEQ instead of !STREQ and STREQ instead of !STRNEQ' \
|
halt='Use STRNEQ instead of !STREQ' \
|
||||||
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
|
sc_prohibit_not_strneq:
|
||||||
|
@prohibit='! *STRNEQ *\(.*\)' \
|
||||||
|
halt='Use STREQ instead of !STRNEQ' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
sc_prohibit_verbose_strcat:
|
sc_prohibit_verbose_strcat:
|
||||||
@@ -1012,36 +1016,15 @@ sc_gettext_init:
|
|||||||
halt='the above files do not call virGettextInitialize' \
|
halt='the above files do not call virGettextInitialize' \
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
sc_prohibit_obj_free_apis_in_virsh:
|
# <dt> is mostly used to document symbols, in which case it should contain
|
||||||
@prohibit='\bvir(Domain|DomainSnapshot)Free\b' \
|
# a <code> element. The regular expression below trades speed and readability
|
||||||
in_vc_files='virsh.*\.[ch]$$' \
|
# for accuracy, and won't catch someone trying to stick a <canvas> inside a
|
||||||
exclude='sc_prohibit_obj_free_apis_in_virsh' \
|
# <dt>, but that's what code reviews are for :)
|
||||||
halt='avoid using virDomain(Snapshot)Free in virsh, use virsh-prefixed wrappers instead' \
|
sc_prohibit_dt_without_code:
|
||||||
$(_sc_search_regexp)
|
@prohibit='<dt>([^<]|<[^c])' \
|
||||||
|
exclude='exempt from syntax-check' \
|
||||||
https_sites = www.libvirt.org
|
in_vc_files='docs/.*$$' \
|
||||||
https_sites += libvirt.org
|
halt='Use <code> inside <dt> when documenting symbols' \
|
||||||
https_sites += security.libvirt.org
|
|
||||||
https_sites += qemu.org
|
|
||||||
https_sites += www.qemu.org
|
|
||||||
https_sites += wiki.qemu.org
|
|
||||||
https_sites += linux-kvm.org
|
|
||||||
https_sites += www.linux-kvm.org
|
|
||||||
|
|
||||||
https_re= ($(subst $(space),|,$(https_sites)))
|
|
||||||
|
|
||||||
sc_prohibit_http_urls:
|
|
||||||
@prohibit='http://$(https_re)' \
|
|
||||||
exclude="/schemas/" \
|
|
||||||
halt='Links must use https:// protocol' \
|
|
||||||
$(_sc_search_regexp)
|
|
||||||
|
|
||||||
# Alignment is usually achieved through spaces (at least two of them)
|
|
||||||
# or tabs (at least one of them) right before the trailing backslash
|
|
||||||
sc_prohibit_backslash_alignment:
|
|
||||||
@prohibit='( | )\\$$' \
|
|
||||||
in_vc_files='*\.([chx]|am|mk)$$' \
|
|
||||||
halt='Do not attempt to right-align backslashes' \
|
|
||||||
$(_sc_search_regexp)
|
$(_sc_search_regexp)
|
||||||
|
|
||||||
# We don't use this feature of maint.mk.
|
# We don't use this feature of maint.mk.
|
||||||
@@ -1049,30 +1032,33 @@ prev_version_file = /dev/null
|
|||||||
|
|
||||||
ifneq ($(_gl-Makefile),)
|
ifneq ($(_gl-Makefile),)
|
||||||
ifeq (0,$(MAKELEVEL))
|
ifeq (0,$(MAKELEVEL))
|
||||||
_dry_run_result := $(shell \
|
_curr_status = .git-module-status
|
||||||
|
# The sed filter accommodates those who check out on a commit from which
|
||||||
|
# no tag is reachable. In that case, git submodule status prints a "-"
|
||||||
|
# in column 1 and does not print a "git describe"-style string after the
|
||||||
|
# submodule name. Contrast these:
|
||||||
|
# -b653eda3ac4864de205419d9f41eec267cb89eeb .gnulib
|
||||||
|
# b653eda3ac4864de205419d9f41eec267cb89eeb .gnulib (v0.0-2286-gb653eda)
|
||||||
|
# $ cat .git-module-status
|
||||||
|
# b653eda3ac4864de205419d9f41eec267cb89eeb
|
||||||
|
#
|
||||||
|
# Keep this logic in sync with autogen.sh.
|
||||||
|
_submodule_hash = $(SED) 's/^[ +-]//;s/ .*//'
|
||||||
|
_update_required := $(shell \
|
||||||
cd '$(srcdir)'; \
|
cd '$(srcdir)'; \
|
||||||
test -d .git || test -f .git || { echo 0; exit; }; \
|
test -d .git || { echo 0; exit; }; \
|
||||||
$(srcdir)/autogen.sh --dry-run >/dev/null 2>&1; \
|
test -f po/Makevars || { echo 1; exit; }; \
|
||||||
echo $$?; \
|
test -f AUTHORS || { echo 1; exit; }; \
|
||||||
)
|
test "no-git" = "$$(cat $(_curr_status))" && { echo 0; exit; }; \
|
||||||
|
actual=$$(git submodule status | $(_submodule_hash); \
|
||||||
|
git hash-object bootstrap.conf; \
|
||||||
|
git ls-tree -d HEAD gnulib/local | awk '{print $$3}'; \
|
||||||
|
git diff .gnulib); \
|
||||||
|
stamp="$$($(_submodule_hash) $(_curr_status) 2>/dev/null)"; \
|
||||||
|
test "$$stamp" = "$$actual"; echo $$?)
|
||||||
_clean_requested = $(filter %clean,$(MAKECMDGOALS))
|
_clean_requested = $(filter %clean,$(MAKECMDGOALS))
|
||||||
|
ifeq (1,$(_update_required)$(_clean_requested))
|
||||||
# A return value of 0 means no action is required
|
$(info INFO: gnulib update required; running ./autogen.sh first)
|
||||||
|
|
||||||
# A return value of 1 means a genuine error has occurred while
|
|
||||||
# performing the dry run, and it should be reported so it can
|
|
||||||
# be investigated
|
|
||||||
ifeq (1,$(_dry_run_result))
|
|
||||||
$(info INFO: autogen.sh error, running again to show details)
|
|
||||||
maint.mk Makefile: _autogen_error
|
|
||||||
endif
|
|
||||||
|
|
||||||
# A return value of 2 means that autogen.sh needs to be executed
|
|
||||||
# in earnest before building, probably because of gnulib updates.
|
|
||||||
# We don't run autogen.sh if the clean target has been invoked,
|
|
||||||
# though, as it would be quite pointless
|
|
||||||
ifeq (2,$(_dry_run_result)$(_clean_requested))
|
|
||||||
$(info INFO: running autogen.sh is required, running it now...)
|
|
||||||
$(shell touch $(srcdir)/AUTHORS $(srcdir)/ChangeLog)
|
$(shell touch $(srcdir)/AUTHORS $(srcdir)/ChangeLog)
|
||||||
maint.mk Makefile: _autogen
|
maint.mk Makefile: _autogen
|
||||||
endif
|
endif
|
||||||
@@ -1086,13 +1072,10 @@ _autogen:
|
|||||||
$(srcdir)/autogen.sh
|
$(srcdir)/autogen.sh
|
||||||
./config.status
|
./config.status
|
||||||
|
|
||||||
.PHONY: _autogen_error
|
# regenerate HACKING as part of the syntax-check
|
||||||
_autogen_error:
|
|
||||||
$(srcdir)/autogen.sh --dry-run
|
|
||||||
|
|
||||||
ifneq ($(_gl-Makefile),)
|
ifneq ($(_gl-Makefile),)
|
||||||
syntax-check: spacing-check test-wrap-argv \
|
syntax-check: $(top_srcdir)/HACKING spacing-check test-wrap-argv \
|
||||||
prohibit-duplicate-header mock-noinline
|
prohibit-duplicate-header
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Don't include duplicate header in the source (either *.c or *.h)
|
# Don't include duplicate header in the source (either *.c or *.h)
|
||||||
@@ -1103,11 +1086,8 @@ prohibit-duplicate-header:
|
|||||||
spacing-check:
|
spacing-check:
|
||||||
$(AM_V_GEN)files=`$(VC_LIST) | grep '\.c$$'`; \
|
$(AM_V_GEN)files=`$(VC_LIST) | grep '\.c$$'`; \
|
||||||
$(PERL) $(top_srcdir)/build-aux/check-spacing.pl $$files || \
|
$(PERL) $(top_srcdir)/build-aux/check-spacing.pl $$files || \
|
||||||
{ echo '$(ME): incorrect formatting' 1>&2; exit 1; }
|
{ echo '$(ME): incorrect formatting, see HACKING for rules' 1>&2; \
|
||||||
|
exit 1; }
|
||||||
mock-noinline:
|
|
||||||
$(AM_V_GEN)files=`$(VC_LIST) | grep '\.[ch]$$'`; \
|
|
||||||
$(PERL) $(top_srcdir)/build-aux/mock-noinline.pl $$files
|
|
||||||
|
|
||||||
test-wrap-argv:
|
test-wrap-argv:
|
||||||
$(AM_V_GEN)files=`$(VC_LIST) | grep -E '\.(ldargs|args)'`; \
|
$(AM_V_GEN)files=`$(VC_LIST) | grep -E '\.(ldargs|args)'`; \
|
||||||
@@ -1115,29 +1095,29 @@ test-wrap-argv:
|
|||||||
|
|
||||||
# sc_po_check can fail if generated files are not built first
|
# sc_po_check can fail if generated files are not built first
|
||||||
sc_po_check: \
|
sc_po_check: \
|
||||||
$(srcdir)/src/remote/remote_daemon_dispatch_stubs.h \
|
$(srcdir)/daemon/remote_dispatch.h \
|
||||||
$(srcdir)/src/remote/remote_daemon_dispatch_qemu_stubs.h \
|
$(srcdir)/daemon/qemu_dispatch.h \
|
||||||
$(srcdir)/src/remote/remote_client_bodies.h \
|
$(srcdir)/src/remote/remote_client_bodies.h \
|
||||||
$(srcdir)/src/admin/admin_server_dispatch_stubs.h \
|
$(srcdir)/daemon/admin_dispatch.h \
|
||||||
$(srcdir)/src/admin/admin_client.h
|
$(srcdir)/src/admin/admin_client.h
|
||||||
$(srcdir)/src/remote/remote_daemon_dispatch_stubs.h: $(srcdir)/src/remote/remote_protocol.x
|
$(srcdir)/daemon/remote_dispatch.h: $(srcdir)/src/remote/remote_protocol.x
|
||||||
$(MAKE) -C src remote/remote_daemon_dispatch_stubs.h
|
$(MAKE) -C daemon remote_dispatch.h
|
||||||
$(srcdir)/src/remote/remote_daemon_dispatch_qemu_stubs.h: $(srcdir)/src/remote/qemu_protocol.x
|
$(srcdir)/daemon/qemu_dispatch.h: $(srcdir)/src/remote/qemu_protocol.x
|
||||||
$(MAKE) -C src remote/remote_daemon_dispatch_qemu_stubs.h
|
$(MAKE) -C daemon qemu_dispatch.h
|
||||||
$(srcdir)/src/remote/remote_client_bodies.h: $(srcdir)/src/remote/remote_protocol.x
|
$(srcdir)/src/remote/remote_client_bodies.h: $(srcdir)/src/remote/remote_protocol.x
|
||||||
$(MAKE) -C src remote/remote_client_bodies.h
|
$(MAKE) -C src remote/remote_client_bodies.h
|
||||||
$(srcdir)/src/admin/admin_server_dispatch_stubs.h: $(srcdir)/src/admin/admin_protocol.x
|
$(srcdir)/daemon/admin_dispatch.h: $(srcdir)/src/admin/admin_protocol.x
|
||||||
$(MAKE) -C src admin/admin_server_dispatch_stubs.h
|
$(MAKE) -C daemon admin_dispatch.h
|
||||||
$(srcdir)/src/admin/admin_client.h: $(srcdir)/src/admin/admin_protocol.x
|
$(srcdir)/src/admin/admin_client.h: $(srcdir)/src/admin/admin_protocol.x
|
||||||
$(MAKE) -C src admin/admin_client.h
|
$(MAKE) -C src admin/admin_client.h
|
||||||
|
|
||||||
# List all syntax-check exemptions:
|
# List all syntax-check exemptions:
|
||||||
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$
|
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$
|
||||||
|
|
||||||
_src1=libvirt-stream|qemu/qemu_monitor|util/vir(command|file|fdstream)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon
|
_src1=libvirt-stream|fdstream|qemu/qemu_monitor|util/(vircommand|virfile)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon
|
||||||
_test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock|commandhelper
|
_test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock
|
||||||
exclude_file_name_regexp--sc_avoid_write = \
|
exclude_file_name_regexp--sc_avoid_write = \
|
||||||
^(src/($(_src1))|tools/virsh-console|tests/($(_test1)))\.c$$
|
^(src/($(_src1))|daemon/libvirtd|tools/virsh-console|tests/($(_test1)))\.c$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_bindtextdomain = .*
|
exclude_file_name_regexp--sc_bindtextdomain = .*
|
||||||
|
|
||||||
@@ -1150,7 +1130,7 @@ exclude_file_name_regexp--sc_copyright_usage = \
|
|||||||
^COPYING(|\.LESSER)$$
|
^COPYING(|\.LESSER)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_flags_usage = \
|
exclude_file_name_regexp--sc_flags_usage = \
|
||||||
^(cfg\.mk|docs/|src/util/virnetdevtap\.c$$|tests/((vir(cgroup|pci|test|usb)|nss|qemuxml2argv)mock|virfilewrapper)\.c$$)
|
^(cfg\.mk|docs/|src/util/virnetdevtap\.c$$|tests/(vir(cgroup|pci|test|usb)|nss|qemuxml2argv)mock\.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
||||||
^(src/rpc/gendispatch\.pl$$|tests/)
|
^(src/rpc/gendispatch\.pl$$|tests/)
|
||||||
@@ -1158,7 +1138,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_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
|
exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
|
||||||
^(cfg\.mk|include/libvirt/virterror\.h|src/remote/remote_daemon_dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
^(cfg\.mk|include/libvirt/virterror\.h|daemon/dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
|
exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
|
||||||
^cfg\.mk$$
|
^cfg\.mk$$
|
||||||
@@ -1170,19 +1150,19 @@ exclude_file_name_regexp--sc_prohibit_asprintf = \
|
|||||||
^(cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
|
^(cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_strdup = \
|
exclude_file_name_regexp--sc_prohibit_strdup = \
|
||||||
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c|tests/commandhelper\.c$$)
|
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_close = \
|
exclude_file_name_regexp--sc_prohibit_close = \
|
||||||
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir.+mock\.c|tests/commandhelper\.c)$$)
|
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir.+mock\.c)$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
||||||
(^tests/(qemuhelp|virhostcpu|virpcitest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
|
(^tests/(qemuhelp|virhostcpu|virpcitest)data/|\.diff|tests/virconfdata/no-newline\.conf$$)
|
||||||
|
|
||||||
_src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon|remote/remote_daemon)
|
_src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon)
|
||||||
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
||||||
(^($(_src2)|tests/testutils)\.c$$)
|
(^($(_src2)|tests/testutils|daemon/libvirtd)\.c$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/vir(util|log)\.c$$
|
exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/virutil\.c$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_internal_functions = \
|
exclude_file_name_regexp--sc_prohibit_internal_functions = \
|
||||||
^src/(util/(viralloc|virutil|virfile)\.[hc]|esx/esx_vi\.c)$$
|
^src/(util/(viralloc|virutil|virfile)\.[hc]|esx/esx_vi\.c)$$
|
||||||
@@ -1191,13 +1171,13 @@ exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
|
|||||||
^src/rpc/gendispatch\.pl$$
|
^src/rpc/gendispatch\.pl$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
||||||
^((po|tests)/|docs/.*(py|js|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl$$)
|
^((po|tests)/|docs/.*(py|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl$$)
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_select = \
|
exclude_file_name_regexp--sc_prohibit_select = \
|
||||||
^cfg\.mk$$
|
^cfg\.mk$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
||||||
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c)$$
|
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|vircgroupmock)\.c|tools/wireshark/src/packet-libvirt\.c)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_readlink = \
|
exclude_file_name_regexp--sc_prohibit_readlink = \
|
||||||
^src/(util/virutil|lxc/lxc_container)\.c$$
|
^src/(util/virutil|lxc/lxc_container)\.c$$
|
||||||
@@ -1211,6 +1191,8 @@ exclude_file_name_regexp--sc_prohibit_strncpy = ^src/util/virstring\.c$$
|
|||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/.*$$
|
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/.*$$
|
||||||
|
|
||||||
|
exclude_file_name_regexp--sc_prohibit_gethostby = ^docs/nss.html.in$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
|
exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
|
||||||
@@ -1227,7 +1209,7 @@ exclude_file_name_regexp--sc_trailing_blank = \
|
|||||||
/qemuhelpdata/|/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$
|
/qemuhelpdata/|/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
||||||
^(docs/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$
|
^(docs/apibuild.py|tests/virt-aa-helper-test)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_size_of_brackets = cfg.mk
|
exclude_file_name_regexp--sc_size_of_brackets = cfg.mk
|
||||||
|
|
||||||
@@ -1245,9 +1227,6 @@ exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
|
|||||||
exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
||||||
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|cfg\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
|
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|cfg\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_unsigned_pid = \
|
|
||||||
^(include/libvirt/.*\.h|src/(qemu/qemu_driver\.c|driver-hypervisor\.h|libvirt(-[a-z]*)?\.c|.*\.x|util/vir(polkit|systemd)\.c)|tests/virpolkittest\.c|tools/virsh-domain\.c)$$
|
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_getenv = \
|
exclude_file_name_regexp--sc_prohibit_getenv = \
|
||||||
^tests/.*\.[ch]$$
|
^tests/.*\.[ch]$$
|
||||||
|
|
||||||
@@ -1258,7 +1237,7 @@ 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)$$
|
^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 = \
|
exclude_file_name_regexp--sc_prohibit_empty_first_line = \
|
||||||
^(README|src/esx/README|tests/(vmwarever|virhostcpu)data/.*)$$
|
^(README|daemon/THREADS\.txt|src/esx/README|docs/library.xen|tests/(vmwarever|virhostcpu)data/.*)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
||||||
^tests/virpolkittest.c
|
^tests/virpolkittest.c
|
||||||
@@ -1275,11 +1254,17 @@ exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
|
|||||||
exclude_file_name_regexp--sc_prohibit_pthread_create = \
|
exclude_file_name_regexp--sc_prohibit_pthread_create = \
|
||||||
^(cfg\.mk|src/util/virthread\.c|tests/.*)$$
|
^(cfg\.mk|src/util/virthread\.c|tests/.*)$$
|
||||||
|
|
||||||
|
exclude_file_name_regexp--sc_prohibit_not_streq = \
|
||||||
|
^tests/.*\.[ch]$$
|
||||||
|
|
||||||
|
exclude_file_name_regexp--sc_prohibit_not_strneq = \
|
||||||
|
^tests/.*\.[ch]$$
|
||||||
|
|
||||||
|
exclude_file_name_regexp--sc_prohibit_dt_without_code = \
|
||||||
|
^docs/(newapi\.xsl|(apps|contact)\.html\.in)$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
|
exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
|
||||||
^tests/virtestmock.c$$
|
^tests/virtestmock.c$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_readdir = \
|
exclude_file_name_regexp--sc_prohibit_readdir = \
|
||||||
^tests/(.*mock|virfilewrapper)\.c$$
|
^tests/.*mock\.c$$
|
||||||
|
|
||||||
exclude_file_name_regexp--sc_prohibit_cross_inclusion = \
|
|
||||||
^(src/util/virclosecallbacks\.h|src/util/virhostdev\.h)$$
|
|
||||||
|
|||||||
@@ -20,24 +20,22 @@
|
|||||||
* Since virt-login-shell will be setuid, we must do everything
|
* Since virt-login-shell will be setuid, we must do everything
|
||||||
* we can to avoid linking to other libraries. Many of them do
|
* we can to avoid linking to other libraries. Many of them do
|
||||||
* unsafe things in functions marked __atttribute__((constructor)).
|
* unsafe things in functions marked __atttribute__((constructor)).
|
||||||
* The only way to avoid such deps is to re-compile the
|
* The only way avoid to avoid such deps is to re-compile the
|
||||||
* functions with the code in question disabled, and for that we
|
* functions with the code in question disabled, and for that we
|
||||||
* must override the main config.h rules. Hence this file :-(
|
* must override the main config.h rules. Hence this file :-(
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef LIBVIRT_SETUID_RPC_CLIENT
|
#ifdef LIBVIRT_SETUID_RPC_CLIENT
|
||||||
|
# undef HAVE_LIBDEVMAPPER_H
|
||||||
# undef HAVE_LIBNL
|
# undef HAVE_LIBNL
|
||||||
# undef HAVE_LIBNL3
|
# undef HAVE_LIBNL3
|
||||||
# undef HAVE_LIBSASL2
|
# undef HAVE_LIBSASL2
|
||||||
# undef HAVE_SYS_ACL_H
|
|
||||||
# undef WITH_CAPNG
|
# undef WITH_CAPNG
|
||||||
# undef WITH_CURL
|
# undef WITH_CURL
|
||||||
# undef WITH_DBUS
|
# undef WITH_DBUS
|
||||||
# undef WITH_DEVMAPPER
|
|
||||||
# undef WITH_DTRACE_PROBES
|
# undef WITH_DTRACE_PROBES
|
||||||
# undef WITH_GNUTLS
|
# undef WITH_GNUTLS
|
||||||
# undef WITH_GNUTLS_GCRYPT
|
# undef WITH_GNUTLS_GCRYPT
|
||||||
# undef WITH_LIBSSH
|
|
||||||
# undef WITH_MACVTAP
|
# undef WITH_MACVTAP
|
||||||
# undef WITH_NUMACTL
|
# undef WITH_NUMACTL
|
||||||
# undef WITH_SASL
|
# undef WITH_SASL
|
||||||
@@ -53,17 +51,15 @@
|
|||||||
* explanation above.
|
* explanation above.
|
||||||
*/
|
*/
|
||||||
#ifdef LIBVIRT_NSS
|
#ifdef LIBVIRT_NSS
|
||||||
|
# undef HAVE_LIBDEVMAPPER_H
|
||||||
# undef HAVE_LIBNL
|
# undef HAVE_LIBNL
|
||||||
# undef HAVE_LIBNL3
|
# undef HAVE_LIBNL3
|
||||||
# undef HAVE_LIBSASL2
|
# undef HAVE_LIBSASL2
|
||||||
# undef HAVE_SYS_ACL_H
|
|
||||||
# undef WITH_CAPNG
|
# undef WITH_CAPNG
|
||||||
# undef WITH_CURL
|
# undef WITH_CURL
|
||||||
# undef WITH_DEVMAPPER
|
|
||||||
# undef WITH_DTRACE_PROBES
|
# undef WITH_DTRACE_PROBES
|
||||||
# undef WITH_GNUTLS
|
# undef WITH_GNUTLS
|
||||||
# undef WITH_GNUTLS_GCRYPT
|
# undef WITH_GNUTLS_GCRYPT
|
||||||
# undef WITH_LIBSSH
|
|
||||||
# undef WITH_MACVTAP
|
# undef WITH_MACVTAP
|
||||||
# undef WITH_NUMACTL
|
# undef WITH_NUMACTL
|
||||||
# undef WITH_SASL
|
# undef WITH_SASL
|
||||||
@@ -74,22 +70,20 @@
|
|||||||
# undef WITH_CAPNG
|
# undef WITH_CAPNG
|
||||||
#endif /* LIBVIRT_NSS */
|
#endif /* LIBVIRT_NSS */
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
# error "Libvirt requires GCC >= 4.4, or CLang"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define __GNUC_PREREQ to a sane default if it isn't yet defined.
|
* Define __GNUC__ to a sane default if it isn't yet defined.
|
||||||
* This is done here so that it's included as early as possible; gnulib relies
|
* This is done here so that it's included as early as possible; gnulib relies
|
||||||
* on this to be defined in features.h, which should be included from ctype.h.
|
* on this to be defined in features.h, which should be included from ctype.h.
|
||||||
* This doesn't happen on many non-glibc systems.
|
* This doesn't happen on many non-glibc systems.
|
||||||
* When __GNUC_PREREQ is not defined, gnulib defines it to 0, which breaks things.
|
* When __GNUC__ is not defined, gnulib defines it to 0, which breaks things.
|
||||||
*/
|
*/
|
||||||
#ifndef __GNUC_PREREQ
|
#ifdef __GNUC__
|
||||||
|
# ifndef __GNUC_PREREQ
|
||||||
|
# if defined __GNUC__ && defined __GNUC_MINOR__
|
||||||
# define __GNUC_PREREQ(maj, min) \
|
# define __GNUC_PREREQ(maj, min) \
|
||||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
#endif
|
# else
|
||||||
|
# define __GNUC_PREREQ(maj, min) 0
|
||||||
#if !(__GNUC_PREREQ(4, 4) || defined(__clang__))
|
# endif
|
||||||
# error "Libvirt requires GCC >= 4.4, or CLang"
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
2552
configure.ac
2552
configure.ac
File diff suppressed because it is too large
Load Diff
546
daemon/Makefile.am
Normal file
546
daemon/Makefile.am
Normal file
@@ -0,0 +1,546 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
## Copyright (C) 2005-2015 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
|
||||||
|
## License as published by the Free Software Foundation; either
|
||||||
|
## version 2.1 of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## This library is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
## Lesser General Public License for more details.
|
||||||
|
##
|
||||||
|
## You should have received a copy of the GNU Lesser General Public
|
||||||
|
## License along with this library. If not, see
|
||||||
|
## <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
INCLUDES = \
|
||||||
|
-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
|
||||||
|
-I$(top_srcdir) \
|
||||||
|
-I$(top_builddir)/include -I$(top_srcdir)/include \
|
||||||
|
-I$(top_builddir)/src -I$(top_srcdir)/src \
|
||||||
|
-I$(top_srcdir)/src/util \
|
||||||
|
-I$(top_srcdir)/src/conf \
|
||||||
|
-I$(top_srcdir)/src/rpc \
|
||||||
|
-I$(top_srcdir)/src/remote \
|
||||||
|
-I$(top_srcdir)/src/admin \
|
||||||
|
-I$(top_srcdir)/src/access \
|
||||||
|
$(GETTEXT_CPPFLAGS)
|
||||||
|
|
||||||
|
CLEANFILES =
|
||||||
|
|
||||||
|
DAEMON_GENERATED = \
|
||||||
|
remote_dispatch.h \
|
||||||
|
lxc_dispatch.h \
|
||||||
|
qemu_dispatch.h \
|
||||||
|
admin_dispatch.h \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
DAEMON_SOURCES = \
|
||||||
|
libvirtd.c libvirtd.h \
|
||||||
|
remote.c remote.h \
|
||||||
|
stream.c stream.h \
|
||||||
|
$(DAEMON_GENERATED)
|
||||||
|
|
||||||
|
LIBVIRTD_CONF_SOURCES = libvirtd-config.c libvirtd-config.h
|
||||||
|
|
||||||
|
PODFILES = \
|
||||||
|
libvirtd.pod \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
MANINFILES = \
|
||||||
|
libvirtd.8.in \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
DISTCLEANFILES =
|
||||||
|
EXTRA_DIST = \
|
||||||
|
remote_dispatch.h \
|
||||||
|
lxc_dispatch.h \
|
||||||
|
qemu_dispatch.h \
|
||||||
|
admin_dispatch.h \
|
||||||
|
libvirtd.conf \
|
||||||
|
libvirtd.init.in \
|
||||||
|
libvirtd.upstart \
|
||||||
|
libvirtd.policy.in \
|
||||||
|
libvirt.rules \
|
||||||
|
libvirtd.sasl \
|
||||||
|
libvirtd.service.in \
|
||||||
|
libvirtd.sysconf \
|
||||||
|
libvirtd.sysctl \
|
||||||
|
libvirtd.aug \
|
||||||
|
libvirtd.logrotate.in \
|
||||||
|
libvirtd.qemu.logrotate.in \
|
||||||
|
libvirtd.lxc.logrotate.in \
|
||||||
|
libvirtd.libxl.logrotate.in \
|
||||||
|
libvirtd.uml.logrotate.in \
|
||||||
|
test_libvirtd.aug.in \
|
||||||
|
THREADS.txt \
|
||||||
|
$(PODFILES) \
|
||||||
|
$(MANINFILES) \
|
||||||
|
$(DAEMON_SOURCES) \
|
||||||
|
$(LIBVIRTD_CONF_SOURCES) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
BUILT_SOURCES =
|
||||||
|
|
||||||
|
REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
|
||||||
|
LXC_PROTOCOL = $(top_srcdir)/src/remote/lxc_protocol.x
|
||||||
|
QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x
|
||||||
|
ADMIN_PROTOCOL = $(top_srcdir)/src/admin/admin_protocol.x
|
||||||
|
|
||||||
|
remote_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
$(REMOTE_PROTOCOL)
|
||||||
|
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
--mode=server remote REMOTE $(REMOTE_PROTOCOL) \
|
||||||
|
> $(srcdir)/remote_dispatch.h
|
||||||
|
|
||||||
|
lxc_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
$(LXC_PROTOCOL)
|
||||||
|
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
--mode=server lxc LXC $(LXC_PROTOCOL) \
|
||||||
|
> $(srcdir)/lxc_dispatch.h
|
||||||
|
|
||||||
|
qemu_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
$(QEMU_PROTOCOL)
|
||||||
|
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
--mode=server qemu QEMU $(QEMU_PROTOCOL) \
|
||||||
|
> $(srcdir)/qemu_dispatch.h
|
||||||
|
|
||||||
|
admin_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
$(ADMIN_PROTOCOL)
|
||||||
|
$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
|
||||||
|
--mode=server admin ADMIN $(ADMIN_PROTOCOL) \
|
||||||
|
> $(srcdir)/admin_dispatch.h
|
||||||
|
|
||||||
|
if WITH_LIBVIRTD
|
||||||
|
|
||||||
|
# Build a convenience library, for reuse in tests/libvirtdconftest
|
||||||
|
noinst_LTLIBRARIES = libvirtd_conf.la
|
||||||
|
libvirtd_conf_la_SOURCES = $(LIBVIRTD_CONF_SOURCES)
|
||||||
|
libvirtd_conf_la_CFLAGS = \
|
||||||
|
$(LIBXML_CFLAGS) \
|
||||||
|
$(XDR_CFLAGS) \
|
||||||
|
$(WARN_CFLAGS) $(PIE_CFLAGS) \
|
||||||
|
$(COVERAGE_CFLAGS) \
|
||||||
|
$(NULL)
|
||||||
|
libvirtd_conf_la_LDFLAGS = \
|
||||||
|
$(RELRO_LDFLAGS) \
|
||||||
|
$(PIE_LDFLAGS) \
|
||||||
|
$(COVERAGE_LDFLAGS) \
|
||||||
|
$(NO_INDIRECT_LDFLAGS) \
|
||||||
|
$(NULL)
|
||||||
|
libvirtd_conf_la_LIBADD = $(LIBXML_LIBS)
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES += libvirtd_admin.la
|
||||||
|
libvirtd_admin_la_SOURCES = \
|
||||||
|
admin.c admin.h admin_server.c admin_server.h
|
||||||
|
|
||||||
|
libvirtd_admin_la_CFLAGS = \
|
||||||
|
$(AM_CFLAGS) \
|
||||||
|
$(XDR_CFLAGS) \
|
||||||
|
$(PIE_CFLAGS) \
|
||||||
|
$(WARN_CFLAGS) \
|
||||||
|
$(LIBXML_CFLAGS) \
|
||||||
|
$(COVERAGE_CFLAGS) \
|
||||||
|
$(NULL)
|
||||||
|
libvirtd_admin_la_LDFLAGS = \
|
||||||
|
$(PIE_LDFLAGS) \
|
||||||
|
$(RELRO_LDFLAGS) \
|
||||||
|
$(COVERAGE_LDFLAGS) \
|
||||||
|
$(NO_INDIRECT_LDFLAGS) \
|
||||||
|
$(NULL)
|
||||||
|
libvirtd_admin_la_LIBADD = \
|
||||||
|
../src/libvirt-admin.la
|
||||||
|
|
||||||
|
man8_MANS = libvirtd.8
|
||||||
|
|
||||||
|
sbin_PROGRAMS = libvirtd
|
||||||
|
|
||||||
|
confdir = $(sysconfdir)/libvirt/
|
||||||
|
conf_DATA = libvirtd.conf
|
||||||
|
|
||||||
|
augeasdir = $(datadir)/augeas/lenses
|
||||||
|
augeas_DATA = libvirtd.aug
|
||||||
|
|
||||||
|
augeastestsdir = $(datadir)/augeas/lenses/tests
|
||||||
|
augeastests_DATA = test_libvirtd.aug
|
||||||
|
|
||||||
|
CLEANFILES += test_libvirtd.aug
|
||||||
|
|
||||||
|
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) \
|
||||||
|
$(WARN_CFLAGS) $(PIE_CFLAGS) \
|
||||||
|
$(COVERAGE_CFLAGS) \
|
||||||
|
-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\""
|
||||||
|
|
||||||
|
libvirtd_LDFLAGS = \
|
||||||
|
$(RELRO_LDFLAGS) \
|
||||||
|
$(PIE_LDFLAGS) \
|
||||||
|
$(COVERAGE_LDFLAGS) \
|
||||||
|
$(NO_INDIRECT_LDFLAGS) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
libvirtd_LDADD = \
|
||||||
|
$(LIBXML_LIBS) \
|
||||||
|
$(GNUTLS_LIBS) \
|
||||||
|
$(SASL_LIBS) \
|
||||||
|
$(DBUS_LIBS) \
|
||||||
|
$(LIBNL_LIBS)
|
||||||
|
|
||||||
|
if WITH_DTRACE_PROBES
|
||||||
|
libvirtd_LDADD += ../src/libvirt_probes.lo
|
||||||
|
endif WITH_DTRACE_PROBES
|
||||||
|
|
||||||
|
libvirtd_LDADD += \
|
||||||
|
libvirtd_conf.la \
|
||||||
|
libvirtd_admin.la \
|
||||||
|
../src/libvirt-lxc.la \
|
||||||
|
../src/libvirt-qemu.la \
|
||||||
|
../src/libvirt_driver_remote.la \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
if ! WITH_DRIVER_MODULES
|
||||||
|
if WITH_QEMU
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_qemu.la
|
||||||
|
if WITH_DTRACE_PROBES
|
||||||
|
libvirtd_LDADD += ../src/libvirt_qemu_probes.lo
|
||||||
|
endif WITH_DTRACE_PROBES
|
||||||
|
endif WITH_QEMU
|
||||||
|
|
||||||
|
if WITH_LXC
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_lxc.la
|
||||||
|
endif WITH_LXC
|
||||||
|
|
||||||
|
if WITH_XEN
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_xen.la
|
||||||
|
endif WITH_XEN
|
||||||
|
|
||||||
|
if WITH_LIBXL
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_libxl.la
|
||||||
|
endif WITH_LIBXL
|
||||||
|
|
||||||
|
if WITH_UML
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_uml.la
|
||||||
|
endif WITH_UML
|
||||||
|
|
||||||
|
if WITH_VBOX
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_vbox.la
|
||||||
|
endif WITH_VBOX
|
||||||
|
|
||||||
|
if WITH_VZ
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_vz.la
|
||||||
|
endif WITH_VZ
|
||||||
|
|
||||||
|
if WITH_STORAGE
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_storage.la
|
||||||
|
endif WITH_STORAGE
|
||||||
|
|
||||||
|
if WITH_NETWORK
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_network.la
|
||||||
|
endif WITH_NETWORK
|
||||||
|
|
||||||
|
if WITH_INTERFACE
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_interface.la
|
||||||
|
endif WITH_INTERFACE
|
||||||
|
|
||||||
|
if WITH_NODE_DEVICES
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_nodedev.la
|
||||||
|
endif WITH_NODE_DEVICES
|
||||||
|
|
||||||
|
if WITH_SECRETS
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_secret.la
|
||||||
|
endif WITH_SECRETS
|
||||||
|
|
||||||
|
if WITH_NWFILTER
|
||||||
|
libvirtd_LDADD += ../src/libvirt_driver_nwfilter.la
|
||||||
|
endif WITH_NWFILTER
|
||||||
|
endif ! WITH_DRIVER_MODULES
|
||||||
|
|
||||||
|
libvirtd_LDADD += ../src/libvirt.la
|
||||||
|
|
||||||
|
if WITH_POLKIT
|
||||||
|
if WITH_POLKIT0
|
||||||
|
policydir = $(datadir)/PolicyKit/policy
|
||||||
|
policyauth = auth_admin_keep_session
|
||||||
|
else ! WITH_POLKIT0
|
||||||
|
policydir = $(datadir)/polkit-1/actions
|
||||||
|
policyauth = auth_admin_keep
|
||||||
|
rulesdir = $(datadir)/polkit-1/rules.d
|
||||||
|
rulesfile = libvirt.rules
|
||||||
|
endif ! WITH_POLKIT0
|
||||||
|
endif WITH_POLKIT
|
||||||
|
|
||||||
|
libvirtd.policy: libvirtd.policy.in $(top_builddir)/config.status
|
||||||
|
$(AM_V_GEN) sed \
|
||||||
|
-e 's|[@]authaction[@]|$(policyauth)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
BUILT_SOURCES += libvirtd.policy
|
||||||
|
|
||||||
|
install-data-local: install-init-redhat install-init-systemd \
|
||||||
|
install-init-upstart \
|
||||||
|
install-data-sasl install-data-polkit \
|
||||||
|
install-logrotate install-sysctl
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt \
|
||||||
|
$(DESTDIR)$(localstatedir)/run/libvirt \
|
||||||
|
$(DESTDIR)$(localstatedir)/lib/libvirt
|
||||||
|
|
||||||
|
uninstall-local:: uninstall-init-redhat uninstall-init-systemd \
|
||||||
|
uninstall-init-upstart \
|
||||||
|
uninstall-data-sasl uninstall-data-polkit \
|
||||||
|
uninstall-logrotate uninstall-sysctl
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/log/libvirt || :
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/run/libvirt || :
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || :
|
||||||
|
|
||||||
|
if WITH_POLKIT
|
||||||
|
install-data-polkit::
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(policydir)
|
||||||
|
$(INSTALL_DATA) libvirtd.policy $(DESTDIR)$(policydir)/org.libvirt.unix.policy
|
||||||
|
if ! WITH_POLKIT0
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(rulesdir)
|
||||||
|
$(INSTALL_DATA) $(srcdir)/$(rulesfile) $(DESTDIR)$(rulesdir)/50-libvirt.rules
|
||||||
|
endif ! WITH_POLKIT0
|
||||||
|
|
||||||
|
uninstall-data-polkit::
|
||||||
|
rm -f $(DESTDIR)$(policydir)/org.libvirt.unix.policy
|
||||||
|
rmdir $(DESTDIR)$(policydir) || :
|
||||||
|
if ! WITH_POLKIT0
|
||||||
|
rm -f $(DESTDIR)$(rulesdir)/50-libvirt.rules
|
||||||
|
rmdir $(DESTDIR)$(rulesdir) || :
|
||||||
|
endif ! WITH_POLKIT0
|
||||||
|
|
||||||
|
else ! WITH_POLKIT
|
||||||
|
install-data-polkit::
|
||||||
|
uninstall-data-polkit::
|
||||||
|
endif ! WITH_POLKIT
|
||||||
|
|
||||||
|
remote.c: $(DAEMON_GENERATED)
|
||||||
|
remote.h: $(DAEMON_GENERATED)
|
||||||
|
admin.c: $(DAEMON_GENERATED)
|
||||||
|
admin.h: $(DAEMON_GENERATED)
|
||||||
|
|
||||||
|
LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \
|
||||||
|
libvirtd.libxl.logrotate libvirtd.uml.logrotate \
|
||||||
|
libvirtd.logrotate
|
||||||
|
|
||||||
|
BUILT_SOURCES += $(LOGROTATE_CONFS)
|
||||||
|
|
||||||
|
libvirtd.logrotate: libvirtd.logrotate.in
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
libvirtd.qemu.logrotate: libvirtd.qemu.logrotate.in
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
libvirtd.lxc.logrotate: libvirtd.lxc.logrotate.in
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
libvirtd.libxl.logrotate: libvirtd.libxl.logrotate.in
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
libvirtd.uml.logrotate: libvirtd.uml.logrotate.in
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
install-logrotate: $(LOGROTATE_CONFS)
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt/qemu/ \
|
||||||
|
$(DESTDIR)$(localstatedir)/log/libvirt/lxc/ \
|
||||||
|
$(DESTDIR)$(localstatedir)/log/libvirt/uml/ \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/
|
||||||
|
$(INSTALL_DATA) libvirtd.logrotate \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd
|
||||||
|
$(INSTALL_DATA) libvirtd.qemu.logrotate \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu
|
||||||
|
$(INSTALL_DATA) libvirtd.lxc.logrotate \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc
|
||||||
|
$(INSTALL_DATA) libvirtd.libxl.logrotate \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl
|
||||||
|
$(INSTALL_DATA) libvirtd.uml.logrotate \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
|
||||||
|
|
||||||
|
uninstall-logrotate:
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl \
|
||||||
|
$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/qemu || :
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/lxc || :
|
||||||
|
rmdir $(DESTDIR)$(localstatedir)/log/libvirt/uml || :
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/logrotate.d || :
|
||||||
|
|
||||||
|
install-sysconfig:
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
|
||||||
|
$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \
|
||||||
|
$(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
|
||||||
|
uninstall-sysconfig:
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
|
||||||
|
|
||||||
|
if WITH_SYSCTL
|
||||||
|
# Use $(prefix)/lib rather than $(libdir), since man sysctl.d insists on
|
||||||
|
# /usr/lib/sysctl.d/ even when libdir is /usr/lib64
|
||||||
|
install-sysctl:
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(prefix)/lib/sysctl.d
|
||||||
|
$(INSTALL_DATA) $(srcdir)/libvirtd.sysctl \
|
||||||
|
$(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
|
||||||
|
|
||||||
|
uninstall-sysctl:
|
||||||
|
rm -f $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
|
||||||
|
rmdir $(DESTDIR)$(prefix)/lib/sysctl.d || :
|
||||||
|
else ! WITH_SYSCTL
|
||||||
|
install-sysctl:
|
||||||
|
uninstall-sysctl:
|
||||||
|
endif ! WITH_SYSCTL
|
||||||
|
|
||||||
|
if LIBVIRT_INIT_SCRIPT_RED_HAT
|
||||||
|
|
||||||
|
BUILT_SOURCES += libvirtd.init
|
||||||
|
|
||||||
|
install-init-redhat: install-sysconfig libvirtd.init
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
|
||||||
|
$(INSTALL_SCRIPT) libvirtd.init \
|
||||||
|
$(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
|
||||||
|
|
||||||
|
uninstall-init-redhat: uninstall-sysconfig
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
|
||||||
|
else ! LIBVIRT_INIT_SCRIPT_RED_HAT
|
||||||
|
install-init-redhat:
|
||||||
|
uninstall-init-redhat:
|
||||||
|
endif ! LIBVIRT_INIT_SCRIPT_RED_HAT
|
||||||
|
|
||||||
|
|
||||||
|
if LIBVIRT_INIT_SCRIPT_UPSTART
|
||||||
|
|
||||||
|
install-init-upstart: install-sysconfig
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/event.d
|
||||||
|
$(INSTALL_SCRIPT) libvirtd.upstart \
|
||||||
|
$(DESTDIR)$(sysconfdir)/event.d/libvirtd
|
||||||
|
|
||||||
|
uninstall-init-upstart: uninstall-sysconfig
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/event.d/libvirtd
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/event.d || :
|
||||||
|
else ! LIBVIRT_INIT_SCRIPT_UPSTART
|
||||||
|
install-init-upstart:
|
||||||
|
uninstall-init-upstart:
|
||||||
|
endif ! LIBVIRT_INIT_SCRIPT_UPSTART
|
||||||
|
|
||||||
|
|
||||||
|
if LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||||
|
|
||||||
|
SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
|
||||||
|
BUILT_SOURCES += libvirtd.service
|
||||||
|
|
||||||
|
install-init-systemd: install-sysconfig libvirtd.service
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
|
||||||
|
$(INSTALL_DATA) libvirtd.service \
|
||||||
|
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||||
|
|
||||||
|
uninstall-init-systemd: uninstall-sysconfig
|
||||||
|
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||||
|
rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
|
||||||
|
else ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||||
|
install-init-systemd:
|
||||||
|
uninstall-init-systemd:
|
||||||
|
endif ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||||
|
|
||||||
|
libvirtd.init: libvirtd.init.in $(top_builddir)/config.status
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
-e 's|[@]sbindir[@]|$(sbindir)|g' \
|
||||||
|
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
chmod a+x $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
-e 's|[@]sbindir[@]|$(sbindir)|g' \
|
||||||
|
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
|
||||||
|
check-local: check-augeas
|
||||||
|
|
||||||
|
AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl
|
||||||
|
|
||||||
|
test_libvirtd.aug: test_libvirtd.aug.in $(srcdir)/libvirtd.conf
|
||||||
|
$(AM_V_GEN)$(AUG_GENTEST) $(srcdir)/libvirtd.conf $< $@
|
||||||
|
|
||||||
|
check-augeas: test_libvirtd.aug
|
||||||
|
$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
|
||||||
|
'$(AUGPARSE)' -I $(srcdir) test_libvirtd.aug; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# This must be added last, since functions it provides/replaces
|
||||||
|
# are used by nearly every other library.
|
||||||
|
libvirtd_LDADD += ../gnulib/lib/libgnu.la $(LIBSOCKET)
|
||||||
|
|
||||||
|
else ! WITH_LIBVIRTD
|
||||||
|
install-data-local: install-data-sasl
|
||||||
|
uninstall-local:: uninstall-data-sasl
|
||||||
|
endif ! WITH_LIBVIRTD
|
||||||
|
|
||||||
|
POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
|
||||||
|
|
||||||
|
%.8.in: %.pod
|
||||||
|
$(AM_V_GEN)$(POD2MAN) --section=8 $< $@-t1 && \
|
||||||
|
if grep 'POD ERROR' $@-t1; then rm $@-t1; exit 1; fi && \
|
||||||
|
sed \
|
||||||
|
-e 's|SYSCONFDIR|\@sysconfdir\@|g' \
|
||||||
|
-e 's|LOCALSTATEDIR|\@localstatedir\@|g' \
|
||||||
|
< $@-t1 > $@-t2 && \
|
||||||
|
rm -f $@-t1 && \
|
||||||
|
mv $@-t2 $@
|
||||||
|
|
||||||
|
%.8: %.8.in $(top_srcdir)/configure.ac
|
||||||
|
$(AM_V_GEN)sed \
|
||||||
|
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
||||||
|
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||||
|
< $< > $@-t && \
|
||||||
|
mv $@-t $@
|
||||||
|
|
||||||
|
# This is needed for clients too, so can't wrap in
|
||||||
|
# the WITH_LIBVIRTD conditional
|
||||||
|
if WITH_SASL
|
||||||
|
install-data-sasl:
|
||||||
|
$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sasl2/
|
||||||
|
$(INSTALL_DATA) $(srcdir)/libvirtd.sasl \
|
||||||
|
$(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
|
||||||
|
|
||||||
|
uninstall-data-sasl:
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
|
||||||
|
rmdir $(DESTDIR)$(sysconfdir)/sasl2/ || :
|
||||||
|
else ! WITH_SASL
|
||||||
|
install-data-sasl:
|
||||||
|
uninstall-data-sasl:
|
||||||
|
endif ! WITH_SASL
|
||||||
|
|
||||||
|
|
||||||
|
CLEANFILES += $(BUILT_SOURCES) $(man8_MANS)
|
||||||
|
CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
|
||||||
|
MAINTAINERCLEANFILES = $(MANINFILES) $(DAEMON_GENERATED)
|
||||||
52
daemon/THREADS.txt
Normal file
52
daemon/THREADS.txt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
Threading in the libvirtd daemon
|
||||||
|
================================
|
||||||
|
|
||||||
|
To allow efficient processing of RPC requests, the libvirtd daemon
|
||||||
|
makes use of threads.
|
||||||
|
|
||||||
|
- The process leader. This is the initial thread of control
|
||||||
|
when the daemon starts running. It is responsible for
|
||||||
|
initializing all the state, and starting the event loop.
|
||||||
|
Once that's all done, this thread does nothing except
|
||||||
|
wait for the event loop to quit, thus indicating an orderly
|
||||||
|
shutdown is required.
|
||||||
|
|
||||||
|
- The event loop. This thread runs the event loop, sitting
|
||||||
|
in poll() on all monitored file handles, and calculating
|
||||||
|
and dispatching any timers that may be registered. When
|
||||||
|
this thread quits, the entire daemon will shutdown.
|
||||||
|
|
||||||
|
- The workers. These 'n' threads all sit around waiting to
|
||||||
|
process incoming RPC requests. Since RPC requests may take
|
||||||
|
a long time to complete, with long idle periods, there will
|
||||||
|
be quite a few workers running.
|
||||||
|
|
||||||
|
The use of threads obviously requires locking to ensure safety when
|
||||||
|
accessing/changing data structures.
|
||||||
|
|
||||||
|
- the top level lock is on 'struct qemud_server'. This must be
|
||||||
|
held before acquiring any other lock
|
||||||
|
|
||||||
|
- Each 'struct qemud_client' object has a lock. The server lock
|
||||||
|
must be held before acquiring it. Once the client lock is acquired
|
||||||
|
the server lock can (optionally) be dropped.
|
||||||
|
|
||||||
|
- The event loop has its own self-contained lock. You can ignore
|
||||||
|
this as a caller of virEvent APIs.
|
||||||
|
|
||||||
|
|
||||||
|
The server lock is used in conjunction with a condition variable
|
||||||
|
to pass jobs from the event loop thread to the workers. The main
|
||||||
|
event loop thread handles I/O from the client socket, and once a
|
||||||
|
complete RPC message has been read off the wire (and optionally
|
||||||
|
decrypted), it will be placed on the 'dx' job queue for the
|
||||||
|
associated client object. The job condition will be signalled and
|
||||||
|
a worker will wakup and process it.
|
||||||
|
|
||||||
|
The worker thread must quickly drop its locks on the server and
|
||||||
|
client to allow the main event loop thread to continue running
|
||||||
|
with its other work. Critically important, is that now libvirt
|
||||||
|
API call will ever be made with the server or client locks held.
|
||||||
|
|
||||||
|
-- End
|
||||||
386
daemon/admin.c
Normal file
386
daemon/admin.c
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
/*
|
||||||
|
* admin.c: handlers for admin RPC method calls
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2016 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
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
|
#include "libvirtd.h"
|
||||||
|
#include "libvirt_internal.h"
|
||||||
|
|
||||||
|
#include "admin_protocol.h"
|
||||||
|
#include "admin.h"
|
||||||
|
#include "admin_server.h"
|
||||||
|
#include "datatypes.h"
|
||||||
|
#include "viralloc.h"
|
||||||
|
#include "virerror.h"
|
||||||
|
#include "virlog.h"
|
||||||
|
#include "virnetdaemon.h"
|
||||||
|
#include "virnetserver.h"
|
||||||
|
#include "virstring.h"
|
||||||
|
#include "virthreadjob.h"
|
||||||
|
#include "virtypedparam.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_ADMIN
|
||||||
|
|
||||||
|
VIR_LOG_INIT("daemon.admin");
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
remoteAdmClientFreeFunc(void *data)
|
||||||
|
{
|
||||||
|
struct daemonAdmClientPrivate *priv = data;
|
||||||
|
|
||||||
|
virMutexDestroy(&priv->lock);
|
||||||
|
virObjectUnref(priv->dmn);
|
||||||
|
VIR_FREE(priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
struct daemonAdmClientPrivate *priv;
|
||||||
|
|
||||||
|
if (VIR_ALLOC(priv) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (virMutexInit(&priv->lock) < 0) {
|
||||||
|
VIR_FREE(priv);
|
||||||
|
virReportSystemError(errno, "%s", _("unable to init mutex"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't necessarily need to ref this object right now as there
|
||||||
|
* must be one ref being held throughout the life of the daemon,
|
||||||
|
* but let's just be safe for future.
|
||||||
|
*/
|
||||||
|
priv->dmn = virObjectRef(opaque);
|
||||||
|
|
||||||
|
return priv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Helpers */
|
||||||
|
|
||||||
|
static virNetServerPtr
|
||||||
|
get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull_server srv)
|
||||||
|
{
|
||||||
|
return virNetDaemonGetServer(dmn, srv.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_nonnull_server(admin_nonnull_server *srv_dst,
|
||||||
|
virNetServerPtr srv_src)
|
||||||
|
{
|
||||||
|
ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static virNetServerClientPtr
|
||||||
|
get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
|
||||||
|
{
|
||||||
|
return virNetServerGetClient(srv, clnt.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_nonnull_client(admin_nonnull_client *clt_dst,
|
||||||
|
virNetServerClientPtr clt_src)
|
||||||
|
{
|
||||||
|
clt_dst->id = virNetServerClientGetID(clt_src);
|
||||||
|
clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
|
||||||
|
clt_dst->transport = virNetServerClientGetTransport(clt_src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Functions */
|
||||||
|
static int
|
||||||
|
adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr,
|
||||||
|
struct admin_connect_open_args *args)
|
||||||
|
{
|
||||||
|
unsigned int flags;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
|
||||||
|
virMutexLock(&priv->lock);
|
||||||
|
|
||||||
|
flags = args->flags;
|
||||||
|
virCheckFlagsGoto(0, cleanup);
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
if (ret < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
virMutexUnlock(&priv->lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
virNetServerClientDelayedClose(client);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
|
||||||
|
unsigned long long *libVer)
|
||||||
|
{
|
||||||
|
if (libVer)
|
||||||
|
*libVer = LIBVIR_VERSION_NUMBER;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr,
|
||||||
|
struct admin_server_get_threadpool_parameters_args *args,
|
||||||
|
struct admin_server_get_threadpool_parameters_ret *ret)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
virNetServerPtr srv = NULL;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
int nparams = 0;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (adminServerGetThreadPoolParameters(srv, ¶ms, &nparams,
|
||||||
|
args->flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Number of threadpool parameters %d exceeds max "
|
||||||
|
"allowed limit: %d"), nparams,
|
||||||
|
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParamsSerialize(params, nparams,
|
||||||
|
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||||
|
&ret->params.params_len, 0) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
virObjectUnref(srv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr,
|
||||||
|
struct admin_server_set_threadpool_parameters_args *args)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
virNetServerPtr srv = NULL;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
int nparams = 0;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
||||||
|
virReportError(VIR_ERR_NO_SERVER,
|
||||||
|
_("no server with matching name '%s' found"),
|
||||||
|
args->srv.name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
||||||
|
args->params.params_len,
|
||||||
|
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX,
|
||||||
|
¶ms,
|
||||||
|
&nparams) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
|
||||||
|
if (adminServerSetThreadPoolParameters(srv, params,
|
||||||
|
nparams, args->flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
virObjectUnref(srv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr,
|
||||||
|
struct admin_client_get_info_args *args,
|
||||||
|
struct admin_client_get_info_ret *ret)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
virNetServerPtr srv = NULL;
|
||||||
|
virNetServerClientPtr clnt = NULL;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
int nparams = 0;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) {
|
||||||
|
virReportError(VIR_ERR_NO_SERVER,
|
||||||
|
_("no server with matching name '%s' found"),
|
||||||
|
args->clnt.srv.name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) {
|
||||||
|
virReportError(VIR_ERR_NO_CLIENT,
|
||||||
|
_("no client with matching id '%llu' found"),
|
||||||
|
(unsigned long long) args->clnt.id);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adminClientGetInfo(clnt, ¶ms, &nparams, args->flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Number of client info parameters %d exceeds max "
|
||||||
|
"allowed limit: %d"), nparams,
|
||||||
|
ADMIN_CLIENT_INFO_PARAMETERS_MAX);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParamsSerialize(params, nparams,
|
||||||
|
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||||
|
&ret->params.params_len,
|
||||||
|
VIR_TYPED_PARAM_STRING_OKAY) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
virObjectUnref(clnt);
|
||||||
|
virObjectUnref(srv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchServerGetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
||||||
|
admin_server_get_client_limits_args *args,
|
||||||
|
admin_server_get_client_limits_ret *ret)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
virNetServerPtr srv = NULL;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
int nparams = 0;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (adminServerGetClientLimits(srv, ¶ms, &nparams, args->flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Number of client processing parameters %d exceeds "
|
||||||
|
"max allowed limit: %d"), nparams,
|
||||||
|
ADMIN_SERVER_CLIENT_LIMITS_MAX);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParamsSerialize(params, nparams,
|
||||||
|
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||||
|
&ret->params.params_len, 0) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
virObjectUnref(srv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||||
|
virNetServerClientPtr client,
|
||||||
|
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
||||||
|
admin_server_set_client_limits_args *args)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
virNetServerPtr srv = NULL;
|
||||||
|
virTypedParameterPtr params = NULL;
|
||||||
|
int nparams = 0;
|
||||||
|
struct daemonAdmClientPrivate *priv =
|
||||||
|
virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
||||||
|
virReportError(VIR_ERR_NO_SERVER,
|
||||||
|
_("no server with matching name '%s' found"),
|
||||||
|
args->srv.name);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
||||||
|
args->params.params_len,
|
||||||
|
ADMIN_SERVER_CLIENT_LIMITS_MAX, ¶ms, &nparams) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (adminServerSetClientLimits(srv, params, nparams, args->flags) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
cleanup:
|
||||||
|
if (rv < 0)
|
||||||
|
virNetMessageSaveError(rerr);
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
virObjectUnref(srv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
#include "admin_dispatch.h"
|
||||||
36
daemon/admin.h
Normal file
36
daemon/admin.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* admin.h: handlers for admin RPC method calls
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014-2016 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
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LIBVIRTD_ADMIN_H__
|
||||||
|
# define __LIBVIRTD_ADMIN_H__
|
||||||
|
|
||||||
|
# include "rpc/virnetserverprogram.h"
|
||||||
|
# include "rpc/virnetserverclient.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern virNetServerProgramProc adminProcs[];
|
||||||
|
extern size_t adminNProcs;
|
||||||
|
|
||||||
|
void remoteAdmClientFreeFunc(void *data);
|
||||||
|
void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
|
||||||
|
|
||||||
|
#endif /* __ADMIN_REMOTE_H__ */
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
#include "virerror.h"
|
#include "virerror.h"
|
||||||
#include "viridentity.h"
|
#include "viridentity.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
#include "rpc/virnetdaemon.h"
|
#include "virnetdaemon.h"
|
||||||
#include "rpc/virnetserver.h"
|
#include "virnetserver.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
#include "virthreadpool.h"
|
#include "virthreadpool.h"
|
||||||
#include "virtypedparam.h"
|
#include "virtypedparam.h"
|
||||||
@@ -382,7 +382,7 @@ adminServerSetClientLimits(virNetServerPtr srv,
|
|||||||
VIR_SERVER_CLIENTS_UNAUTH_MAX)))
|
VIR_SERVER_CLIENTS_UNAUTH_MAX)))
|
||||||
maxClientsUnauth = param->value.ui;
|
maxClientsUnauth = param->value.ui;
|
||||||
|
|
||||||
if (virNetServerSetClientLimits(srv, maxClients,
|
if (virNetServerSetClientProcessingControls(srv, maxClients,
|
||||||
maxClientsUnauth) < 0)
|
maxClientsUnauth) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
* Martin Kletzander <mkletzan@redhat.com>
|
* Martin Kletzander <mkletzan@redhat.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __ADMIN_SERVER_H__
|
#ifndef __LIBVIRTD_ADMIN_SERVER_H__
|
||||||
# define __ADMIN_SERVER_H__
|
# define __LIBVIRTD_ADMIN_SERVER_H__
|
||||||
|
|
||||||
# include "rpc/virnetdaemon.h"
|
# include "rpc/virnetdaemon.h"
|
||||||
# include "rpc/virnetserver.h"
|
# include "rpc/virnetserver.h"
|
||||||
@@ -72,4 +72,4 @@ int adminServerSetClientLimits(virNetServerPtr srv,
|
|||||||
int nparams,
|
int nparams,
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
#endif /* __ADMIN_SERVER_H__ */
|
#endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
|
||||||
437
daemon/libvirtd-config.c
Normal file
437
daemon/libvirtd-config.c
Normal file
@@ -0,0 +1,437 @@
|
|||||||
|
/*
|
||||||
|
* libvirtd-config.c: daemon start of day, guest process & i/o management
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2012, 2014, 2015 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "libvirtd-config.h"
|
||||||
|
#include "virconf.h"
|
||||||
|
#include "viralloc.h"
|
||||||
|
#include "virerror.h"
|
||||||
|
#include "virlog.h"
|
||||||
|
#include "rpc/virnetserver.h"
|
||||||
|
#include "configmake.h"
|
||||||
|
#include "remote/remote_protocol.h"
|
||||||
|
#include "remote/remote_driver.h"
|
||||||
|
#include "virstring.h"
|
||||||
|
#include "virutil.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_CONF
|
||||||
|
|
||||||
|
VIR_LOG_INIT("daemon.libvirtd-config");
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteConfigGetAuth(virConfPtr conf,
|
||||||
|
const char *filename,
|
||||||
|
const char *key,
|
||||||
|
int *auth)
|
||||||
|
{
|
||||||
|
char *authstr = NULL;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, key, &authstr) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!authstr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (STREQ(authstr, "none")) {
|
||||||
|
*auth = VIR_NET_SERVER_SERVICE_AUTH_NONE;
|
||||||
|
#if WITH_SASL
|
||||||
|
} else if (STREQ(authstr, "sasl")) {
|
||||||
|
*auth = VIR_NET_SERVER_SERVICE_AUTH_SASL;
|
||||||
|
#endif
|
||||||
|
} else if (STREQ(authstr, "polkit")) {
|
||||||
|
*auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT;
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("%s: %s: unsupported auth %s"),
|
||||||
|
filename, key, authstr);
|
||||||
|
VIR_FREE(authstr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_FREE(authstr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
daemonConfigFilePath(bool privileged, char **configfile)
|
||||||
|
{
|
||||||
|
if (privileged) {
|
||||||
|
if (VIR_STRDUP(*configfile, SYSCONFDIR "/libvirt/libvirtd.conf") < 0)
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
char *configdir = NULL;
|
||||||
|
|
||||||
|
if (!(configdir = virGetUserConfigDirectory()))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virAsprintf(configfile, "%s/libvirtd.conf", configdir) < 0) {
|
||||||
|
VIR_FREE(configdir);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
VIR_FREE(configdir);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct daemonConfig*
|
||||||
|
daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
struct daemonConfig *data;
|
||||||
|
char *localhost;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (VIR_ALLOC(data) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
data->listen_tls = 1;
|
||||||
|
data->listen_tcp = 0;
|
||||||
|
|
||||||
|
if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 ||
|
||||||
|
VIR_STRDUP(data->tcp_port, LIBVIRTD_TCP_PORT) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
/* Only default to PolicyKit if running as root */
|
||||||
|
#if WITH_POLKIT
|
||||||
|
if (privileged) {
|
||||||
|
data->auth_unix_rw = REMOTE_AUTH_POLKIT;
|
||||||
|
data->auth_unix_ro = REMOTE_AUTH_POLKIT;
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
data->auth_unix_rw = REMOTE_AUTH_NONE;
|
||||||
|
data->auth_unix_ro = REMOTE_AUTH_NONE;
|
||||||
|
#if WITH_POLKIT
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (VIR_STRDUP(data->unix_sock_rw_perms,
|
||||||
|
data->auth_unix_rw == REMOTE_AUTH_POLKIT ? "0777" : "0700") < 0 ||
|
||||||
|
VIR_STRDUP(data->unix_sock_ro_perms, "0777") < 0 ||
|
||||||
|
VIR_STRDUP(data->unix_sock_admin_perms, "0700") < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
#if WITH_SASL
|
||||||
|
data->auth_tcp = REMOTE_AUTH_SASL;
|
||||||
|
#else
|
||||||
|
data->auth_tcp = REMOTE_AUTH_NONE;
|
||||||
|
#endif
|
||||||
|
data->auth_tls = REMOTE_AUTH_NONE;
|
||||||
|
|
||||||
|
data->mdns_adv = 0;
|
||||||
|
|
||||||
|
data->min_workers = 5;
|
||||||
|
data->max_workers = 20;
|
||||||
|
data->max_clients = 5000;
|
||||||
|
data->max_queued_clients = 1000;
|
||||||
|
data->max_anonymous_clients = 20;
|
||||||
|
|
||||||
|
data->prio_workers = 5;
|
||||||
|
|
||||||
|
data->max_requests = 20;
|
||||||
|
data->max_client_requests = 5;
|
||||||
|
|
||||||
|
data->audit_level = 1;
|
||||||
|
data->audit_logging = 0;
|
||||||
|
|
||||||
|
data->keepalive_interval = 5;
|
||||||
|
data->keepalive_count = 5;
|
||||||
|
|
||||||
|
data->admin_min_workers = 5;
|
||||||
|
data->admin_max_workers = 20;
|
||||||
|
data->admin_max_clients = 5000;
|
||||||
|
data->admin_max_queued_clients = 20;
|
||||||
|
data->admin_max_client_requests = 5;
|
||||||
|
|
||||||
|
data->admin_keepalive_interval = 5;
|
||||||
|
data->admin_keepalive_count = 5;
|
||||||
|
|
||||||
|
localhost = virGetHostname();
|
||||||
|
if (localhost == NULL) {
|
||||||
|
/* we couldn't resolve the hostname; assume that we are
|
||||||
|
* running in disconnected operation, and report a less
|
||||||
|
* useful Avahi string
|
||||||
|
*/
|
||||||
|
ret = VIR_STRDUP(data->mdns_name, "Virtualization Host");
|
||||||
|
} else {
|
||||||
|
char *tmp;
|
||||||
|
/* Extract the host part of the potentially FQDN */
|
||||||
|
if ((tmp = strchr(localhost, '.')))
|
||||||
|
*tmp = '\0';
|
||||||
|
ret = virAsprintf(&data->mdns_name, "Virtualization Host %s",
|
||||||
|
localhost);
|
||||||
|
}
|
||||||
|
VIR_FREE(localhost);
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
|
||||||
|
error:
|
||||||
|
daemonConfigFree(data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
daemonConfigFree(struct daemonConfig *data)
|
||||||
|
{
|
||||||
|
char **tmp;
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VIR_FREE(data->listen_addr);
|
||||||
|
VIR_FREE(data->tls_port);
|
||||||
|
VIR_FREE(data->tcp_port);
|
||||||
|
tmp = data->access_drivers;
|
||||||
|
while (tmp && *tmp) {
|
||||||
|
VIR_FREE(*tmp);
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
VIR_FREE(data->access_drivers);
|
||||||
|
|
||||||
|
VIR_FREE(data->unix_sock_admin_perms);
|
||||||
|
VIR_FREE(data->unix_sock_ro_perms);
|
||||||
|
VIR_FREE(data->unix_sock_rw_perms);
|
||||||
|
VIR_FREE(data->unix_sock_group);
|
||||||
|
VIR_FREE(data->unix_sock_dir);
|
||||||
|
VIR_FREE(data->mdns_name);
|
||||||
|
|
||||||
|
tmp = data->tls_allowed_dn_list;
|
||||||
|
while (tmp && *tmp) {
|
||||||
|
VIR_FREE(*tmp);
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
VIR_FREE(data->tls_allowed_dn_list);
|
||||||
|
|
||||||
|
tmp = data->sasl_allowed_username_list;
|
||||||
|
while (tmp && *tmp) {
|
||||||
|
VIR_FREE(*tmp);
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
VIR_FREE(data->sasl_allowed_username_list);
|
||||||
|
VIR_FREE(data->tls_priority);
|
||||||
|
|
||||||
|
VIR_FREE(data->key_file);
|
||||||
|
VIR_FREE(data->ca_file);
|
||||||
|
VIR_FREE(data->cert_file);
|
||||||
|
VIR_FREE(data->crl_file);
|
||||||
|
|
||||||
|
VIR_FREE(data->host_uuid);
|
||||||
|
VIR_FREE(data->host_uuid_source);
|
||||||
|
VIR_FREE(data->log_filters);
|
||||||
|
VIR_FREE(data->log_outputs);
|
||||||
|
|
||||||
|
VIR_FREE(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
daemonConfigLoadOptions(struct daemonConfig *data,
|
||||||
|
const char *filename,
|
||||||
|
virConfPtr conf)
|
||||||
|
{
|
||||||
|
if (virConfGetValueBool(conf, "listen_tcp", &data->listen_tcp) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueBool(conf, "listen_tls", &data->listen_tls) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "tls_port", &data->tls_port) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "tcp_port", &data->tcp_port) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "listen_addr", &data->listen_addr) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (remoteConfigGetAuth(conf, filename, "auth_unix_rw", &data->auth_unix_rw) < 0)
|
||||||
|
goto error;
|
||||||
|
#if WITH_POLKIT
|
||||||
|
/* Change default perms to be wide-open if PolicyKit is enabled.
|
||||||
|
* Admin can always override in config file
|
||||||
|
*/
|
||||||
|
if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) {
|
||||||
|
VIR_FREE(data->unix_sock_rw_perms);
|
||||||
|
if (VIR_STRDUP(data->unix_sock_rw_perms, "0777") < 0)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (remoteConfigGetAuth(conf, filename, "auth_unix_ro", &data->auth_unix_ro) < 0)
|
||||||
|
goto error;
|
||||||
|
if (remoteConfigGetAuth(conf, filename, "auth_tcp", &data->auth_tcp) < 0)
|
||||||
|
goto error;
|
||||||
|
if (remoteConfigGetAuth(conf, filename, "auth_tls", &data->auth_tls) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueStringList(conf, "access_drivers", false,
|
||||||
|
&data->access_drivers) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, "unix_sock_group", &data->unix_sock_group) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "unix_sock_admin_perms", &data->unix_sock_admin_perms) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "unix_sock_ro_perms", &data->unix_sock_ro_perms) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "unix_sock_rw_perms", &data->unix_sock_rw_perms) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, "unix_sock_dir", &data->unix_sock_dir) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueBool(conf, "mdns_adv", &data->mdns_adv) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "mdns_name", &data->mdns_name) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueBool(conf, "tls_no_sanity_certificate", &data->tls_no_sanity_certificate) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueBool(conf, "tls_no_verify_certificate", &data->tls_no_verify_certificate) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, "key_file", &data->key_file) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "cert_file", &data->cert_file) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "ca_file", &data->ca_file) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "crl_file", &data->crl_file) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueStringList(conf, "tls_allowed_dn_list", false,
|
||||||
|
&data->tls_allowed_dn_list) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
|
||||||
|
if (virConfGetValueStringList(conf, "sasl_allowed_username_list", false,
|
||||||
|
&data->sasl_allowed_username_list) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, "tls_priority", &data->tls_priority) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "min_workers", &data->min_workers) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "max_workers", &data->max_workers) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "max_clients", &data->max_clients) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "max_queued_clients", &data->max_queued_clients) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "max_anonymous_clients", &data->max_anonymous_clients) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "prio_workers", &data->prio_workers) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "max_requests", &data->max_requests) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "max_client_requests", &data->max_client_requests) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "admin_min_workers", &data->admin_min_workers) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "admin_max_workers", &data->admin_max_workers) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_clients) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "admin_max_queued_clients", &data->admin_max_queued_clients) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "admin_max_client_requests", &data->admin_max_client_requests) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "audit_level", &data->audit_level) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueBool(conf, "audit_logging", &data->audit_logging) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueString(conf, "host_uuid", &data->host_uuid) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "host_uuid_source", &data->host_uuid_source) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueUInt(conf, "log_level", &data->log_level) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "log_filters", &data->log_filters) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueString(conf, "log_outputs", &data->log_outputs) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueInt(conf, "keepalive_interval", &data->keepalive_interval) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "keepalive_count", &data->keepalive_count) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (virConfGetValueInt(conf, "admin_keepalive_interval", &data->admin_keepalive_interval) < 0)
|
||||||
|
goto error;
|
||||||
|
if (virConfGetValueUInt(conf, "admin_keepalive_count", &data->admin_keepalive_count) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Read the config file if it exists.
|
||||||
|
* Only used in the remote case, hence the name.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
daemonConfigLoadFile(struct daemonConfig *data,
|
||||||
|
const char *filename,
|
||||||
|
bool allow_missing)
|
||||||
|
{
|
||||||
|
virConfPtr conf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (allow_missing &&
|
||||||
|
access(filename, R_OK) == -1 &&
|
||||||
|
errno == ENOENT)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
conf = virConfReadFile(filename, 0);
|
||||||
|
if (!conf)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ret = daemonConfigLoadOptions(data, filename, conf);
|
||||||
|
virConfFree(conf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int daemonConfigLoadData(struct daemonConfig *data,
|
||||||
|
const char *filename,
|
||||||
|
const char *filedata)
|
||||||
|
{
|
||||||
|
virConfPtr conf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
conf = virConfReadMem(filedata, strlen(filedata), 0);
|
||||||
|
if (!conf)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ret = daemonConfigLoadOptions(data, filename, conf);
|
||||||
|
virConfFree(conf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
108
daemon/libvirtd-config.h
Normal file
108
daemon/libvirtd-config.h
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* libvirtd-config.h: daemon start of day, guest process & i/o management
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2012, 2015 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LIBVIRTD_CONFIG_H__
|
||||||
|
# define __LIBVIRTD_CONFIG_H__
|
||||||
|
|
||||||
|
# include "internal.h"
|
||||||
|
|
||||||
|
struct daemonConfig {
|
||||||
|
char *host_uuid;
|
||||||
|
char *host_uuid_source;
|
||||||
|
|
||||||
|
bool listen_tls;
|
||||||
|
bool listen_tcp;
|
||||||
|
char *listen_addr;
|
||||||
|
char *tls_port;
|
||||||
|
char *tcp_port;
|
||||||
|
|
||||||
|
char *unix_sock_admin_perms;
|
||||||
|
char *unix_sock_ro_perms;
|
||||||
|
char *unix_sock_rw_perms;
|
||||||
|
char *unix_sock_group;
|
||||||
|
char *unix_sock_dir;
|
||||||
|
|
||||||
|
int auth_unix_rw;
|
||||||
|
int auth_unix_ro;
|
||||||
|
int auth_tcp;
|
||||||
|
int auth_tls;
|
||||||
|
|
||||||
|
char **access_drivers;
|
||||||
|
|
||||||
|
bool mdns_adv;
|
||||||
|
char *mdns_name;
|
||||||
|
|
||||||
|
bool tls_no_verify_certificate;
|
||||||
|
bool tls_no_sanity_certificate;
|
||||||
|
char **tls_allowed_dn_list;
|
||||||
|
char **sasl_allowed_username_list;
|
||||||
|
char *tls_priority;
|
||||||
|
|
||||||
|
char *key_file;
|
||||||
|
char *cert_file;
|
||||||
|
char *ca_file;
|
||||||
|
char *crl_file;
|
||||||
|
|
||||||
|
unsigned int min_workers;
|
||||||
|
unsigned int max_workers;
|
||||||
|
unsigned int max_clients;
|
||||||
|
unsigned int max_queued_clients;
|
||||||
|
unsigned int max_anonymous_clients;
|
||||||
|
|
||||||
|
unsigned int prio_workers;
|
||||||
|
|
||||||
|
unsigned int max_requests;
|
||||||
|
unsigned int max_client_requests;
|
||||||
|
|
||||||
|
unsigned int log_level;
|
||||||
|
char *log_filters;
|
||||||
|
char *log_outputs;
|
||||||
|
|
||||||
|
unsigned int audit_level;
|
||||||
|
bool audit_logging;
|
||||||
|
|
||||||
|
int keepalive_interval;
|
||||||
|
unsigned int keepalive_count;
|
||||||
|
|
||||||
|
unsigned int admin_min_workers;
|
||||||
|
unsigned int admin_max_workers;
|
||||||
|
unsigned int admin_max_clients;
|
||||||
|
unsigned int admin_max_queued_clients;
|
||||||
|
unsigned int admin_max_client_requests;
|
||||||
|
|
||||||
|
int admin_keepalive_interval;
|
||||||
|
unsigned int admin_keepalive_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int daemonConfigFilePath(bool privileged, char **configfile);
|
||||||
|
struct daemonConfig* daemonConfigNew(bool privileged);
|
||||||
|
void daemonConfigFree(struct daemonConfig *data);
|
||||||
|
int daemonConfigLoadFile(struct daemonConfig *data,
|
||||||
|
const char *filename,
|
||||||
|
bool allow_missing);
|
||||||
|
int daemonConfigLoadData(struct daemonConfig *data,
|
||||||
|
const char *filename,
|
||||||
|
const char *filedata);
|
||||||
|
|
||||||
|
#endif /* __LIBVIRTD_CONFIG_H__ */
|
||||||
@@ -60,6 +60,7 @@ module Libvirtd =
|
|||||||
| int_entry "max_clients"
|
| int_entry "max_clients"
|
||||||
| int_entry "max_queued_clients"
|
| int_entry "max_queued_clients"
|
||||||
| int_entry "max_anonymous_clients"
|
| int_entry "max_anonymous_clients"
|
||||||
|
| int_entry "max_requests"
|
||||||
| int_entry "max_client_requests"
|
| int_entry "max_client_requests"
|
||||||
| int_entry "prio_workers"
|
| int_entry "prio_workers"
|
||||||
|
|
||||||
@@ -87,7 +88,6 @@ module Libvirtd =
|
|||||||
|
|
||||||
let misc_entry = str_entry "host_uuid"
|
let misc_entry = str_entry "host_uuid"
|
||||||
| str_entry "host_uuid_source"
|
| str_entry "host_uuid_source"
|
||||||
| int_entry "ovs_timeout"
|
|
||||||
|
|
||||||
(* Each enty in the config is one of the following three ... *)
|
(* Each enty in the config is one of the following three ... *)
|
||||||
let entry = network_entry
|
let entry = network_entry
|
||||||
1663
daemon/libvirtd.c
Normal file
1663
daemon/libvirtd.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
# Master libvirt daemon configuration file
|
# Master libvirt daemon configuration file
|
||||||
#
|
#
|
||||||
# For further information consult https://libvirt.org/format.html
|
# For further information consult http://libvirt.org/format.html
|
||||||
#
|
#
|
||||||
# NOTE: the tests/daemon-conf regression test script requires
|
# NOTE: the tests/daemon-conf regression test script requires
|
||||||
# that each "PARAMETER = VALUE" line in this file have the parameter
|
# that each "PARAMETER = VALUE" line in this file have the parameter
|
||||||
@@ -182,20 +182,6 @@
|
|||||||
# TLS x509 certificate configuration
|
# TLS x509 certificate configuration
|
||||||
#
|
#
|
||||||
|
|
||||||
# Use of TLS requires that x509 certificates be issued. The default locations
|
|
||||||
# for the certificate files is as follows:
|
|
||||||
#
|
|
||||||
# /etc/pki/CA/cacert.pem - The CA master certificate
|
|
||||||
# /etc/pki/libvirt/servercert.pem - The server certificate signed with
|
|
||||||
# the cacert.pem
|
|
||||||
# /etc/pki/libvirt/private/serverkey.pem - The server private key
|
|
||||||
#
|
|
||||||
# It is possible to override the default locations by altering the 'key_file',
|
|
||||||
# 'cert_file', and 'ca_file' values and uncommenting them below.
|
|
||||||
#
|
|
||||||
# NB, overriding the default of one location requires uncommenting and
|
|
||||||
# possibly additionally overriding the other settings.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Override the default server key file path
|
# Override the default server key file path
|
||||||
#
|
#
|
||||||
@@ -315,10 +301,20 @@
|
|||||||
# (notably domainDestroy) can be executed in this pool.
|
# (notably domainDestroy) can be executed in this pool.
|
||||||
#prio_workers = 5
|
#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
|
||||||
|
# memory usage, currently each request requires 256 KB of
|
||||||
|
# memory. So by default up to 5 MB of memory is used
|
||||||
|
#
|
||||||
|
# XXX this isn't actually enforced yet, only the per-client
|
||||||
|
# limit is used so far
|
||||||
|
#max_requests = 20
|
||||||
|
|
||||||
# Limit on concurrent requests from a single client
|
# Limit on concurrent requests from a single client
|
||||||
# connection. To avoid one client monopolizing the server
|
# connection. To avoid one client monopolizing the server
|
||||||
# this should be a small fraction of the global max_workers
|
# this should be a small fraction of the global max_requests
|
||||||
# parameter.
|
# and max_workers parameter
|
||||||
#max_client_requests = 5
|
#max_client_requests = 5
|
||||||
|
|
||||||
# Same processing controls, but this time for the admin interface.
|
# Same processing controls, but this time for the admin interface.
|
||||||
@@ -471,12 +467,3 @@
|
|||||||
# Keepalive settings for the admin interface
|
# Keepalive settings for the admin interface
|
||||||
#admin_keepalive_interval = 5
|
#admin_keepalive_interval = 5
|
||||||
#admin_keepalive_count = 5
|
#admin_keepalive_count = 5
|
||||||
|
|
||||||
###################################################################
|
|
||||||
# Open vSwitch:
|
|
||||||
# This allows to specify a timeout for openvswitch calls made by
|
|
||||||
# libvirt. The ovs-vsctl utility is used for the configuration and
|
|
||||||
# its timeout option is set by default to 5 seconds to avoid
|
|
||||||
# potential infinite waits blocking libvirt.
|
|
||||||
#
|
|
||||||
#ovs_timeout = 5
|
|
||||||
94
daemon/libvirtd.h
Normal file
94
daemon/libvirtd.h
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* libvirtd.h: daemon data structure definitions
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006-2015 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2006 Daniel P. Berrange
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LIBVIRTD_H__
|
||||||
|
# define LIBVIRTD_H__
|
||||||
|
|
||||||
|
# define VIR_ENUM_SENTINELS
|
||||||
|
|
||||||
|
# include <rpc/types.h>
|
||||||
|
# include <rpc/xdr.h>
|
||||||
|
# include "remote_protocol.h"
|
||||||
|
# include "admin_protocol.h"
|
||||||
|
# include "lxc_protocol.h"
|
||||||
|
# include "qemu_protocol.h"
|
||||||
|
# include "virthread.h"
|
||||||
|
|
||||||
|
# if WITH_SASL
|
||||||
|
# include "virnetsaslcontext.h"
|
||||||
|
# endif
|
||||||
|
# include "virnetserverprogram.h"
|
||||||
|
|
||||||
|
typedef struct daemonClientStream daemonClientStream;
|
||||||
|
typedef daemonClientStream *daemonClientStreamPtr;
|
||||||
|
typedef struct daemonClientPrivate daemonClientPrivate;
|
||||||
|
typedef daemonClientPrivate *daemonClientPrivatePtr;
|
||||||
|
typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
|
||||||
|
typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
|
||||||
|
typedef struct daemonClientEventCallback daemonClientEventCallback;
|
||||||
|
typedef daemonClientEventCallback *daemonClientEventCallbackPtr;
|
||||||
|
|
||||||
|
/* Stores the per-client connection state */
|
||||||
|
struct daemonClientPrivate {
|
||||||
|
/* Hold while accessing any data except conn */
|
||||||
|
virMutex lock;
|
||||||
|
|
||||||
|
daemonClientEventCallbackPtr *domainEventCallbacks;
|
||||||
|
size_t ndomainEventCallbacks;
|
||||||
|
daemonClientEventCallbackPtr *networkEventCallbacks;
|
||||||
|
size_t nnetworkEventCallbacks;
|
||||||
|
daemonClientEventCallbackPtr *qemuEventCallbacks;
|
||||||
|
size_t nqemuEventCallbacks;
|
||||||
|
daemonClientEventCallbackPtr *storageEventCallbacks;
|
||||||
|
size_t nstorageEventCallbacks;
|
||||||
|
bool closeRegistered;
|
||||||
|
|
||||||
|
# if WITH_SASL
|
||||||
|
virNetSASLSessionPtr sasl;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* This is only valid if a remote open call has been made on this
|
||||||
|
* connection, otherwise it will be NULL. Also if remote close is
|
||||||
|
* called, it will be set back to NULL if that succeeds.
|
||||||
|
*/
|
||||||
|
virConnectPtr conn;
|
||||||
|
|
||||||
|
daemonClientStreamPtr streams;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Separate private data for admin connection */
|
||||||
|
struct daemonAdmClientPrivate {
|
||||||
|
/* Just a placeholder, not that there is anything to be locked */
|
||||||
|
virMutex lock;
|
||||||
|
|
||||||
|
virNetDaemonPtr dmn;
|
||||||
|
};
|
||||||
|
|
||||||
|
# if WITH_SASL
|
||||||
|
extern virNetSASLContextPtr saslCtxt;
|
||||||
|
# endif
|
||||||
|
extern virNetServerProgramPtr remoteProgram;
|
||||||
|
extern virNetServerProgramPtr qemuProgram;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
# Short-Description: daemon for libvirt virtualization API
|
# Short-Description: daemon for libvirt virtualization API
|
||||||
# Description: This is a daemon for managing guest instances
|
# Description: This is a daemon for managing guest instances
|
||||||
# and libvirt virtual networks
|
# and libvirt virtual networks
|
||||||
# See https://libvirt.org
|
# See http://libvirt.org
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
# the following is chkconfig init header
|
# the following is chkconfig init header
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
# chkconfig: 345 97 03
|
# chkconfig: 345 97 03
|
||||||
# description: This is a daemon for managing guest instances \
|
# description: This is a daemon for managing guest instances \
|
||||||
# and libvirt virtual networks \
|
# and libvirt virtual networks \
|
||||||
# See https://libvirt.org
|
# See http://libvirt.org
|
||||||
#
|
#
|
||||||
# processname: libvirtd
|
# processname: libvirtd
|
||||||
# pidfile: @localstatedir@/run/libvirtd.pid
|
# pidfile: @localstatedir@/run/libvirtd.pid
|
||||||
@@ -5,4 +5,5 @@
|
|||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
copytruncate
|
copytruncate
|
||||||
|
minsize 100k
|
||||||
}
|
}
|
||||||
@@ -5,4 +5,5 @@
|
|||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
copytruncate
|
copytruncate
|
||||||
|
minsize 100k
|
||||||
}
|
}
|
||||||
@@ -56,8 +56,10 @@ Use this name for the PID file, overriding the default value.
|
|||||||
|
|
||||||
=item B<-t, --timeout> I<SECONDS>
|
=item B<-t, --timeout> I<SECONDS>
|
||||||
|
|
||||||
Exit after timeout period (in seconds), provided there are neither any client
|
Exit after timeout period (in seconds) elapse with no client connections
|
||||||
connections nor any running domains.
|
or registered resources. Be aware that resources such as autostart
|
||||||
|
networks will result in never reaching the timeout, even when there are
|
||||||
|
no client connections.
|
||||||
|
|
||||||
=item B<-v, --verbose>
|
=item B<-v, --verbose>
|
||||||
|
|
||||||
@@ -79,7 +81,7 @@ On receipt of B<SIGHUP> libvirtd will reload its configuration.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item F<SYSCONFDIR/libvirt/libvirtd.conf>
|
=item F<SYSCONFDIR/libvirtd.conf>
|
||||||
|
|
||||||
The default configuration file used by libvirtd, unless overridden on the
|
The default configuration file used by libvirtd, unless overridden on the
|
||||||
command line using the B<-f>|B<--config> option.
|
command line using the B<-f>|B<--config> option.
|
||||||
@@ -112,7 +114,7 @@ The PID file to use, unless overridden by the B<-p>|B<--pid-file> option.
|
|||||||
|
|
||||||
=over
|
=over
|
||||||
|
|
||||||
=item F<$XDG_CONFIG_HOME/libvirt/libvirtd.conf>
|
=item F<$XDG_CONFIG_HOME/libvirtd.conf>
|
||||||
|
|
||||||
The default configuration file used by libvirtd, unless overridden on the
|
The default configuration file used by libvirtd, unless overridden on the
|
||||||
command line using the B<-f>|B<--config> option.
|
command line using the B<-f>|B<--config> option.
|
||||||
@@ -166,7 +168,7 @@ Please report all bugs you discover. This should be done via either:
|
|||||||
|
|
||||||
=item a) the mailing list
|
=item a) the mailing list
|
||||||
|
|
||||||
L<https://libvirt.org/contact.html>
|
L<http://libvirt.org/contact.html>
|
||||||
|
|
||||||
=item or,
|
=item or,
|
||||||
|
|
||||||
@@ -174,7 +176,7 @@ B<>
|
|||||||
|
|
||||||
=item b) the bug tracker
|
=item b) the bug tracker
|
||||||
|
|
||||||
L<https://libvirt.org/bugs.html>
|
L<http://libvirt.org/bugs.html>
|
||||||
|
|
||||||
=item Alternatively, you may report bugs to your software distributor / vendor.
|
=item Alternatively, you may report bugs to your software distributor / vendor.
|
||||||
|
|
||||||
@@ -199,6 +201,6 @@ PURPOSE
|
|||||||
=head1 SEE ALSO
|
=head1 SEE ALSO
|
||||||
|
|
||||||
L<virsh(1)>, L<virt-install(1)>, L<virt-xml-validate(1)>, L<virt-top(1)>,
|
L<virsh(1)>, L<virt-install(1)>, L<virt-xml-validate(1)>, L<virt-top(1)>,
|
||||||
L<virt-df(1)>, L<https://www.libvirt.org/>
|
L<virt-df(1)>, L<http://www.libvirt.org/>
|
||||||
|
|
||||||
=cut
|
=cut
|
||||||
@@ -5,4 +5,5 @@
|
|||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
copytruncate
|
copytruncate
|
||||||
|
minsize 100k
|
||||||
}
|
}
|
||||||
31
daemon/libvirtd.sasl
Normal file
31
daemon/libvirtd.sasl
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# If you want to use the non-TLS socket, then you *must* include
|
||||||
|
# the GSSAPI or DIGEST-MD5 mechanisms, because they are the only
|
||||||
|
# ones that can offer session encryption as well as authentication.
|
||||||
|
#
|
||||||
|
# If you're only using TLS, then you can turn on any mechanisms
|
||||||
|
# you like for authentication, because TLS provides the encryption
|
||||||
|
#
|
||||||
|
# Default to a simple username+password mechanism
|
||||||
|
mech_list: digest-md5
|
||||||
|
|
||||||
|
# Before you can use GSSAPI, you need a service principle on the
|
||||||
|
# KDC server for libvirt, and that to be exported to the keytab
|
||||||
|
# file listed below
|
||||||
|
#mech_list: gssapi
|
||||||
|
#
|
||||||
|
# You can also list many mechanisms at once, then the user can choose
|
||||||
|
# by adding '?auth=sasl.gssapi' to their libvirt URI, eg
|
||||||
|
# qemu+tcp://hostname/system?auth=sasl.gssapi
|
||||||
|
#mech_list: digest-md5 gssapi
|
||||||
|
|
||||||
|
# Some older builds of MIT kerberos on Linux ignore this option &
|
||||||
|
# instead need KRB5_KTNAME env var.
|
||||||
|
# For modern Linux, and other OS, this should be sufficient
|
||||||
|
#
|
||||||
|
# There is no default value here, uncomment if you need this
|
||||||
|
#keytab: /etc/libvirt/krb5.tab
|
||||||
|
|
||||||
|
# If using digest-md5 for username/passwds, then this is the file
|
||||||
|
# containing the passwds. Use 'saslpasswd2 -a libvirt [username]'
|
||||||
|
# to add entries, and 'sasldblistusers2 -f [sasldb_path]' to browse it
|
||||||
|
sasldb_path: /etc/libvirt/passwd.db
|
||||||
31
daemon/libvirtd.service.in
Normal file
31
daemon/libvirtd.service.in
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# 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
|
||||||
|
After=local-fs.target
|
||||||
|
After=remote-fs.target
|
||||||
|
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
|
||||||
|
KillMode=process
|
||||||
|
Restart=on-failure
|
||||||
|
# Override the maximum number of opened files
|
||||||
|
#LimitNOFILE=2048
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
Also=virtlockd.socket
|
||||||
|
Also=virtlogd.socket
|
||||||
@@ -5,4 +5,5 @@
|
|||||||
compress
|
compress
|
||||||
delaycompress
|
delaycompress
|
||||||
copytruncate
|
copytruncate
|
||||||
|
minsize 100k
|
||||||
}
|
}
|
||||||
6532
daemon/remote.c
Normal file
6532
daemon/remote.c
Normal file
File diff suppressed because it is too large
Load Diff
45
daemon/remote.h
Normal file
45
daemon/remote.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* remote.h: handlers for RPC method calls
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007, 2008, 2009 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Richard W.M. Jones <rjones@redhat.com>
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LIBVIRTD_REMOTE_H__
|
||||||
|
# define __LIBVIRTD_REMOTE_H__
|
||||||
|
|
||||||
|
# include "remote_protocol.h"
|
||||||
|
# include "rpc/virnetserverprogram.h"
|
||||||
|
# include "rpc/virnetserverclient.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern virNetServerProgramProc remoteProcs[];
|
||||||
|
extern size_t remoteNProcs;
|
||||||
|
|
||||||
|
extern virNetServerProgramProc lxcProcs[];
|
||||||
|
extern size_t lxcNProcs;
|
||||||
|
|
||||||
|
extern virNetServerProgramProc qemuProcs[];
|
||||||
|
extern size_t qemuNProcs;
|
||||||
|
|
||||||
|
void remoteClientFreeFunc(void *data);
|
||||||
|
void *remoteClientInitHook(virNetServerClientPtr client,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
|
#endif /* __LIBVIRTD_REMOTE_H__ */
|
||||||
796
daemon/stream.c
Normal file
796
daemon/stream.c
Normal file
@@ -0,0 +1,796 @@
|
|||||||
|
/*
|
||||||
|
* stream.c: APIs for managing client streams
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009-2014 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
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "stream.h"
|
||||||
|
#include "remote.h"
|
||||||
|
#include "viralloc.h"
|
||||||
|
#include "virlog.h"
|
||||||
|
#include "virnetserverclient.h"
|
||||||
|
#include "virerror.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_STREAMS
|
||||||
|
|
||||||
|
VIR_LOG_INIT("daemon.stream");
|
||||||
|
|
||||||
|
struct daemonClientStream {
|
||||||
|
daemonClientPrivatePtr priv;
|
||||||
|
int refs;
|
||||||
|
|
||||||
|
virNetServerProgramPtr prog;
|
||||||
|
|
||||||
|
virStreamPtr st;
|
||||||
|
int procedure;
|
||||||
|
unsigned int serial;
|
||||||
|
|
||||||
|
bool recvEOF;
|
||||||
|
bool closed;
|
||||||
|
|
||||||
|
int filterID;
|
||||||
|
|
||||||
|
virNetMessagePtr rx;
|
||||||
|
bool tx;
|
||||||
|
|
||||||
|
daemonClientStreamPtr next;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
daemonStreamHandleWrite(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream);
|
||||||
|
static int
|
||||||
|
daemonStreamHandleRead(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream);
|
||||||
|
static int
|
||||||
|
daemonStreamHandleFinish(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
virNetMessagePtr msg);
|
||||||
|
static int
|
||||||
|
daemonStreamHandleAbort(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
virNetMessagePtr msg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
daemonStreamUpdateEvents(daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
int newEvents = 0;
|
||||||
|
if (stream->closed)
|
||||||
|
return;
|
||||||
|
if (stream->rx)
|
||||||
|
newEvents |= VIR_STREAM_EVENT_WRITABLE;
|
||||||
|
if (stream->tx && !stream->recvEOF)
|
||||||
|
newEvents |= VIR_STREAM_EVENT_READABLE;
|
||||||
|
|
||||||
|
virStreamEventUpdateCallback(stream->st, newEvents);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Invoked when an outgoing data packet message has been fully sent.
|
||||||
|
* This simply re-enables TX of further data.
|
||||||
|
*
|
||||||
|
* The idea is to stop the daemon growing without bound due to
|
||||||
|
* fast stream, but slow client
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
daemonStreamMessageFinished(virNetMessagePtr msg,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
daemonClientStream *stream = opaque;
|
||||||
|
VIR_DEBUG("stream=%p proc=%d serial=%u",
|
||||||
|
stream, msg->header.proc, msg->header.serial);
|
||||||
|
|
||||||
|
stream->tx = true;
|
||||||
|
daemonStreamUpdateEvents(stream);
|
||||||
|
|
||||||
|
daemonFreeClientStream(NULL, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback that gets invoked when a stream becomes writable/readable
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
daemonStreamEvent(virStreamPtr st, int events, void *opaque)
|
||||||
|
{
|
||||||
|
virNetServerClientPtr client = opaque;
|
||||||
|
daemonClientStream *stream;
|
||||||
|
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
virMutexLock(&priv->lock);
|
||||||
|
|
||||||
|
stream = priv->streams;
|
||||||
|
while (stream) {
|
||||||
|
if (stream->st == st)
|
||||||
|
break;
|
||||||
|
stream = stream->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stream) {
|
||||||
|
VIR_WARN("event for client=%p stream st=%p, but missing stream state", client, st);
|
||||||
|
virStreamEventRemoveCallback(st);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("st=%p events=%d EOF=%d closed=%d", st, events, stream->recvEOF, stream->closed);
|
||||||
|
|
||||||
|
if (!stream->closed &&
|
||||||
|
(events & VIR_STREAM_EVENT_WRITABLE)) {
|
||||||
|
if (daemonStreamHandleWrite(client, stream) < 0) {
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stream->closed && !stream->recvEOF &&
|
||||||
|
(events & (VIR_STREAM_EVENT_READABLE))) {
|
||||||
|
events = events & ~(VIR_STREAM_EVENT_READABLE);
|
||||||
|
if (daemonStreamHandleRead(client, stream) < 0) {
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
/* If we detected EOF during read processing,
|
||||||
|
* then clear hangup/error conditions, since
|
||||||
|
* we want the client to see the EOF message
|
||||||
|
* we just sent them
|
||||||
|
*/
|
||||||
|
if (stream->recvEOF)
|
||||||
|
events = events & ~(VIR_STREAM_EVENT_HANGUP |
|
||||||
|
VIR_STREAM_EVENT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we have a completion/abort message, always process it */
|
||||||
|
if (stream->rx) {
|
||||||
|
virNetMessagePtr msg = stream->rx;
|
||||||
|
switch (msg->header.status) {
|
||||||
|
case VIR_NET_CONTINUE:
|
||||||
|
/* nada */
|
||||||
|
break;
|
||||||
|
case VIR_NET_OK:
|
||||||
|
virNetMessageQueueServe(&stream->rx);
|
||||||
|
if (daemonStreamHandleFinish(client, stream, msg) < 0) {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VIR_NET_ERROR:
|
||||||
|
default:
|
||||||
|
virNetMessageQueueServe(&stream->rx);
|
||||||
|
if (daemonStreamHandleAbort(client, stream, msg) < 0) {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* If we got HANGUP, we need to only send an empty
|
||||||
|
* packet so the client sees an EOF and cleans up
|
||||||
|
*/
|
||||||
|
if (!stream->closed && !stream->recvEOF &&
|
||||||
|
(events & VIR_STREAM_EVENT_HANGUP)) {
|
||||||
|
virNetMessagePtr msg;
|
||||||
|
events &= ~(VIR_STREAM_EVENT_HANGUP);
|
||||||
|
stream->tx = false;
|
||||||
|
stream->recvEOF = true;
|
||||||
|
if (!(msg = virNetMessageNew(false))) {
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
msg->cb = daemonStreamMessageFinished;
|
||||||
|
msg->opaque = stream;
|
||||||
|
stream->refs++;
|
||||||
|
if (virNetServerProgramSendStreamData(remoteProgram,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial,
|
||||||
|
"", 0) < 0) {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stream->closed &&
|
||||||
|
(events & (VIR_STREAM_EVENT_ERROR | VIR_STREAM_EVENT_HANGUP))) {
|
||||||
|
int ret;
|
||||||
|
virNetMessagePtr msg;
|
||||||
|
virNetMessageError rerr;
|
||||||
|
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
virStreamAbort(stream->st);
|
||||||
|
if (events & VIR_STREAM_EVENT_HANGUP)
|
||||||
|
virReportError(VIR_ERR_RPC,
|
||||||
|
"%s", _("stream had unexpected termination"));
|
||||||
|
else
|
||||||
|
virReportError(VIR_ERR_RPC,
|
||||||
|
"%s", _("stream had I/O failure"));
|
||||||
|
|
||||||
|
msg = virNetMessageNew(false);
|
||||||
|
if (!msg) {
|
||||||
|
ret = -1;
|
||||||
|
} else {
|
||||||
|
ret = virNetServerProgramSendStreamError(remoteProgram,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
&rerr,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial);
|
||||||
|
}
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
if (ret < 0)
|
||||||
|
virNetServerClientClose(client);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream->closed) {
|
||||||
|
daemonRemoveClientStream(client, stream);
|
||||||
|
} else {
|
||||||
|
daemonStreamUpdateEvents(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virMutexUnlock(&priv->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @client: a locked client object
|
||||||
|
*
|
||||||
|
* Invoked by the main loop when filtering incoming messages.
|
||||||
|
*
|
||||||
|
* Returns 1 if the message was processed, 0 if skipped,
|
||||||
|
* -1 on fatal client error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||||
|
virNetMessagePtr msg,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
daemonClientStream *stream = opaque;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
virMutexLock(&stream->priv->lock);
|
||||||
|
|
||||||
|
if (msg->header.type != VIR_NET_STREAM)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!virNetServerProgramMatches(stream->prog, msg))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (msg->header.proc != stream->procedure ||
|
||||||
|
msg->header.serial != stream->serial)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
VIR_DEBUG("Incoming client=%p, rx=%p, serial=%u, proc=%d, status=%d",
|
||||||
|
client, stream->rx, msg->header.proc,
|
||||||
|
msg->header.serial, msg->header.status);
|
||||||
|
|
||||||
|
virNetMessageQueuePush(&stream->rx, msg);
|
||||||
|
daemonStreamUpdateEvents(stream);
|
||||||
|
ret = 1;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virMutexUnlock(&stream->priv->lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @conn: a connection object to associate the stream with
|
||||||
|
* @header: the method call to associate with the stream
|
||||||
|
*
|
||||||
|
* Creates a new stream for this conn
|
||||||
|
*
|
||||||
|
* Returns a new stream object, or NULL upon OOM
|
||||||
|
*/
|
||||||
|
daemonClientStream *
|
||||||
|
daemonCreateClientStream(virNetServerClientPtr client,
|
||||||
|
virStreamPtr st,
|
||||||
|
virNetServerProgramPtr prog,
|
||||||
|
virNetMessageHeaderPtr header)
|
||||||
|
{
|
||||||
|
daemonClientStream *stream;
|
||||||
|
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
||||||
|
client, header->proc, header->serial, st);
|
||||||
|
|
||||||
|
if (VIR_ALLOC(stream) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
stream->refs = 1;
|
||||||
|
stream->priv = priv;
|
||||||
|
stream->prog = virObjectRef(prog);
|
||||||
|
stream->procedure = header->proc;
|
||||||
|
stream->serial = header->serial;
|
||||||
|
stream->filterID = -1;
|
||||||
|
stream->st = st;
|
||||||
|
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @stream: an unused client stream
|
||||||
|
*
|
||||||
|
* Frees the memory associated with this inactive client
|
||||||
|
* stream
|
||||||
|
*/
|
||||||
|
int daemonFreeClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
virNetMessagePtr msg;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!stream)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
stream->refs--;
|
||||||
|
if (stream->refs)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
VIR_DEBUG("client=%p, proc=%d, serial=%u",
|
||||||
|
client, stream->procedure, stream->serial);
|
||||||
|
|
||||||
|
virObjectUnref(stream->prog);
|
||||||
|
|
||||||
|
msg = stream->rx;
|
||||||
|
while (msg) {
|
||||||
|
virNetMessagePtr tmp = msg->next;
|
||||||
|
if (client) {
|
||||||
|
/* Send a dummy reply to free up 'msg' & unblock client rx */
|
||||||
|
virNetMessageClear(msg);
|
||||||
|
msg->header.type = VIR_NET_REPLY;
|
||||||
|
if (virNetServerClientSendMessage(client, msg) < 0) {
|
||||||
|
virNetServerClientImmediateClose(client);
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
}
|
||||||
|
msg = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
virObjectUnref(stream->st);
|
||||||
|
VIR_FREE(stream);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @client: a locked client to add the stream to
|
||||||
|
* @stream: a stream to add
|
||||||
|
*/
|
||||||
|
int daemonAddClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
bool transmit)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p, transmit=%d",
|
||||||
|
client, stream->procedure, stream->serial, stream->st, transmit);
|
||||||
|
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||||
|
|
||||||
|
if (stream->filterID != -1) {
|
||||||
|
VIR_WARN("Filter already added to client %p", client);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virStreamEventAddCallback(stream->st, 0,
|
||||||
|
daemonStreamEvent, client,
|
||||||
|
virObjectFreeCallback) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
virObjectRef(client);
|
||||||
|
|
||||||
|
if ((stream->filterID = virNetServerClientAddFilter(client,
|
||||||
|
daemonStreamFilter,
|
||||||
|
stream)) < 0) {
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transmit)
|
||||||
|
stream->tx = true;
|
||||||
|
|
||||||
|
virMutexLock(&priv->lock);
|
||||||
|
stream->next = priv->streams;
|
||||||
|
priv->streams = stream;
|
||||||
|
|
||||||
|
daemonStreamUpdateEvents(stream);
|
||||||
|
|
||||||
|
virMutexUnlock(&priv->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @client: a locked client object
|
||||||
|
* @stream: an inactive, closed stream object
|
||||||
|
*
|
||||||
|
* Removes a stream from the list of active streams for the client
|
||||||
|
*
|
||||||
|
* Returns 0 if the stream was removd, -1 if it doesn't exist
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
daemonRemoveClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
||||||
|
client, stream->procedure, stream->serial, stream->st);
|
||||||
|
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||||
|
daemonClientStream *curr = priv->streams;
|
||||||
|
daemonClientStream *prev = NULL;
|
||||||
|
|
||||||
|
if (stream->filterID != -1) {
|
||||||
|
virNetServerClientRemoveFilter(client,
|
||||||
|
stream->filterID);
|
||||||
|
stream->filterID = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stream->closed) {
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
virStreamAbort(stream->st);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (curr) {
|
||||||
|
if (curr == stream) {
|
||||||
|
if (prev)
|
||||||
|
prev->next = curr->next;
|
||||||
|
else
|
||||||
|
priv->streams = curr->next;
|
||||||
|
return daemonFreeClientStream(client, stream);
|
||||||
|
}
|
||||||
|
prev = curr;
|
||||||
|
curr = curr->next;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
daemonRemoveAllClientStreams(daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
daemonClientStream *tmp;
|
||||||
|
|
||||||
|
VIR_DEBUG("stream=%p", stream);
|
||||||
|
|
||||||
|
while (stream) {
|
||||||
|
tmp = stream->next;
|
||||||
|
|
||||||
|
if (!stream->closed) {
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
virStreamAbort(stream->st);
|
||||||
|
}
|
||||||
|
|
||||||
|
daemonFreeClientStream(NULL, stream);
|
||||||
|
|
||||||
|
VIR_DEBUG("next stream=%p", tmp);
|
||||||
|
stream = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns:
|
||||||
|
* -1 if fatal error occurred
|
||||||
|
* 0 if message was fully processed
|
||||||
|
* 1 if message is still being processed
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamHandleWriteData(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
virNetMessagePtr msg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u, len=%zu, offset=%zu",
|
||||||
|
client, stream, msg->header.proc, msg->header.serial,
|
||||||
|
msg->bufferLength, msg->bufferOffset);
|
||||||
|
|
||||||
|
ret = virStreamSend(stream->st,
|
||||||
|
msg->buffer + msg->bufferOffset,
|
||||||
|
msg->bufferLength - msg->bufferOffset);
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
msg->bufferOffset += ret;
|
||||||
|
|
||||||
|
/* Partial write, so indicate we have more todo later */
|
||||||
|
if (msg->bufferOffset < msg->bufferLength)
|
||||||
|
return 1;
|
||||||
|
} else if (ret == -2) {
|
||||||
|
/* Blocking, so indicate we have more todo later */
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
virNetMessageError rerr;
|
||||||
|
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
|
||||||
|
VIR_INFO("Stream send failed");
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
virStreamAbort(stream->st);
|
||||||
|
|
||||||
|
return virNetServerProgramSendReplyError(stream->prog,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
&rerr,
|
||||||
|
&msg->header);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process a finish handshake from the client.
|
||||||
|
*
|
||||||
|
* Returns a VIR_NET_OK confirmation if successful, or a VIR_NET_ERROR
|
||||||
|
* if there was a stream error
|
||||||
|
*
|
||||||
|
* Returns 0 if successfully sent RPC reply, -1 upon fatal error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamHandleFinish(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
virNetMessagePtr msg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
||||||
|
client, stream, msg->header.proc, msg->header.serial);
|
||||||
|
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
ret = virStreamFinish(stream->st);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
virNetMessageError rerr;
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
return virNetServerProgramSendReplyError(stream->prog,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
&rerr,
|
||||||
|
&msg->header);
|
||||||
|
} else {
|
||||||
|
/* Send zero-length confirm */
|
||||||
|
return virNetServerProgramSendStreamData(stream->prog,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial,
|
||||||
|
NULL, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process an abort request from the client.
|
||||||
|
*
|
||||||
|
* Returns 0 if successfully aborted, -1 upon error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamHandleAbort(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
virNetMessagePtr msg)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
||||||
|
client, stream, msg->header.proc, msg->header.serial);
|
||||||
|
int ret;
|
||||||
|
bool raise_error = false;
|
||||||
|
|
||||||
|
stream->closed = true;
|
||||||
|
virStreamEventRemoveCallback(stream->st);
|
||||||
|
ret = virStreamAbort(stream->st);
|
||||||
|
|
||||||
|
if (msg->header.status == VIR_NET_ERROR) {
|
||||||
|
VIR_INFO("stream aborted at client request");
|
||||||
|
raise_error = (ret < 0);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_RPC,
|
||||||
|
_("stream aborted with unexpected status %d"),
|
||||||
|
msg->header.status);
|
||||||
|
raise_error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (raise_error) {
|
||||||
|
virNetMessageError rerr;
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
return virNetServerProgramSendReplyError(remoteProgram,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
&rerr,
|
||||||
|
&msg->header);
|
||||||
|
} else {
|
||||||
|
/* Send zero-length confirm */
|
||||||
|
return virNetServerProgramSendStreamData(stream->prog,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial,
|
||||||
|
NULL, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when the stream is signalled has being able to accept
|
||||||
|
* data writes. Will process all pending incoming messages
|
||||||
|
* until they're all gone, or I/O blocks
|
||||||
|
*
|
||||||
|
* Returns 0 on success, or -1 upon fatal error
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamHandleWrite(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("client=%p, stream=%p", client, stream);
|
||||||
|
|
||||||
|
while (stream->rx && !stream->closed) {
|
||||||
|
virNetMessagePtr msg = stream->rx;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (msg->header.status) {
|
||||||
|
case VIR_NET_OK:
|
||||||
|
ret = daemonStreamHandleFinish(client, stream, msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_NET_CONTINUE:
|
||||||
|
ret = daemonStreamHandleWriteData(client, stream, msg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_NET_ERROR:
|
||||||
|
default:
|
||||||
|
ret = daemonStreamHandleAbort(client, stream, msg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret > 0)
|
||||||
|
break; /* still processing data from msg */
|
||||||
|
|
||||||
|
virNetMessageQueueServe(&stream->rx);
|
||||||
|
if (ret < 0) {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
virNetServerClientImmediateClose(client);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 'CONTINUE' messages don't send a reply (unless error
|
||||||
|
* occurred), so to release the 'msg' object we need to
|
||||||
|
* send a fake zero-length reply. Nothing actually gets
|
||||||
|
* onto the wire, but this causes the client to reset
|
||||||
|
* its active request count / throttling
|
||||||
|
*/
|
||||||
|
if (msg->header.status == VIR_NET_CONTINUE) {
|
||||||
|
virNetMessageClear(msg);
|
||||||
|
msg->header.type = VIR_NET_REPLY;
|
||||||
|
if (virNetServerClientSendMessage(client, msg) < 0) {
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
virNetServerClientImmediateClose(client);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Invoked when a stream is signalled as having data
|
||||||
|
* available to read. This reads up to one message
|
||||||
|
* worth of data, and then queues that for transmission
|
||||||
|
* to the client.
|
||||||
|
*
|
||||||
|
* Returns 0 if data was queued for TX, or a error RPC
|
||||||
|
* was sent, or -1 on fatal error, indicating client should
|
||||||
|
* be killed
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
daemonStreamHandleRead(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream)
|
||||||
|
{
|
||||||
|
virNetMessagePtr msg = NULL;
|
||||||
|
virNetMessageError rerr;
|
||||||
|
char *buffer;
|
||||||
|
size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX;
|
||||||
|
int ret = -1;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
|
||||||
|
client, stream, stream->tx, stream->closed);
|
||||||
|
|
||||||
|
/* We might have had an event pending before we shut
|
||||||
|
* down the stream, so if we're marked as closed,
|
||||||
|
* then do nothing
|
||||||
|
*/
|
||||||
|
if (stream->closed)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Shouldn't ever be called unless we're marked able to
|
||||||
|
* transmit, but doesn't hurt to check */
|
||||||
|
if (!stream->tx)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memset(&rerr, 0, sizeof(rerr));
|
||||||
|
|
||||||
|
if (VIR_ALLOC_N(buffer, bufferLen) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!(msg = virNetMessageNew(false)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = virStreamRecv(stream->st, buffer, bufferLen);
|
||||||
|
if (rv == -2) {
|
||||||
|
/* Should never get this, since we're only called when we know
|
||||||
|
* we're readable, but hey things change... */
|
||||||
|
} else if (rv < 0) {
|
||||||
|
if (virNetServerProgramSendStreamError(remoteProgram,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
&rerr,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
msg = NULL;
|
||||||
|
} else {
|
||||||
|
stream->tx = false;
|
||||||
|
if (rv == 0)
|
||||||
|
stream->recvEOF = true;
|
||||||
|
|
||||||
|
msg->cb = daemonStreamMessageFinished;
|
||||||
|
msg->opaque = stream;
|
||||||
|
stream->refs++;
|
||||||
|
if (virNetServerProgramSendStreamData(remoteProgram,
|
||||||
|
client,
|
||||||
|
msg,
|
||||||
|
stream->procedure,
|
||||||
|
stream->serial,
|
||||||
|
buffer, rv) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
msg = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(buffer);
|
||||||
|
virNetMessageFree(msg);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
49
daemon/stream.h
Normal file
49
daemon/stream.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* stream.h: APIs for managing client streams
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __LIBVIRTD_STREAM_H__
|
||||||
|
# define __LIBVIRTD_STREAM_H__
|
||||||
|
|
||||||
|
# include "libvirtd.h"
|
||||||
|
|
||||||
|
daemonClientStream *
|
||||||
|
daemonCreateClientStream(virNetServerClientPtr client,
|
||||||
|
virStreamPtr st,
|
||||||
|
virNetServerProgramPtr prog,
|
||||||
|
virNetMessageHeaderPtr hdr);
|
||||||
|
|
||||||
|
int daemonFreeClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream);
|
||||||
|
|
||||||
|
int daemonAddClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream,
|
||||||
|
bool transmit);
|
||||||
|
|
||||||
|
int
|
||||||
|
daemonRemoveClientStream(virNetServerClientPtr client,
|
||||||
|
daemonClientStream *stream);
|
||||||
|
|
||||||
|
void
|
||||||
|
daemonRemoveAllClientStreams(daemonClientStream *stream);
|
||||||
|
|
||||||
|
#endif /* __LIBVIRTD_STREAM_H__ */
|
||||||
@@ -42,6 +42,7 @@ module Test_libvirtd =
|
|||||||
{ "min_workers" = "5" }
|
{ "min_workers" = "5" }
|
||||||
{ "max_workers" = "20" }
|
{ "max_workers" = "20" }
|
||||||
{ "prio_workers" = "5" }
|
{ "prio_workers" = "5" }
|
||||||
|
{ "max_requests" = "20" }
|
||||||
{ "max_client_requests" = "5" }
|
{ "max_client_requests" = "5" }
|
||||||
{ "admin_min_workers" = "1" }
|
{ "admin_min_workers" = "1" }
|
||||||
{ "admin_max_workers" = "5" }
|
{ "admin_max_workers" = "5" }
|
||||||
@@ -62,4 +63,3 @@ module Test_libvirtd =
|
|||||||
{ "admin_keepalive_required" = "1" }
|
{ "admin_keepalive_required" = "1" }
|
||||||
{ "admin_keepalive_interval" = "5" }
|
{ "admin_keepalive_interval" = "5" }
|
||||||
{ "admin_keepalive_count" = "5" }
|
{ "admin_keepalive_count" = "5" }
|
||||||
{ "ovs_timeout" = "5" }
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>404 page not found</h1>
|
<h1>404 page not found</h1>
|
||||||
@@ -9,11 +9,16 @@
|
|||||||
page you were looking for. You might want to try
|
page you were looking for. You might want to try
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>going back to the <a href="https://libvirt.org/">home page</a> to find
|
<li>going back to the <a href="http://libvirt.org/">home page</a> to find
|
||||||
a collection of links to interesting pages on this site</li>
|
a collection of links to interesting pages on this site</li>
|
||||||
<li>using the search box at the top right corner of the screen to
|
<li>using the search box at the top right corner of the screen to
|
||||||
locate the content on this site or mailing list archives</li>
|
locate the content on this site or mailing list archives</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p class="image">
|
||||||
|
<img src="/libvirtLogo404.png" alt="libvirt Logo"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
209
docs/Makefile.am
209
docs/Makefile.am
@@ -16,6 +16,11 @@
|
|||||||
## License along with this library. If not, see
|
## License along with this library. If not, see
|
||||||
## <http://www.gnu.org/licenses/>.
|
## <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
PERL = perl
|
||||||
|
|
||||||
|
# The directory containing the source code (if it contains documentation).
|
||||||
|
DOC_SOURCE_DIR=../src
|
||||||
|
|
||||||
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
|
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
|
||||||
|
|
||||||
apihtml = \
|
apihtml = \
|
||||||
@@ -52,23 +57,8 @@ devhelphtml = \
|
|||||||
css = \
|
css = \
|
||||||
generic.css \
|
generic.css \
|
||||||
libvirt.css \
|
libvirt.css \
|
||||||
mobile.css \
|
|
||||||
main.css
|
main.css
|
||||||
|
|
||||||
fonts = \
|
|
||||||
fonts/LICENSE.md \
|
|
||||||
fonts/stylesheet.css \
|
|
||||||
fonts/overpass-bold-italic.woff \
|
|
||||||
fonts/overpass-bold.woff \
|
|
||||||
fonts/overpass-italic.woff \
|
|
||||||
fonts/overpass-light-italic.woff \
|
|
||||||
fonts/overpass-light.woff \
|
|
||||||
fonts/overpass-mono-bold.woff \
|
|
||||||
fonts/overpass-mono-light.woff \
|
|
||||||
fonts/overpass-mono-regular.woff \
|
|
||||||
fonts/overpass-mono-semibold.woff \
|
|
||||||
fonts/overpass-regular.woff
|
|
||||||
|
|
||||||
devhelppng = \
|
devhelppng = \
|
||||||
devhelp/home.png \
|
devhelp/home.png \
|
||||||
devhelp/left.png \
|
devhelp/left.png \
|
||||||
@@ -79,30 +69,17 @@ devhelpcss = devhelp/style.css
|
|||||||
|
|
||||||
devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
|
devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
|
||||||
|
|
||||||
logofiles = \
|
|
||||||
logos/logo-base.svg \
|
|
||||||
logos/logo-square.svg \
|
|
||||||
logos/logo-square-powered.svg \
|
|
||||||
logos/logo-banner-dark.svg \
|
|
||||||
logos/logo-banner-light.svg \
|
|
||||||
logos/logo-square-96.png \
|
|
||||||
logos/logo-square-128.png \
|
|
||||||
logos/logo-square-192.png \
|
|
||||||
logos/logo-square-256.png \
|
|
||||||
logos/logo-square-powered-96.png \
|
|
||||||
logos/logo-square-powered-128.png \
|
|
||||||
logos/logo-square-powered-192.png \
|
|
||||||
logos/logo-square-powered-256.png \
|
|
||||||
logos/logo-banner-dark-256.png \
|
|
||||||
logos/logo-banner-dark-800.png \
|
|
||||||
logos/logo-banner-light-256.png \
|
|
||||||
logos/logo-banner-light-800.png
|
|
||||||
|
|
||||||
png = \
|
png = \
|
||||||
32favicon.png \
|
32favicon.png \
|
||||||
|
libvirt-header-bg.png \
|
||||||
|
libvirt-header-logo.png \
|
||||||
|
libvirtLogo.png \
|
||||||
|
libvirt-net-logical.png \
|
||||||
|
libvirt-net-physical.png \
|
||||||
libvirt-daemon-arch.png \
|
libvirt-daemon-arch.png \
|
||||||
libvirt-driver-arch.png \
|
libvirt-driver-arch.png \
|
||||||
libvirt-object-model.png \
|
libvirt-object-model.png \
|
||||||
|
madeWith.png \
|
||||||
migration-managed-direct.png \
|
migration-managed-direct.png \
|
||||||
migration-managed-p2p.png \
|
migration-managed-p2p.png \
|
||||||
migration-native.png \
|
migration-native.png \
|
||||||
@@ -118,14 +95,15 @@ internals_html_in = \
|
|||||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
|
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
|
||||||
internals_html = $(internals_html_in:%.html.in=%.html)
|
internals_html = $(internals_html_in:%.html.in=%.html)
|
||||||
|
|
||||||
# Since we ship pre-built html in the tarball, we must also
|
# todo.html is special - it is shipped in the tarball, but we
|
||||||
# ship the sources, even when those sources are themselves
|
# have a dedicated 'todo' target to rebuild it from a proper
|
||||||
# generated.
|
# config file, all other users are able to build it locally.
|
||||||
# Generate hvsupport.html and news.html first, since they take one extra step.
|
# For all other files, since we ship pre-built html in the
|
||||||
dot_html_in = \
|
# tarball, we must also ship the sources, even when those
|
||||||
hvsupport.html.in \
|
# sources are themselves generated.
|
||||||
news.html.in \
|
dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) \
|
||||||
$(notdir $(wildcard $(srcdir)/*.html.in))
|
todo.html.in \
|
||||||
|
hvsupport.html.in
|
||||||
dot_html = $(dot_html_in:%.html.in=%.html)
|
dot_html = $(dot_html_in:%.html.in=%.html)
|
||||||
|
|
||||||
dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
|
dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
|
||||||
@@ -158,6 +136,8 @@ api_DATA = \
|
|||||||
libvirt-admin-api.xml
|
libvirt-admin-api.xml
|
||||||
|
|
||||||
fig = \
|
fig = \
|
||||||
|
libvirt-net-logical.fig \
|
||||||
|
libvirt-net-physical.fig \
|
||||||
libvirt-daemon-arch.fig \
|
libvirt-daemon-arch.fig \
|
||||||
libvirt-driver-arch.fig \
|
libvirt-driver-arch.fig \
|
||||||
libvirt-object-model.fig \
|
libvirt-object-model.fig \
|
||||||
@@ -172,15 +152,15 @@ schema_DATA = $(wildcard $(srcdir)/schemas/*.rng)
|
|||||||
|
|
||||||
EXTRA_DIST= \
|
EXTRA_DIST= \
|
||||||
apibuild.py genaclperms.pl \
|
apibuild.py genaclperms.pl \
|
||||||
site.xsl subsite.xsl newapi.xsl page.xsl \
|
site.xsl newapi.xsl news.xsl page.xsl \
|
||||||
wrapstring.xsl \
|
hacking1.xsl hacking2.xsl wrapstring.xsl \
|
||||||
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
|
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
|
||||||
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
|
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
|
||||||
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
|
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
|
||||||
$(logofiles) $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
|
$(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
|
||||||
$(internals_html_in) $(internals_html) $(fonts) \
|
$(internals_html_in) $(internals_html) \
|
||||||
aclperms.htmlinc \
|
sitemap.html.in aclperms.htmlinc \
|
||||||
hvsupport.pl \
|
todo.pl hvsupport.pl todo.cfg-example \
|
||||||
$(schema_DATA)
|
$(schema_DATA)
|
||||||
|
|
||||||
acl_generated = aclperms.htmlinc
|
acl_generated = aclperms.htmlinc
|
||||||
@@ -197,13 +177,6 @@ MAINTAINERCLEANFILES = \
|
|||||||
$(addprefix $(srcdir)/,$(dot_php)) \
|
$(addprefix $(srcdir)/,$(dot_php)) \
|
||||||
$(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc
|
$(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc
|
||||||
|
|
||||||
timestamp="$(shell if test -n "$$SOURCE_DATE_EPOCH"; \
|
|
||||||
then \
|
|
||||||
date -u --date="@$$SOURCE_DATE_EPOCH"; \
|
|
||||||
else \
|
|
||||||
date -u; \
|
|
||||||
fi)"
|
|
||||||
|
|
||||||
all-am: web
|
all-am: web
|
||||||
|
|
||||||
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
|
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
|
||||||
@@ -214,6 +187,24 @@ admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
|||||||
web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \
|
web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \
|
||||||
$(dot_php)
|
$(dot_php)
|
||||||
|
|
||||||
|
todo.html.in: todo.pl
|
||||||
|
if [ -f todo.cfg ]; then \
|
||||||
|
echo "Generating $@"; \
|
||||||
|
$(PERL) $< > $@ \
|
||||||
|
|| { rm $@ && exit 1; }; \
|
||||||
|
else \
|
||||||
|
echo "Stubbing $@"; \
|
||||||
|
printf "%s\n" \
|
||||||
|
"<html xmlns=\"http://www.w3.org/1999/xhtml\">" \
|
||||||
|
"<body>" \
|
||||||
|
"<h1>Todo list unavailable: no config file</h1>" \
|
||||||
|
"</body></html>" > $@ ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
todo:
|
||||||
|
rm -f todo.html.in
|
||||||
|
$(MAKE) todo.html
|
||||||
|
|
||||||
hvsupport.html: $(srcdir)/hvsupport.html.in
|
hvsupport.html: $(srcdir)/hvsupport.html.in
|
||||||
|
|
||||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
||||||
@@ -223,33 +214,16 @@ $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
|||||||
$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \
|
$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \
|
||||||
|| { rm $@ && exit 1; }
|
|| { rm $@ && exit 1; }
|
||||||
|
|
||||||
# xsltproc seems to add the xmlns="" attribute to random output elements:
|
.PHONY: todo
|
||||||
# use sed to strip it out, as leaving it there triggers XML errors during
|
|
||||||
# further transformation steps
|
|
||||||
news.html.in: \
|
|
||||||
$(srcdir)/news.xml \
|
|
||||||
$(srcdir)/news-html.xsl
|
|
||||||
$(AM_V_GEN)$(XSLTPROC) --nonet \
|
|
||||||
$(srcdir)/news-html.xsl \
|
|
||||||
$(srcdir)/news.xml \
|
|
||||||
>$@-tmp \
|
|
||||||
|| { rm -f $@-tmp; exit 1; }; \
|
|
||||||
sed 's/ xmlns=""//g' $@-tmp >$@ \
|
|
||||||
|| { rm -f $@-tmp; exit 1; }; \
|
|
||||||
rm -f $@-tmp
|
|
||||||
EXTRA_DIST += \
|
|
||||||
$(srcdir)/news.xml \
|
|
||||||
$(srcdir)/news.rng \
|
|
||||||
$(srcdir)/news-html.xsl
|
|
||||||
MAINTAINERCLEANFILES += \
|
|
||||||
$(srcdir)/news.html.in
|
|
||||||
|
|
||||||
%.png: %.fig
|
%.png: %.fig
|
||||||
convert -rotate 90 $< $@
|
convert -rotate 90 $< $@
|
||||||
|
|
||||||
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
|
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
|
||||||
$(acl_generated)
|
sitemap.html.in $(acl_generated)
|
||||||
$(AM_V_GEN)name=`echo $@ | sed -e 's/.tmp//'`; \
|
@if [ -x $(XSLTPROC) ] ; then \
|
||||||
|
echo "Generating $@"; \
|
||||||
|
name=`echo $@ | sed -e 's/.tmp//'`; \
|
||||||
dir=`dirname $@` ; \
|
dir=`dirname $@` ; \
|
||||||
if test "$$dir" = "."; \
|
if test "$$dir" = "."; \
|
||||||
then \
|
then \
|
||||||
@@ -258,40 +232,52 @@ MAINTAINERCLEANFILES += \
|
|||||||
$(MKDIR_P) $$dir; \
|
$(MKDIR_P) $$dir; \
|
||||||
style=subsite.xsl; \
|
style=subsite.xsl; \
|
||||||
fi; \
|
fi; \
|
||||||
$(XSLTPROC) --stringparam pagename $$name \
|
$(XSLTPROC) --stringparam pagename $$name --nonet \
|
||||||
--stringparam timestamp $(timestamp) --nonet \
|
|
||||||
$(top_srcdir)/docs/$$style $< > $@ \
|
$(top_srcdir)/docs/$$style $< > $@ \
|
||||||
|| { rm $@ && exit 1; }
|
|| { rm $@ && exit 1; }; fi
|
||||||
|
|
||||||
%.html: %.html.tmp
|
%.html: %.html.tmp
|
||||||
$(AM_V_GEN)$(XMLLINT) --nonet --format $< > $(srcdir)/$@ \
|
@if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
|
||||||
|| { rm $(srcdir)/$@ && exit 1; }
|
if $(XMLCATALOG) '$(XML_CATALOG_FILE)' \
|
||||||
|
"-//W3C//DTD XHTML 1.0 Strict//EN" > /dev/null ; then \
|
||||||
|
echo "Validating $@" ; \
|
||||||
|
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
|
||||||
|
|
||||||
%.php.tmp: %.php.in site.xsl page.xsl
|
%.php.tmp: %.php.in site.xsl page.xsl sitemap.html.in
|
||||||
$(AM_V_GEN)$(XSLTPROC) --stringparam pagename $(@:.tmp=) \
|
@if [ -x $(XSLTPROC) ] ; then \
|
||||||
--stringparam timestamp $(timestamp) --nonet \
|
echo "Generating $@"; \
|
||||||
|
$(XSLTPROC) --stringparam pagename $(@:.tmp=) --nonet \
|
||||||
$(top_srcdir)/docs/site.xsl $< > $@ \
|
$(top_srcdir)/docs/site.xsl $< > $@ \
|
||||||
|| { rm $@ && exit 1; }
|
|| { rm $@ && exit 1; }; fi
|
||||||
|
|
||||||
%.php: %.php.tmp %.php.code.in
|
%.php: %.php.tmp %.php.code.in
|
||||||
$(AM_V_GEN)sed \
|
@if [ -x $(XSLTPROC) ] ; then \
|
||||||
-e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
|
echo "Scripting $@"; \
|
||||||
|
sed -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
|
||||||
-e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
|
-e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
|
||||||
|| { rm $(srcdir)/$@ && exit 1; }
|
|| { rm $(srcdir)/$@ && exit 1; }; fi
|
||||||
|
|
||||||
$(apihtml_generated): html/index.html
|
$(apihtml_generated): html/index.html
|
||||||
|
|
||||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl $(APIBUILD_STAMP)
|
html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
|
||||||
$(AM_V_GEN)$(XSLTPROC) --nonet -o $(srcdir)/ \
|
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||||
|
$(XSLTPROC) --nonet -o $(srcdir)/ \
|
||||||
--stringparam builddir '$(abs_top_builddir)' \
|
--stringparam builddir '$(abs_top_builddir)' \
|
||||||
--stringparam timestamp $(timestamp) \
|
$(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi && \
|
||||||
$(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml && \
|
if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
|
||||||
$(XMLLINT) --nonet --noout $(srcdir)/html/*.html
|
if $(XMLCATALOG) '$(XML_CATALOG_FILE)' "-//W3C//DTD XHTML 1.0 Strict//EN" \
|
||||||
|
> /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
|
||||||
|
|
||||||
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
||||||
$(AM_V_GEN)$(XSLTPROC) --stringparam timestamp $(timestamp) \
|
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||||
--nonet -o $(srcdir)/devhelp/ \
|
$(XSLTPROC) --nonet -o $(srcdir)/devhelp/ \
|
||||||
$(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml
|
$(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml ; fi
|
||||||
|
|
||||||
|
|
||||||
python_generated_files = \
|
python_generated_files = \
|
||||||
@@ -334,16 +320,6 @@ $(APIBUILD_STAMP): $(srcdir)/apibuild.py \
|
|||||||
$(top_srcdir)/include/libvirt/libvirt-admin.h \
|
$(top_srcdir)/include/libvirt/libvirt-admin.h \
|
||||||
$(top_srcdir)/include/libvirt/virterror.h \
|
$(top_srcdir)/include/libvirt/virterror.h \
|
||||||
$(top_srcdir)/src/libvirt.c \
|
$(top_srcdir)/src/libvirt.c \
|
||||||
$(top_srcdir)/src/libvirt-domain-snapshot.c \
|
|
||||||
$(top_srcdir)/src/libvirt-domain.c \
|
|
||||||
$(top_srcdir)/src/libvirt-host.c \
|
|
||||||
$(top_srcdir)/src/libvirt-interface.c \
|
|
||||||
$(top_srcdir)/src/libvirt-network.c \
|
|
||||||
$(top_srcdir)/src/libvirt-nodedev.c \
|
|
||||||
$(top_srcdir)/src/libvirt-nwfilter.c \
|
|
||||||
$(top_srcdir)/src/libvirt-secret.c \
|
|
||||||
$(top_srcdir)/src/libvirt-storage.c \
|
|
||||||
$(top_srcdir)/src/libvirt-stream.c \
|
|
||||||
$(top_srcdir)/src/libvirt-lxc.c \
|
$(top_srcdir)/src/libvirt-lxc.c \
|
||||||
$(top_srcdir)/src/libvirt-qemu.c \
|
$(top_srcdir)/src/libvirt-qemu.c \
|
||||||
$(top_srcdir)/src/libvirt-admin.c \
|
$(top_srcdir)/src/libvirt-admin.c \
|
||||||
@@ -358,10 +334,11 @@ check-local: all
|
|||||||
dist-local: all
|
dist-local: all
|
||||||
|
|
||||||
clean-local:
|
clean-local:
|
||||||
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html html/*.html
|
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
|
||||||
|
|
||||||
maintainer-clean-local: clean-local
|
maintainer-clean-local: clean-local
|
||||||
rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
|
rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml \
|
||||||
|
todo.html.in
|
||||||
rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
|
rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
|
||||||
rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
|
rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
|
||||||
rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
||||||
@@ -373,9 +350,6 @@ install-data-local:
|
|||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
|
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
|
||||||
for f in $(css) $(dot_html) $(gif) $(png); do \
|
for f in $(css) $(dot_html) $(gif) $(png); do \
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR); done
|
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR); done
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/logos
|
|
||||||
for f in $(logofiles); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/logos; done
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html
|
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html
|
||||||
for h in $(apihtml); do \
|
for h in $(apihtml); do \
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done
|
$(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done
|
||||||
@@ -388,16 +362,10 @@ install-data-local:
|
|||||||
for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
|
$(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
|
||||||
done
|
done
|
||||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/fonts
|
$(INSTALL_DATA) $(srcdir)/libvirtLogo.png $(DESTDIR)$(pkgdatadir)
|
||||||
for f in $(fonts); do \
|
|
||||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/fonts; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-local:
|
uninstall-local:
|
||||||
for f in $(css) $(dot_html) $(gif) $(png) $(fonts); do \
|
for f in $(css) $(dot_html) $(gif) $(png); do \
|
||||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
|
||||||
done
|
|
||||||
for f in $(logofiles); do \
|
|
||||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||||
done
|
done
|
||||||
for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done
|
for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done
|
||||||
@@ -408,3 +376,4 @@ uninstall-local:
|
|||||||
for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
||||||
rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
||||||
done
|
done
|
||||||
|
rm -f $(DESTDIR)$(pkgdatadir)/libvirtLogo.png
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Client access control</h1>
|
<h1>Client access control</h1>
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="intro">Access control introduction</a></h2>
|
<h2><a name="intro">Access control introduction</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In a default configuration, the libvirtd daemon has three levels
|
In a default configuration, the libvirtd daemon has three levels
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<code>getattr</code> permission.
|
<code>getattr</code> permission.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="drivers">Access control drivers</a></h2>
|
<h2><a name="drivers">Access control drivers</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The access control framework is designed as a pluggable
|
The access control framework is designed as a pluggable
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
the libvirtd daemon be restarted.
|
the libvirtd daemon be restarted.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="perms">Objects and permissions</a></h2>
|
<h2><a name="perms">Objects and permissions</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Libvirt applies access control to all the main object
|
Libvirt applies access control to all the main object
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Polkit access control</h1>
|
<h1>Polkit access control</h1>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="intro">Introduction</a></h2>
|
<h2><a name="intro">Introduction</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A default install of libvirt will typically use
|
A default install of libvirt will typically use
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
object.
|
object.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="perms">Permission names</a></h2>
|
<h2><a name="perms">Permission names</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt <a href="acl.html#perms">object names and permission names</a>
|
The libvirt <a href="acl.html#perms">object names and permission names</a>
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
permissions default to deny access.
|
permissions default to deny access.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="attrs">Object identity attributes</a></h2>
|
<h2><a name="attrs">Object identity attributes</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
To allow polkit authorization rules to be written to match
|
To allow polkit authorization rules to be written to match
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
of object being checked
|
of object being checked
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="object_connect">virConnectPtr</a></h3>
|
<h3><a name="object_connect">virConnectPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_domain">virDomainPtr</a></h3>
|
<h3><a name="object_domain">virDomainPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_interface">virInterfacePtr</a></h3>
|
<h3><a name="object_interface">virInterfacePtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_network">virNetworkPtr</a></h3>
|
<h3><a name="object_network">virNetworkPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_node_device">virNodeDevicePtr</a></h3>
|
<h3><a name="object_node_device">virNodeDevicePtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -171,7 +171,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_nwfilter">virNWFilterPtr</a></h3>
|
<h3><a name="object_nwfilter">virNWFilterPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_secret">virSecretPtr</a></h3>
|
<h3><a name="object_secret">virSecretPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -224,14 +224,10 @@
|
|||||||
<td>secret_usage_target</td>
|
<td>secret_usage_target</td>
|
||||||
<td>Name of the associated iSCSI target, if any</td>
|
<td>Name of the associated iSCSI target, if any</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td>secret_usage_name</td>
|
|
||||||
<td>Name of the associated TLS secret, if any</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_storage_pool">virStoragePoolPtr</a></h3>
|
<h3><a name="object_storage_pool">virStoragePoolPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -255,7 +251,7 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<h3><a id="object_storage_vol">virStorageVolPtr</a></h3>
|
<h3><a name="object_storage_vol">virStorageVolPtr</a></h3>
|
||||||
<table class="acl">
|
<table class="acl">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -288,7 +284,7 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="user">User identity attributes</a></h2>
|
<h2><a name="user">User identity attributes</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
At this point in time, the only attribute provided by
|
At this point in time, the only attribute provided by
|
||||||
@@ -307,7 +303,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="checks">Writing access control policies</a></h2>
|
<h2><a name="checks">Writing access control policies</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If using versions of polkit prior to 0.106 then it is only
|
If using versions of polkit prior to 0.106 then it is only
|
||||||
@@ -334,9 +330,9 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
polkit.addRule(function(action, subject) {
|
polkit.addRule(function(action, subject) {
|
||||||
....logic to check 'action' and 'subject'...
|
....logic to check 'action' and 'subject'...
|
||||||
});
|
});
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -354,11 +350,11 @@ polkit.addRule(function(action, subject) {
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
See
|
See
|
||||||
<a href="https://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a>
|
<a href="http://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a>
|
||||||
for a more complex example.
|
for a more complex example.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="exconnect">Example: restricting ability to connect to drivers</a></h3>
|
<h3><a name="exconnect">Example: restricting ability to connect to drivers</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Consider a local user <code>berrange</code>
|
Consider a local user <code>berrange</code>
|
||||||
@@ -386,7 +382,7 @@ polkit.addRule(function(action, subject) {
|
|||||||
});
|
});
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="exdomain">Example: restricting access to a single domain</a></h3>
|
<h3><a name="exdomain">Example: restricting access to a single domain</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Consider a local user <code>berrange</code>
|
Consider a local user <code>berrange</code>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 16 KiB |
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>The libvirt API concepts</h1>
|
<h1>The libvirt API concepts</h1>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="Objects">Objects Exposed</a></h2>
|
<h2><a name="Objects">Objects Exposed</a></h2>
|
||||||
<p> As defined in the <a href="goals.html">goals section</a>, the libvirt
|
<p> As defined in the <a href="goals.html">goals section</a>, the libvirt
|
||||||
API is designed to expose all the resources needed to manage the
|
API is designed to expose all the resources needed to manage the
|
||||||
virtualization support of recent operating systems. The first object
|
virtualization support of recent operating systems. The first object
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
set of nodes.</p></li>
|
set of nodes.</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="Functions">Functions and Naming Conventions</a></h2>
|
<h2><a name="Functions">Functions and Naming Conventions</a></h2>
|
||||||
<p> The naming of the functions present in the library is usually
|
<p> The naming of the functions present in the library is usually
|
||||||
composed by a prefix describing the object associated to the function
|
composed by a prefix describing the object associated to the function
|
||||||
and a verb describing the action on that object.</p>
|
and a verb describing the action on that object.</p>
|
||||||
@@ -297,7 +297,7 @@
|
|||||||
<p> For more in-depth details of the storage related APIs see
|
<p> For more in-depth details of the storage related APIs see
|
||||||
<a href="storage.html">the storage management page</a>.
|
<a href="storage.html">the storage management page</a>.
|
||||||
</p>
|
</p>
|
||||||
<h2><a id="Drivers">The libvirt Drivers</a></h2>
|
<h2><a name="Drivers">The libvirt Drivers</a></h2>
|
||||||
<p>Drivers are the basic building block for libvirt functionality
|
<p>Drivers are the basic building block for libvirt functionality
|
||||||
to support the capability to handle specific hypervisor driver calls.
|
to support the capability to handle specific hypervisor driver calls.
|
||||||
Drivers are discovered and registered during connection processing as
|
Drivers are discovered and registered during connection processing as
|
||||||
@@ -325,7 +325,7 @@
|
|||||||
the various functions and support found in each driver by the version
|
the various functions and support found in each driver by the version
|
||||||
support was added into libvirt.
|
support was added into libvirt.
|
||||||
</p>
|
</p>
|
||||||
<h2><a id="Remote">Daemon and Remote Access</a></h2>
|
<h2><a name="Remote">Daemon and Remote Access</a></h2>
|
||||||
<p>Access to libvirt drivers is primarily handled by the libvirtd
|
<p>Access to libvirt drivers is primarily handled by the libvirtd
|
||||||
daemon through the <a href="remote.html">remote</a> driver via an
|
daemon through the <a href="remote.html">remote</a> driver via an
|
||||||
<a href="internals/rpc.html">RPC</a>. Some hypervisors do support
|
<a href="internals/rpc.html">RPC</a>. Some hypervisors do support
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Implementing a new API in Libvirt</h1>
|
<h1>Implementing a new API in Libvirt</h1>
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a href="https://libvirt.org/downloads.html">https://libvirt.org/downloads.html</a>
|
<a href="http://libvirt.org/downloads.html">http://libvirt.org/downloads.html</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -273,7 +273,7 @@
|
|||||||
<li>unlocks the remote driver.</li>
|
<li>unlocks the remote driver.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h3><a id="serverdispatch">Implement the server side dispatcher</a></h3>
|
<h3><a name="serverdispatch">Implement the server side dispatcher</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Implementing the server side of the remote function call is simply a
|
Implementing the server side of the remote function call is simply a
|
||||||
@@ -300,7 +300,7 @@
|
|||||||
|
|
||||||
<p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p>
|
<p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p>
|
||||||
|
|
||||||
<h2><a id="internaluseapi">Use the new API internally</a></h2>
|
<h2><a name="internaluseapi">Use the new API internally</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Sometimes, a new API serves as a superset of existing API, by
|
Sometimes, a new API serves as a superset of existing API, by
|
||||||
@@ -314,7 +314,7 @@
|
|||||||
|
|
||||||
<p class="example">See <a href="api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch">0006-make-old-API-trivially-wrap-to-new-API.patch</a></p>
|
<p class="example">See <a href="api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch">0006-make-old-API-trivially-wrap-to-new-API.patch</a></p>
|
||||||
|
|
||||||
<h2><a id="virshuseapi">Expose the new API in virsh</a></h2>
|
<h2><a name="virshuseapi">Expose the new API in virsh</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
All new API should be manageable from the virsh command line
|
All new API should be manageable from the virsh command line
|
||||||
@@ -345,7 +345,7 @@
|
|||||||
|
|
||||||
<p class="example">See <a href="api_extension/0007-add-virsh-support.patch">0007-add-virsh-support.patch</a></p>
|
<p class="example">See <a href="api_extension/0007-add-virsh-support.patch">0007-add-virsh-support.patch</a></p>
|
||||||
|
|
||||||
<h2><a id="driverimpl">Implement the driver methods</a></h2>
|
<h2><a name="driverimpl">Implement the driver methods</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
So, after all that, we get to the fun part. All functionality in
|
So, after all that, we get to the fun part. All functionality in
|
||||||
@@ -356,7 +356,7 @@
|
|||||||
adding.
|
adding.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="commonimpl">Implement common handling</a></h3>
|
<h3><a name="commonimpl">Implement common handling</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If the new API is applicable to more than one driver, it may
|
If the new API is applicable to more than one driver, it may
|
||||||
@@ -373,7 +373,7 @@
|
|||||||
|
|
||||||
<p class="example">See <a href="api_extension/0008-support-new-xml.patch">0008-support-new-xml.patch</a></p>
|
<p class="example">See <a href="api_extension/0008-support-new-xml.patch">0008-support-new-xml.patch</a></p>
|
||||||
|
|
||||||
<h3><a id="drivercode">Implement driver handling</a></h3>
|
<h3><a name="drivercode">Implement driver handling</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The remaining patches should only touch one driver at a time.
|
The remaining patches should only touch one driver at a time.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python2
|
#!/usr/bin/python -u
|
||||||
#
|
#
|
||||||
# This is the API builder, it parses the C sources and build the
|
# This is the API builder, it parses the C sources and build the
|
||||||
# API formal description in XML.
|
# API formal description in XML.
|
||||||
@@ -1365,9 +1365,9 @@ class CParser:
|
|||||||
def parseEnumBlock(self, token):
|
def parseEnumBlock(self, token):
|
||||||
self.enums = []
|
self.enums = []
|
||||||
name = None
|
name = None
|
||||||
|
self.comment = None
|
||||||
comment = ""
|
comment = ""
|
||||||
value = "-1"
|
value = "-1"
|
||||||
commentsBeforeVal = self.comment is not None
|
|
||||||
while token is not None:
|
while token is not None:
|
||||||
if token[0] == "sep" and token[1] == "{":
|
if token[0] == "sep" and token[1] == "{":
|
||||||
token = self.token()
|
token = self.token()
|
||||||
@@ -1408,10 +1408,6 @@ class CParser:
|
|||||||
self.warning("Failed to compute value of enum %s" % (name))
|
self.warning("Failed to compute value of enum %s" % (name))
|
||||||
value=""
|
value=""
|
||||||
if token[0] == "sep" and token[1] == ",":
|
if token[0] == "sep" and token[1] == ",":
|
||||||
if commentsBeforeVal:
|
|
||||||
self.cleanupComment()
|
|
||||||
self.enums.append((name, value, self.comment))
|
|
||||||
name = comment = self.comment = None
|
|
||||||
token = self.token()
|
token = self.token()
|
||||||
else:
|
else:
|
||||||
token = self.token()
|
token = self.token()
|
||||||
@@ -1656,8 +1652,6 @@ class CParser:
|
|||||||
self.enums = []
|
self.enums = []
|
||||||
token = self.token()
|
token = self.token()
|
||||||
if token is not None and token[0] == "sep" and token[1] == "{":
|
if token is not None and token[0] == "sep" and token[1] == "{":
|
||||||
# drop comments before the enum block
|
|
||||||
self.comment = None
|
|
||||||
token = self.token()
|
token = self.token()
|
||||||
token = self.parseEnumBlock(token)
|
token = self.parseEnumBlock(token)
|
||||||
else:
|
else:
|
||||||
@@ -2613,9 +2607,10 @@ class app:
|
|||||||
dirs = [srcdir + "/../src",
|
dirs = [srcdir + "/../src",
|
||||||
srcdir + "/../src/util",
|
srcdir + "/../src/util",
|
||||||
srcdir + "/../include/libvirt"]
|
srcdir + "/../include/libvirt"]
|
||||||
if (builddir and
|
if builddir:
|
||||||
not os.path.exists(srcdir + "/../include/libvirt/libvirt-common.h")):
|
|
||||||
dirs.append(builddir + "/../include/libvirt")
|
dirs.append(builddir + "/../include/libvirt")
|
||||||
|
if glob.glob(srcdir + "/../include/libvirt/libvirt.h") == [] :
|
||||||
|
dirs.append("../include/libvirt")
|
||||||
builder = docBuilder(name, srcdir, dirs, [])
|
builder = docBuilder(name, srcdir, dirs, [])
|
||||||
elif glob.glob("src/libvirt.c") != [] :
|
elif glob.glob("src/libvirt.c") != [] :
|
||||||
if not quiet:
|
if not quiet:
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Applications using libvirt</h1>
|
<h1>Applications using libvirt</h1>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="add">Add an application</a></h2>
|
<h2><a name="add">Add an application</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
To add an application not listed on this page, send a message
|
To add an application not listed on this page, send a message
|
||||||
@@ -19,18 +19,15 @@
|
|||||||
be added here, or simply send a patch against the documentation
|
be added here, or simply send a patch against the documentation
|
||||||
in the libvirt.git docs subdirectory.
|
in the libvirt.git docs subdirectory.
|
||||||
If your application uses libvirt as its API,
|
If your application uses libvirt as its API,
|
||||||
the following graphics are available for your website to advertise
|
the following graphic is available for your website to advertise
|
||||||
support for libvirt:
|
support for libvirt:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="image">
|
<p class="image">
|
||||||
<img src="logos/logo-square-powered-96.png" alt="libvirt powered"/>
|
<img src="madeWith.png" alt="Made with libvirt"/>
|
||||||
<img src="logos/logo-square-powered-128.png" alt="libvirt powered"/>
|
|
||||||
<img src="logos/logo-square-powered-192.png" alt="libvirt powered"/>
|
|
||||||
<img src="logos/logo-square-powered-256.png" alt="libvirt powered"/>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="clientserver">Client/Server applications</a></h2>
|
<h2><a name="clientserver">Client/Server applications</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://archipelproject.org">Archipel</a></dt>
|
<dt><a href="http://archipelproject.org">Archipel</a></dt>
|
||||||
@@ -50,7 +47,7 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="command">Command line tools</a></h2>
|
<h2><a name="command">Command line tools</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://libguestfs.org">guestfish</a></dt>
|
<dt><a href="http://libguestfs.org">guestfish</a></dt>
|
||||||
@@ -65,21 +62,21 @@
|
|||||||
management tasks on all libvirt managed domains, networks and
|
management tasks on all libvirt managed domains, networks and
|
||||||
storage. This is part of the libvirt core distribution.
|
storage. This is part of the libvirt core distribution.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://virt-manager.org/">virt-clone</a></dt>
|
<dt><a href="http://virt-manager.org/">virt-clone</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Allows the disk image(s) and configuration for an existing
|
Allows the disk image(s) and configuration for an existing
|
||||||
virtual machine to be cloned to form a new virtual machine.
|
virtual machine to be cloned to form a new virtual machine.
|
||||||
It automates copying of data across to new disk images, and
|
It automates copying of data across to new disk images, and
|
||||||
updates the UUID, MAC address, and name in the configuration.
|
updates the UUID, MAC address, and name in the configuration.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://people.redhat.com/rjones/virt-df/">virt-df</a></dt>
|
<dt><a href="http://et.redhat.com/~rjones/virt-df/">virt-df</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Examine the utilization of each filesystem in a virtual machine
|
Examine the utilization of each filesystem in a virtual machine
|
||||||
from the comfort of the host machine. This tool peeks into the
|
from the comfort of the host machine. This tool peeks into the
|
||||||
guest disks and determines how much space is used. It can cope
|
guest disks and determines how much space is used. It can cope
|
||||||
with common Linux filesystems and LVM volumes.
|
with common Linux filesystems and LVM volumes.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://virt-manager.org/">virt-image</a></dt>
|
<dt><a href="http://virt-manager.org/">virt-image</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Provides a way to deploy virtual appliances. It defines a
|
Provides a way to deploy virtual appliances. It defines a
|
||||||
simplified portable XML format describing the pre-requisites
|
simplified portable XML format describing the pre-requisites
|
||||||
@@ -87,26 +84,26 @@
|
|||||||
into the domain XML format for execution under any libvirt
|
into the domain XML format for execution under any libvirt
|
||||||
hypervisor meeting the pre-requisites.
|
hypervisor meeting the pre-requisites.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://virt-manager.org/">virt-install</a></dt>
|
<dt><a href="http://virt-manager.org/">virt-install</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Provides a way to provision new virtual machines from a
|
Provides a way to provision new virtual machines from a
|
||||||
OS distribution install tree. It supports provisioning from
|
OS distribution install tree. It supports provisioning from
|
||||||
local CD images, and the network over NFS, HTTP and FTP.
|
local CD images, and the network over NFS, HTTP and FTP.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://people.redhat.com/rjones/virt-top/">virt-top</a></dt>
|
<dt><a href="http://et.redhat.com/~rjones/virt-top/">virt-top</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Watch the CPU, memory, network and disk utilization of all
|
Watch the CPU, memory, network and disk utilization of all
|
||||||
virtual machines running on a host.
|
virtual machines running on a host.
|
||||||
</dd>
|
</dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a href="https://people.redhat.com/~rjones/virt-what/">virt-what</a>
|
<a href="http://people.redhat.com/~rjones/virt-what/">virt-what</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd>
|
<dd>
|
||||||
virt-what is a shell script for detecting if the program is running
|
virt-what is a shell script for detecting if the program is running
|
||||||
in a virtual machine. It prints out a list of facts about the
|
in a virtual machine. It prints out a list of facts about the
|
||||||
virtual machine, derived from heuristics.
|
virtual machine, derived from heuristics.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://sourceware.org/systemtap/">stap</a></dt>
|
<dt><a href="http://sourceware.org/systemtap/">stap</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
SystemTap is a tool used to gather rich information about a running
|
SystemTap is a tool used to gather rich information about a running
|
||||||
system through the use of scripts. Starting from v2.4, the front-end
|
system through the use of scripts. Starting from v2.4, the front-end
|
||||||
@@ -121,7 +118,7 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="configmgmt">Configuration Management</a></h2>
|
<h2><a name="configmgmt">Configuration Management</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://wiki.lcfg.org/bin/view/LCFG/LcfgLibvirt">LCFG</a></dt>
|
<dt><a href="https://wiki.lcfg.org/bin/view/LCFG/LcfgLibvirt">LCFG</a></dt>
|
||||||
@@ -139,10 +136,10 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="continuousintegration">Continuous Integration</a></h2>
|
<h2><a name="continuousintegration">Continuous Integration</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt>
|
<dt><a href="http://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
BuildBot is a system to automate the compile/test cycle required
|
BuildBot is a system to automate the compile/test cycle required
|
||||||
by most software projects. CVS commits trigger new builds, run on
|
by most software projects. CVS commits trigger new builds, run on
|
||||||
@@ -152,7 +149,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt>
|
<dt><a href="http://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
This plugin for Jenkins adds a way to control guest domains hosted
|
This plugin for Jenkins adds a way to control guest domains hosted
|
||||||
on Xen or QEMU/KVM. You configure a Jenkins Slave,
|
on Xen or QEMU/KVM. You configure a Jenkins Slave,
|
||||||
@@ -163,7 +160,7 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="conversion">Conversion</a></h2>
|
<h2><a name="conversion">Conversion</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt>
|
<dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt>
|
||||||
@@ -194,37 +191,26 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="desktop">Desktop applications</a></h2>
|
<h2><a name="desktop">Desktop applications</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://virt-manager.org/">virt-manager</a></dt>
|
<dt><a href="http://virt-manager.org/">virt-manager</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
A general purpose desktop management tool, able to manage
|
A general purpose desktop management tool, able to manage
|
||||||
virtual machines across both local and remotely accessed
|
virtual machines across both local and remotely accessed
|
||||||
hypervisors. It is targeted at home and small office usage
|
hypervisors. It is targeted at home and small office usage
|
||||||
up to managing 10-20 hosts and their VMs.
|
up to managing 10-20 hosts and their VMs.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://virt-manager.org/">virt-viewer</a></dt>
|
<dt><a href="http://virt-manager.org/">virt-viewer</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
A lightweight tool for accessing the graphical console
|
A lightweight tool for accessing the graphical console
|
||||||
associated with a virtual machine. It can securely connect
|
associated with a virtual machine. It can securely connect
|
||||||
to remote consoles supporting the VNC protocol. Also provides
|
to remote consoles supporting the VNC protocol. Also provides
|
||||||
an optional mozilla browser plugin.
|
an optional mozilla browser plugin.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://f1ash.github.io/qt-virt-manager">qt-virt-manager</a></dt>
|
|
||||||
<dd>
|
|
||||||
The Qt GUI for create and control VMs and another virtual entities
|
|
||||||
(aka networks, storages, interfaces, secrets, network filters).
|
|
||||||
Contains integrated LXC/SPICE/VNC viewer for accessing the graphical or
|
|
||||||
text console associated with a virtual machine or container.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://f1ash.github.io/qt-virt-manager/#virtual-machines-viewer">qt-remote-viewer</a></dt>
|
|
||||||
<dd>
|
|
||||||
The Qt VNC/SPICE viewer for access to remote desktops or VMs.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="iaas">Infrastructure as a Service (IaaS)</a></h2>
|
<h2><a name="iaas">Infrastructure as a Service (IaaS)</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://cc1.ifj.edu.pl">Cracow Cloud One</a></dt>
|
<dt><a href="http://cc1.ifj.edu.pl">Cracow Cloud One</a></dt>
|
||||||
@@ -234,7 +220,17 @@
|
|||||||
it easy to benefit from private Cloud Computing technology.
|
it easy to benefit from private Cloud Computing technology.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt><a href="https://github.com/eucalyptus/eucalyptus">Eucalyptus</a></dt>
|
<dt><a href="http://www.emotivecloud.net">EMOTIVE Cloud</a></dt>
|
||||||
|
<dd>The EMOTIVE (Elastic Management Of Tasks In Virtualized
|
||||||
|
Environments) middleware allows executing tasks and providing
|
||||||
|
virtualized environments to the users with Xen, KVM or
|
||||||
|
VirtualBox hypervisor. EMOTIVE's main feature is VM management
|
||||||
|
with different scheduling policies. It can be also used as a
|
||||||
|
cloud provider and is very easy to extend thanks to its
|
||||||
|
modular Web Services architecture.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt><a href="http://www.eucalyptus.com">Eucalyptus</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Eucalyptus is an on-premise Infrastructure as a Service cloud
|
Eucalyptus is an on-premise Infrastructure as a Service cloud
|
||||||
software platform that is open source and
|
software platform that is open source and
|
||||||
@@ -258,7 +254,7 @@
|
|||||||
management.
|
management.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt><a href="https://www.openstack.org">OpenStack</a></dt>
|
<dt><a href="http://www.openstack.org">OpenStack</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
OpenStack is a "cloud operating system" usable for both public
|
OpenStack is a "cloud operating system" usable for both public
|
||||||
and private clouds. Its various parts take care of compute,
|
and private clouds. Its various parts take care of compute,
|
||||||
@@ -276,19 +272,9 @@
|
|||||||
perfect for setting up low-end servers in a cloud or a
|
perfect for setting up low-end servers in a cloud or a
|
||||||
cloud where you want the most bang for the bucks.
|
cloud where you want the most bang for the bucks.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt><a href="http://en.zstack.io/">ZStack</a></dt>
|
|
||||||
<dd>
|
|
||||||
ZStack is an open source IaaS software that aims to automate the
|
|
||||||
management of all resources (compute, storage, networking, etc.) in a
|
|
||||||
datacenter by using APIs, thus conforming to the principles of a
|
|
||||||
software-defined datacenter. The key strengths of ZStack in terms of
|
|
||||||
management are scalability, performance, and a fast, user-friendly
|
|
||||||
deployment.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="libraries">Libraries</a></h2>
|
<h2><a name="libraries">Libraries</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://libguestfs.org">libguestfs</a></dt>
|
<dt><a href="http://libguestfs.org">libguestfs</a></dt>
|
||||||
@@ -304,7 +290,7 @@
|
|||||||
Windows Registry in Windows guests.
|
Windows Registry in Windows guests.
|
||||||
</dd>
|
</dd>
|
||||||
|
|
||||||
<dt><a href="https://sandbox.libvirt.org">libvirt-sandbox</a></dt>
|
<dt><a href="http://sandbox.libvirt.org">libvirt-sandbox</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
A library and command line tools for simplifying the creation of
|
A library and command line tools for simplifying the creation of
|
||||||
application sandboxes using virtualization technology. It currently
|
application sandboxes using virtualization technology. It currently
|
||||||
@@ -317,14 +303,14 @@
|
|||||||
Allows using simple ruby objects to manipulate
|
Allows using simple ruby objects to manipulate
|
||||||
hypervisors, guests, storage, network etc. It is
|
hypervisors, guests, storage, network etc. It is
|
||||||
based on top of
|
based on top of
|
||||||
the <a href="https://libvirt.org/ruby">native ruby bindings</a>.
|
the <a href="http://libvirt.org/ruby">native ruby bindings</a>.
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="livecd">LiveCD / Appliances</a></h2>
|
<h2><a name="livecd">LiveCD / Appliances</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://libguestfs.org/virt-v2v/">virt-p2v</a></dt>
|
<dt><a href="http://et.redhat.com/~rjones/virt-p2v/">virt-p2v</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
An older tool for converting a physical machine into a virtual
|
An older tool for converting a physical machine into a virtual
|
||||||
machine. It is a LiveCD which is booted on the machine to be
|
machine. It is a LiveCD which is booted on the machine to be
|
||||||
@@ -334,9 +320,9 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="monitoring">Monitoring</a></h2>
|
<h2><a name="monitoring">Monitoring</a></h2>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://collectd.org/plugins/libvirt.shtml">collectd</a></dt>
|
<dt><a href="http://collectd.org/plugins/libvirt.shtml">collectd</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
The libvirt-plugin is part of <a href="http://collectd.org/">collectd</a>
|
The libvirt-plugin is part of <a href="http://collectd.org/">collectd</a>
|
||||||
and gathers statistics about virtualized guests on a system. This
|
and gathers statistics about virtualized guests on a system. This
|
||||||
@@ -345,19 +331,19 @@
|
|||||||
For a full description, please refer to the libvirt section in the
|
For a full description, please refer to the libvirt section in the
|
||||||
collectd.conf(5) manual page.
|
collectd.conf(5) manual page.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="http://www.sflow.net/">Host sFlow</a></dt>
|
<dt><a href="http://host-sflow.sourceforge.net/">Host sFlow</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Host sFlow is a lightweight agent running on KVM hypervisors that
|
Host sFlow is a lightweight agent running on KVM hypervisors that
|
||||||
links to libvirt library and exports standardized cpu, memory, network
|
links to libvirt library and exports standardized cpu, memory, network
|
||||||
and disk metrics for all virtual machines.
|
and disk metrics for all virtual machines.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt>
|
<dt><a href="http://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
The plugins provided by Guido Günther allow to monitor various things
|
The plugins provided by Guido Günther allow to monitor various things
|
||||||
like network and block I/O with
|
like network and block I/O with
|
||||||
<a href="http://munin.projects.linpro.no/">Munin</a>.
|
<a href="http://munin.projects.linpro.no/">Munin</a>.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="http://people.redhat.com/rjones/nagios-virt/">Nagios-virt</a></dt>
|
<dt><a href="http://et.redhat.com/~rjones/nagios-virt/">Nagios-virt</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Nagios-virt is a configuration tool to add monitoring of your
|
Nagios-virt is a configuration tool to add monitoring of your
|
||||||
virtualised domains to <a href="http://www.nagios.org/">Nagios</a>.
|
virtualised domains to <a href="http://www.nagios.org/">Nagios</a>.
|
||||||
@@ -365,15 +351,7 @@
|
|||||||
your Xen or QEMU/KVM guests, or to integrate with your existing Nagios
|
your Xen or QEMU/KVM guests, or to integrate with your existing Nagios
|
||||||
installation.
|
installation.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="http://www.pcp.io/man/man1/pmdalibvirt.1.html">PCP</a></dt>
|
<dt><a href="http://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt>
|
||||||
<dd>
|
|
||||||
The PCP libvirt PMDA (plugin) is part of the
|
|
||||||
<a href="http://pcp.io/">PCP</a> toolkit and provides
|
|
||||||
hypervisor and guest information and complete set of guest performance
|
|
||||||
metrics. It supports pCPU, vCPU, memory, block device, network interface,
|
|
||||||
and performance event metrics for each virtual guest.
|
|
||||||
</dd>
|
|
||||||
<dt><a href="https://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt>
|
|
||||||
<dd>
|
<dd>
|
||||||
The Zenoss libvirt Zenpack adds support for monitoring virtualization
|
The Zenoss libvirt Zenpack adds support for monitoring virtualization
|
||||||
servers. It has been tested with KVM, QEMU, VMware ESX, and VMware
|
servers. It has been tested with KVM, QEMU, VMware ESX, and VMware
|
||||||
@@ -381,10 +359,10 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="provisioning">Provisioning</a></h2>
|
<h2><a name="provisioning">Provisioning</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Tivoli+Provisioning+Manager">Tivoli Provisioning Manager</a></dt>
|
<dt><a href="http://www.ibm.com/software/tivoli/products/prov-mgr/">Tivoli Provisioning Manager</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Part of the IBM Tivoli family, Tivoli Provisioning Manager (TPM) is
|
Part of the IBM Tivoli family, Tivoli Provisioning Manager (TPM) is
|
||||||
an IT lifecycle automation product. It
|
an IT lifecycle automation product. It
|
||||||
@@ -394,7 +372,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://theforeman.org">Foreman</a></dt>
|
<dt><a href="http://theforeman.org">Foreman</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Foreman is an open source web based application aimed to be a
|
Foreman is an open source web based application aimed to be a
|
||||||
Single Address For All Machines Life Cycle Management. Foreman:
|
Single Address For All Machines Life Cycle Management. Foreman:
|
||||||
@@ -415,10 +393,10 @@
|
|||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="web">Web applications</a></h2>
|
<h2><a name="web">Web applications</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="http://www.abiquo.com/">AbiCloud</a></dt>
|
<dt><a href="http://community.abiquo.com/display/AbiCloud">AbiCloud</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
AbiCloud is an open source cloud platform manager which allows to
|
AbiCloud is an open source cloud platform manager which allows to
|
||||||
easily deploy a private cloud in your datacenter. One of the key
|
easily deploy a private cloud in your datacenter. One of the key
|
||||||
@@ -434,14 +412,14 @@
|
|||||||
Kimchi manages KVM guests through libvirt. The management interface is accessed
|
Kimchi manages KVM guests through libvirt. The management interface is accessed
|
||||||
over the web using a browser that supports HTML5.
|
over the web using a browser that supports HTML5.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://ovirt.org/">oVirt</a></dt>
|
<dt><a href="http://ovirt.org/">oVirt</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
oVirt provides the ability to manage large numbers of virtual
|
oVirt provides the ability to manage large numbers of virtual
|
||||||
machines across an entire data center of hosts. It integrates
|
machines across an entire data center of hosts. It integrates
|
||||||
with FreeIPA for Kerberos authentication, and in the future,
|
with FreeIPA for Kerberos authentication, and in the future,
|
||||||
certificate management.
|
certificate management.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
|
<dt><a href="http://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
VMmanager is a software solution for virtualization management
|
VMmanager is a software solution for virtualization management
|
||||||
that can be used both for hosting virtual machines and
|
that can be used both for hosting virtual machines and
|
||||||
@@ -450,7 +428,7 @@
|
|||||||
functions, such as live migration that allows for load
|
functions, such as live migration that allows for load
|
||||||
balancing between cluster nodes, monitoring CPU, memory.
|
balancing between cluster nodes, monitoring CPU, memory.
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://mist.io/">mist.io</a></dt>
|
<dt><a href="http://mist.io/">mist.io</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Mist.io is an open source project and a service that can assist you in
|
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
|
managing your virtual machines on a unified way, providing a simple
|
||||||
@@ -458,17 +436,9 @@
|
|||||||
providers, OpenStack based public/private clouds, Docker servers, bare
|
providers, OpenStack based public/private clouds, Docker servers, bare
|
||||||
metal servers and now KVM hypervisors).
|
metal servers and now KVM hypervisors).
|
||||||
</dd>
|
</dd>
|
||||||
<dt><a href="https://ravada.upc.edu/">Ravada</a></dt>
|
|
||||||
<dd>
|
|
||||||
Ravada is an open source tool for managing Virtual Desktop
|
|
||||||
Infrastructure (VDI). It is very easy to install and use. Following
|
|
||||||
the documentation, you'll be ready to deploy virtual machines in
|
|
||||||
minutes. The only requirements for the users are a Web browser and
|
|
||||||
a lightweight remote viewer.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="mobile">Mobile applications</a></h2>
|
<h2><a name="mobile">Mobile applications</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt>
|
<dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt>
|
||||||
@@ -479,10 +449,10 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h2><a id="other">Other</a></h2>
|
<h2><a name="other">Other</a></h2>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
<dt><a href="https://cuckoosandbox.org/">Cuckoo Sandbox</a></dt>
|
<dt><a href="http://cuckoosandbox.org/">Cuckoo Sandbox</a></dt>
|
||||||
<dd>
|
<dd>
|
||||||
Cuckoo Sandbox is a malware analysis system. You can throw
|
Cuckoo Sandbox is a malware analysis system. You can throw
|
||||||
any suspicious file at it and in a matter of seconds Cuckoo
|
any suspicious file at it and in a matter of seconds Cuckoo
|
||||||
|
|||||||
7
docs/archdomain.html.in
Normal file
7
docs/archdomain.html.in
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?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 management architecture</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1 >libvirt architecture</h1>
|
<h1 >libvirt architecture</h1>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="Xen">Xen support</a></h2>
|
<h2><a name="Xen">Xen support</a></h2>
|
||||||
|
|
||||||
<p>When running in a Xen environment, programs using libvirt have to execute
|
<p>When running in a Xen environment, programs using libvirt have to execute
|
||||||
in "Domain 0", which is the primary Linux OS loaded on the machine. That OS
|
in "Domain 0", which is the primary Linux OS loaded on the machine. That OS
|
||||||
@@ -46,7 +46,7 @@ connect to initialize the library. It will then fork a libvirt_proxy
|
|||||||
program running as root and providing read_only access to the API, this is
|
program running as root and providing read_only access to the API, this is
|
||||||
then only useful for reporting and monitoring.</p>
|
then only useful for reporting and monitoring.</p>
|
||||||
|
|
||||||
<h2><a id="QEmu">QEmu and KVM support</a></h2>
|
<h2><a name="QEmu">QEmu and KVM support</a></h2>
|
||||||
|
|
||||||
<p>The model for QEmu and KVM is completely similar, basically KVM is based
|
<p>The model for QEmu and KVM is completely similar, basically KVM is based
|
||||||
on QEmu for the process controlling a new domain, only small details differs
|
on QEmu for the process controlling a new domain, only small details differs
|
||||||
@@ -60,7 +60,7 @@ domain, by specifying the architecture and machine type targeted.</p>
|
|||||||
<p>The code controlling the QEmu process is available in the
|
<p>The code controlling the QEmu process is available in the
|
||||||
<code>qemud/</code> directory.</p>
|
<code>qemud/</code> directory.</p>
|
||||||
|
|
||||||
<h2><a id="drivers">Driver based architecture</a></h2>
|
<h2><a name="drivers">Driver based architecture</a></h2>
|
||||||
|
|
||||||
<p>As the previous section explains, libvirt can communicate using different
|
<p>As the previous section explains, libvirt can communicate using different
|
||||||
channels with the current hypervisor, and should also be able to use
|
channels with the current hypervisor, and should also be able to use
|
||||||
|
|||||||
54
docs/archnetwork.html.in
Normal file
54
docs/archnetwork.html.in
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?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>Network management architecture</h1>
|
||||||
|
|
||||||
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
|
<h2><a name="architecture">Architecture illustration</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The diagrams below illustrate some of the network configurations
|
||||||
|
enabled by the libvirt networking APIs
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><strong>VLAN 1</strong>. This virtual network has connectivity
|
||||||
|
to <code>LAN 2</code> with traffic forwarded and NATed.
|
||||||
|
</li>
|
||||||
|
<li><strong>VLAN 2</strong>. This virtual network is completely
|
||||||
|
isolated from any physical LAN.
|
||||||
|
</li>
|
||||||
|
<li><strong>Guest A</strong>. The first network interface is bridged
|
||||||
|
to the physical <code>LAN 1</code>. The second interface is connected
|
||||||
|
to a virtual network <code>VLAN 1</code>.
|
||||||
|
</li>
|
||||||
|
<li><strong>Guest B</strong>. The first network interface is connected
|
||||||
|
to a virtual network <code>VLAN 1</code>, giving it limited NAT
|
||||||
|
based connectivity to LAN2. It has a second network interface
|
||||||
|
connected to <code>VLAN 2</code>. It acts a router allowing limited
|
||||||
|
traffic between the two VLANs, thus giving <code>Guest C</code>
|
||||||
|
connectivity to the physical <code>LAN 2</code>.
|
||||||
|
</li>
|
||||||
|
<li><strong>Guest C</strong>. The only network interface is connected
|
||||||
|
to a virtual network <code>VLAN 2</code>. It has no direct connectivity
|
||||||
|
to a physical LAN, relying on <code>Guest B</code> to route traffic
|
||||||
|
on its behalf.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3><a name="logical">Logical diagram</a></h3>
|
||||||
|
|
||||||
|
<p class="image">
|
||||||
|
<img src="libvirt-net-logical.png" alt="Logical network architecture"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3><a name="physical">Physical diagram</a></h3>
|
||||||
|
|
||||||
|
<p class="image">
|
||||||
|
<img src="libvirt-net-physical.png" alt="Physical network architecture"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
7
docs/archnode.html.in
Normal file
7
docs/archnode.html.in
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?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>Node device management architecture</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
32
docs/archstorage.html.in
Normal file
32
docs/archstorage.html.in
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?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>Storage management architecture</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The storage management APIs are based around 2 core concepts
|
||||||
|
</p>
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
<strong>Volume</strong> - a single storage volume which can
|
||||||
|
be assigned to a guest, or used for creating further pools. A
|
||||||
|
volume is either a block device, a raw file, or a special format
|
||||||
|
file.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Pool</strong> - provides a means for taking a chunk
|
||||||
|
of storage and carving it up into volumes. A pool can be used to
|
||||||
|
manage things such as a physical disk, a NFS server, a iSCSI target,
|
||||||
|
a host adapter, an LVM group.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
These two concepts are mapped through to two libvirt objects, a
|
||||||
|
<code>virStorageVolPtr</code> and a <code>virStoragePoolPtr</code>,
|
||||||
|
each with a collection of APIs for their management.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Audit log</h1>
|
<h1>Audit log</h1>
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="intro">Introduction</a></h2>
|
<h2><a name="intro">Introduction</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
A number of the libvirt virtualization drivers (QEMU/KVM and LXC) include
|
A number of the libvirt virtualization drivers (QEMU/KVM and LXC) include
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
the logs will usually end up in <code>/var/log/audit/audit.log</code>
|
the logs will usually end up in <code>/var/log/audit/audit.log</code>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="config">Configuration</a></h2>
|
<h2><a name="config">Configuration</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt audit integration is enabled by default on any host which has
|
The libvirt audit integration is enabled by default on any host which has
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
mentioned above.
|
mentioned above.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="types">Message types</a></h2>
|
<h2><a name="types">Message types</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Libvirt defines three core audit message types each of which will
|
Libvirt defines three core audit message types each of which will
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
<dd>Result of the action, either <code>success</code> or <code>failed</code></dd>
|
<dd>Result of the action, either <code>success</code> or <code>failed</code></dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h3><a id="typecontrol">VIRT_CONTROL</a></h3>
|
<h3><a name="typecontrol">VIRT_CONTROL</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Reports change in the lifecycle state of a virtual machine. The <code>msg</code>
|
Reports change in the lifecycle state of a virtual machine. The <code>msg</code>
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
<dd>Namespace ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
<dd>Namespace ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h3><a id="typemachine">VIRT_MACHINE_ID</a></h3>
|
<h3><a name="typemachine">VIRT_MACHINE_ID</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Reports the association of a security context with a guest. The <code>msg</code>
|
Reports the association of a security context with a guest. The <code>msg</code>
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
<dd>Security context for the guest disk images and other assigned host resources</dd>
|
<dd>Security context for the guest disk images and other assigned host resources</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h3><a id="typeresource">VIRT_RESOURCE</a></h3>
|
<h3><a name="typeresource">VIRT_RESOURCE</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Reports the usage of a host resource by a guest. The fields include will
|
Reports the usage of a host resource by a guest. The fields include will
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
be generated.
|
be generated.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4><a id="typeresourcevcpu">Virtual CPU</a></h4>
|
<h4><a name="typeresourcevcpu">Virtual CPU</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
<h4><a id="typeresourcemem">Memory</a></h4>
|
<h4><a name="typeresourcemem">Memory</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
@@ -172,7 +172,7 @@
|
|||||||
<dd>Updated memory size in bytes</dd>
|
<dd>Updated memory size in bytes</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcedisk">Disk</a></h4>
|
<h4><a name="typeresourcedisk">Disk</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -188,7 +188,7 @@
|
|||||||
<dd>Updated host file or device path acting as the disk backing file</dd>
|
<dd>Updated host file or device path acting as the disk backing file</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcenic">Network interface</a></h4>
|
<h4><a name="typeresourcenic">Network interface</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
@@ -221,7 +221,7 @@
|
|||||||
<dd>Name of the host network interface</dd>
|
<dd>Name of the host network interface</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcefs">Filesystem</a></h4>
|
<h4><a name="typeresourcefs">Filesystem</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
<dd>Updated host directory, file or device path backing the filesystem</dd>
|
<dd>Updated host directory, file or device path backing the filesystem</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcehost">Host device</a></h4>
|
<h4><a name="typeresourcehost">Host device</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -255,7 +255,7 @@
|
|||||||
<dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
<dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcetpm">TPM</a></h4>
|
<h4><a name="typeresourcetpm">TPM</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -269,7 +269,7 @@
|
|||||||
<dd>The path of the host TPM device assigned to the guest</dd>
|
<dd>The path of the host TPM device assigned to the guest</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcerng">RNG</a></h4>
|
<h4><a name="typeresourcerng">RNG</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -285,7 +285,7 @@
|
|||||||
<dd>Updated path of the host entropy source for the RNG</dd>
|
<dd>Updated path of the host entropy source for the RNG</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcechardev">console/serial/parallel/channel</a></h4>
|
<h4><a name="typeresourcechardev">console/serial/parallel/channel</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
<dd>Updated path of the backing character device for given emulated device</dd>
|
<dd>Updated path of the backing character device for given emulated device</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcesmartcard">smartcard</a></h4>
|
<h4><a name="typeresourcesmartcard">smartcard</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -321,7 +321,7 @@
|
|||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourceredir">Redirected device</a></h4>
|
<h4><a name="typeresourceredir">Redirected device</a></h4>
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
</p>
|
</p>
|
||||||
@@ -337,7 +337,7 @@
|
|||||||
<dd>The device type, only <code>USB redir</code> allowed</dd>
|
<dd>The device type, only <code>USB redir</code> allowed</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h4><a id="typeresourcecgroup">Control group</a></h4>
|
<h4><a name="typeresourcecgroup">Control group</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>msg</code> field will include the following sub-fields
|
The <code>msg</code> field will include the following sub-fields
|
||||||
@@ -352,24 +352,5 @@
|
|||||||
<dd>The name of the cgroup controller</dd>
|
<dd>The name of the cgroup controller</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
<h4><a id="typeresourceshmem">Shared memory</a></h4>
|
|
||||||
<p>
|
|
||||||
The <code>msg</code> field will include the following sub-fields
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>resrc</code></dt>
|
|
||||||
<dd>The type of resource assigned. Set to <code>shmem</code></dd>
|
|
||||||
<dt><code>reason</code></dt>
|
|
||||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
|
||||||
<dt><code>size</code></dt>
|
|
||||||
<dd>The size of the shared memory region</dd>
|
|
||||||
<dt><code>shmem</code></dt>
|
|
||||||
<dd>Name of the shared memory region</dd>
|
|
||||||
<dt><code>source</code></dt>
|
|
||||||
<dd>Path of the backing character device for given emulated device</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Connection authentication</h1>
|
<h1>Connection authentication</h1>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="Auth_client_config">Client configuration</a></h2>
|
<h2><a name="Auth_client_config">Client configuration</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When connecting to a remote hypervisor which requires authentication,
|
When connecting to a remote hypervisor which requires authentication,
|
||||||
@@ -142,7 +142,7 @@ credentials=defgrp</pre>
|
|||||||
to storage VNC or SPICE login credentials
|
to storage VNC or SPICE login credentials
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="ACL_server_config">Server configuration</a></h2>
|
<h2><a name="ACL_server_config">Server configuration</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The libvirt daemon allows the administrator to choose the authentication
|
The libvirt daemon allows the administrator to choose the authentication
|
||||||
mechanisms used for client connections on each network socket independently.
|
mechanisms used for client connections on each network socket independently.
|
||||||
@@ -153,7 +153,7 @@ currently a choice of <code>none</code>, <code>polkit</code>, and <code>sasl</co
|
|||||||
The SASL scheme can be further configured to choose between a large
|
The SASL scheme can be further configured to choose between a large
|
||||||
number of different mechanisms.
|
number of different mechanisms.
|
||||||
</p>
|
</p>
|
||||||
<h2><a id="ACL_server_unix_perms">UNIX socket permissions/group</a></h2>
|
<h2><a name="ACL_server_unix_perms">UNIX socket permissions/group</a></h2>
|
||||||
<p>
|
<p>
|
||||||
If libvirt does not contain support for PolicyKit, then access control for
|
If libvirt does not contain support for PolicyKit, then access control for
|
||||||
the UNIX domain socket is done using traditional file user/group ownership
|
the UNIX domain socket is done using traditional file user/group ownership
|
||||||
@@ -170,10 +170,10 @@ parameter. For example, setting the former to mode <code>0770</code> and the
|
|||||||
latter <code>wheel</code> would let any user in the wheel group connect to
|
latter <code>wheel</code> would let any user in the wheel group connect to
|
||||||
the libvirt daemon.
|
the libvirt daemon.
|
||||||
</p>
|
</p>
|
||||||
<h2><a id="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2>
|
<h2><a name="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2>
|
||||||
<p>
|
<p>
|
||||||
If libvirt contains support for PolicyKit, then access control options are
|
If libvirt contains support for PolicyKit, then access control options are
|
||||||
more advanced. The <code>auth_unix_rw</code> parameter will default to
|
more advanced. The <code>unix_sock_auth</code> parameter will default to
|
||||||
<code>polkit</code>, and the file permissions will default to <code>0777</code>
|
<code>polkit</code>, and the file permissions will default to <code>0777</code>
|
||||||
even on the RW socket. Upon connecting to the socket, the client application
|
even on the RW socket. Upon connecting to the socket, the client application
|
||||||
will be required to identify itself with PolicyKit. The default policy for the
|
will be required to identify itself with PolicyKit. The default policy for the
|
||||||
@@ -204,72 +204,16 @@ ResultActive=yes</pre>
|
|||||||
Further examples of PolicyKit setup can be found on the
|
Further examples of PolicyKit setup can be found on the
|
||||||
<a href="http://wiki.libvirt.org/page/SSHPolicyKitSetup">wiki page</a>.
|
<a href="http://wiki.libvirt.org/page/SSHPolicyKitSetup">wiki page</a>.
|
||||||
</p>
|
</p>
|
||||||
<h2><a id="ACL_server_sasl">SASL pluggable authentication</a></h2>
|
<h2><a name="ACL_server_username">Username/password auth</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Libvirt integrates with the cyrus-sasl library to provide a pluggable authentication
|
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
|
||||||
system using the SASL protocol. SASL can be used in combination with libvirtd's TLS
|
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
|
||||||
or TCP socket listeners. When used with the TCP listener, the SASL mechanism is
|
username+password style authentication. It also provides for encryption of the data
|
||||||
rqeuired to provide session encryption in addition to authentication. Only a very
|
stream, so the security of the plain TCP socket is on a par with that of the TLS
|
||||||
few SASL mechanisms are able to do this, and of those that can do it, only the
|
socket. If desired the UNIX socket and TLS socket can also have SASL enabled by
|
||||||
GSSAPI plugin is considered acceptably secure by modern standards:
|
setting the <code>auth_unix_ro</code>, <code>auth_unix_rw</code>, <code>auth_tls</code>
|
||||||
</p>
|
config params in <code>libvirt.conf</code>.
|
||||||
|
</p>
|
||||||
<dl>
|
|
||||||
<dt>GSSAPI</dt>
|
|
||||||
<dd><strong>This is the current default mechanism to use with libvirtd</strong>.
|
|
||||||
It uses the Kerberos v5 authentication protocol underneath, and assuming
|
|
||||||
the Kerberos client/server are configured with modern ciphers (AES),
|
|
||||||
it provides strong session encryption capabilities.</dd>
|
|
||||||
|
|
||||||
<dt>DIGEST-MD5</dt>
|
|
||||||
<dd>This was previously set as the default mechanism to use with libvirtd.
|
|
||||||
It provides a simple username/password based authentication mechanism
|
|
||||||
that includes session encryption.
|
|
||||||
<a href="https://tools.ietf.org/html/rfc6331">RFC 6331</a>, however,
|
|
||||||
documents a number of serious security flaws with DIGEST-MD5 and as a
|
|
||||||
result marks it as <code>OBSOLETE</code>. Specific concerns are that
|
|
||||||
it is vulnerable to MITM attacks and the MD5 hash can be brute-forced
|
|
||||||
to reveal the password. A replacement is provided via the SCRAM mechanism,
|
|
||||||
however, note that this does not provide encryption, so the SCRAM
|
|
||||||
mechanism can only be used on the libvirtd TLS listener.
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt>PASSDSS-3DES-1</dt>
|
|
||||||
<dd>This provides a simple username/password based authentication
|
|
||||||
mechanism that includes session encryption. The current cyrus-sasl
|
|
||||||
implementation does not provide a way to validate the server's
|
|
||||||
public key identity, thus it is susceptible to a MITM attacker
|
|
||||||
impersonating the server. It is also not enabled in many OS
|
|
||||||
distros when building SASL libraries.</dd>
|
|
||||||
|
|
||||||
<dt>KERBEROS_V4</dt>
|
|
||||||
<dd>This uses the obsolete Kerberos v4 protocol to provide both authentication
|
|
||||||
and session encryption. Kerberos v4 protocol has been obsolete since the
|
|
||||||
early 1990's and has known security vulnerabilities so this will never be
|
|
||||||
used in practice.</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Other SASL mechanisms, not listed above, can only be used when the libvirtd
|
|
||||||
TLS or UNIX socket listeners.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a id="ACL_server_username">Username/password auth</a></h3>
|
|
||||||
<p>
|
|
||||||
As noted above, the DIGEST-MD5 mechanism is considered obsolete and should
|
|
||||||
not be used anymore. To provide a simple username/password auth scheme on
|
|
||||||
the libvirt UNIX socket or TLS listeners, however, it is possible to use
|
|
||||||
the SCRAM mechanism. The <code>auth_unix_ro</code>, <code>auth_unix_rw</code>,
|
|
||||||
<code>auth_tls</code> config params in <code>libvirt.conf</code> can be used
|
|
||||||
to turn on SASL auth in these listeners.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Since the libvirt SASL config file defaults to using GSSAPI (Kerberos), a
|
|
||||||
config change is rquired to enable plain password auth. This is done by
|
|
||||||
editting <code>/etc/sasl2/libvirt.conf</code> to set the <code>mech_list</code>
|
|
||||||
parameter to <code>scram-sha-1</code>.
|
|
||||||
</p>
|
|
||||||
<p>
|
<p>
|
||||||
Out of the box, no user accounts are defined, so no clients will be able to authenticate
|
Out of the box, no user accounts are defined, so no clients will be able to authenticate
|
||||||
on the TCP socket. Adding users and setting their passwords is done with the <code>saslpasswd2</code>
|
on the TCP socket. Adding users and setting their passwords is done with the <code>saslpasswd2</code>
|
||||||
@@ -297,13 +241,17 @@ again:
|
|||||||
<pre>
|
<pre>
|
||||||
# saslpasswd2 -a libvirt -d fred
|
# saslpasswd2 -a libvirt -d fred
|
||||||
</pre>
|
</pre>
|
||||||
<h3><a id="ACL_server_kerberos">GSSAPI/Kerberos auth</a></h3>
|
<h2><a name="ACL_server_kerberos">Kerberos auth</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The plain TCP listener of the libvirt daemon defaults to using SASL for authentication.
|
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
|
||||||
The libvirt SASL config also defaults to GSSAPI, so there is no need to edit the
|
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
|
||||||
SASL config when using GSSAPI. If the libvirtd TLS or UNIX listeners are used,
|
username+password style authentication. To enable Kerberos single-sign-on instead,
|
||||||
then the Kerberos session encryption will be disabled since it is not required
|
the libvirt SASL configuration file must be changed. This is <code>/etc/sasl2/libvirt.conf</code>.
|
||||||
in these scenarios - only the plain TCP listener needs encryption
|
The <code>mech_list</code> parameter must first be changed to <code>gssapi</code>
|
||||||
|
instead of the default <code>digest-md5</code>, and keytab should be set to
|
||||||
|
<code>/etc/libvirt/krb5.tab</code> . If SASL is enabled on the UNIX
|
||||||
|
and/or TLS sockets, Kerberos will also be used for them. Like DIGEST-MD5, the Kerberos
|
||||||
|
mechanism provides data encryption of the session.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Some operating systems do not install the SASL kerberos plugin by default. It
|
Some operating systems do not install the SASL kerberos plugin by default. It
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1 >Bindings for other languages</h1>
|
<h1 >Bindings for other languages</h1>
|
||||||
@@ -14,17 +14,13 @@
|
|||||||
<strong>C#</strong>: Arnaud Champion develops
|
<strong>C#</strong>: Arnaud Champion develops
|
||||||
<a href="csharp.html">C# bindings</a>.
|
<a href="csharp.html">C# bindings</a>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<strong>Go</strong>: Daniel Berrange develops
|
|
||||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go">Go bindings</a>.
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<strong>Java</strong>: Daniel Veillard develops
|
<strong>Java</strong>: Daniel Veillard develops
|
||||||
<a href="java.html">Java bindings</a>.
|
<a href="java.html">Java bindings</a>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<strong>OCaml</strong>: Richard Jones develops
|
<strong>OCaml</strong>: Richard Jones develops
|
||||||
<a href="https://libvirt.org/ocaml/">OCaml bindings</a>.
|
<a href="http://libvirt.org/ocaml/">OCaml bindings</a>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<strong>Perl</strong>: Daniel Berrange develops
|
<strong>Perl</strong>: Daniel Berrange develops
|
||||||
@@ -33,7 +29,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>PHP</strong>: Radek Hladik started developing
|
<strong>PHP</strong>: Radek Hladik started developing
|
||||||
<a href="https://libvirt.org/php">PHP bindings</a> in 2010.
|
<a href="http://libvirt.org/php">PHP bindings</a> in 2010.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
In February 2011 the binding development has been moved to the libvirt.org website as
|
In February 2011 the binding development has been moved to the libvirt.org website as
|
||||||
@@ -43,13 +39,13 @@
|
|||||||
The project is now maintained by Michal Novotny and it's heavily based
|
The project is now maintained by Michal Novotny and it's heavily based
|
||||||
on Radek's version. For more information, including
|
on Radek's version. For more information, including
|
||||||
information on posting patches to libvirt-php, please refer
|
information on posting patches to libvirt-php, please refer
|
||||||
to the <a href="https://libvirt.org/php">PHP bindings</a> site.
|
to the <a href="http://libvirt.org/php">PHP bindings</a> site.
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
<strong>Python</strong>: Libvirt's python bindings are split to a
|
<strong>Python</strong>: Libvirt's python bindings are split to a
|
||||||
separate <a href="https://libvirt.org/git/?p=libvirt-python.git">package</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
|
since version 1.2.0, older versions came with direct support for the
|
||||||
Python language.
|
Python language.
|
||||||
</p>
|
</p>
|
||||||
@@ -70,7 +66,7 @@
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<strong>Ruby</strong>: Chris Lalancette develops
|
<strong>Ruby</strong>: Chris Lalancette develops
|
||||||
<a href="https://libvirt.org/ruby/">Ruby bindings</a>.
|
<a href="http://libvirt.org/ruby/">Ruby bindings</a>.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<browserconfig>
|
|
||||||
<msapplication>
|
|
||||||
<tile>
|
|
||||||
<square150x150logo src="/mstile-150x150.png"/>
|
|
||||||
<TileColor>#b91d47</TileColor>
|
|
||||||
</tile>
|
|
||||||
</msapplication>
|
|
||||||
</browserconfig>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="security">Security Issues</a></h2>
|
<h2><a name="security">Security Issues</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you think that an issue with libvirt may have security
|
If you think that an issue with libvirt may have security
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<a href="securityprocess.html">security process</a> instead.
|
<a href="securityprocess.html">security process</a> instead.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="bugzilla">Bug Tracking</a></h2>
|
<h2><a name="bugzilla">Bug Tracking</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you are using libvirt binaries from a Linux distribution
|
If you are using libvirt binaries from a Linux distribution
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
first.
|
first.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="general">General libvirt bug reports</a></h2>
|
<h2><a name="general">General libvirt bug reports</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
|
The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Virtualization%20Tools&component=libvirt">New libvirt ticket</a></li>
|
<li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Virtualization%20Tools&component=libvirt">New libvirt ticket</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="distribution">Linux Distribution specific bug reports</a></h2>
|
<h2><a name="distribution">Linux Distribution specific bug reports</a></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
If you are using binaries from <strong>Fedora</strong>, enter
|
If you are using binaries from <strong>Fedora</strong>, enter
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="quality">How to file high quality bug reports</a></h2>
|
<h2><a name="quality">How to file high quality bug reports</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
To increase the likelihood of your bug report being addressed it is
|
To increase the likelihood of your bug report being addressed it is
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Control Groups Resource Management</h1>
|
<h1>Control Groups Resource Management</h1>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
for applying resource management to their virtual machines and containers.
|
for applying resource management to their virtual machines and containers.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="requiredControllers">Required controllers</a></h2>
|
<h2><a name="requiredControllers">Required controllers</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The control groups filesystem supports multiple "controllers". By default
|
The control groups filesystem supports multiple "controllers". By default
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
which use them will cease to operate.
|
which use them will cease to operate.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="currentLayout">Current cgroups layout</a></h2>
|
<h2><a name="currentLayout">Current cgroups layout</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
As of libvirt 1.0.5 or later, the cgroups layout created by libvirt has been
|
As of libvirt 1.0.5 or later, the cgroups layout created by libvirt has been
|
||||||
@@ -63,14 +63,14 @@
|
|||||||
in two, one describing systemd hosts and the other non-systemd hosts.
|
in two, one describing systemd hosts and the other non-systemd hosts.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="currentLayoutSystemd">Systemd cgroups integration</a></h3>
|
<h3><a name="currentLayoutSystemd">Systemd cgroups integration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
On hosts which use systemd, each consumer maps to a systemd scope unit,
|
On hosts which use systemd, each consumer maps to a systemd scope unit,
|
||||||
while partitions map to a system slice unit.
|
while partitions map to a system slice unit.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4><a id="systemdScope">Systemd scope naming</a></h4>
|
<h4><a name="systemdScope">Systemd scope naming</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The systemd convention is for the scope name of virtual machines / containers
|
The systemd convention is for the scope name of virtual machines / containers
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
The scope names map directly to the cgroup directory names.
|
The scope names map directly to the cgroup directory names.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4><a id="systemdSlice">Systemd slice naming</a></h4>
|
<h4><a name="systemdSlice">Systemd slice naming</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The systemd convention for slice naming is that a slice should include the
|
The systemd convention for slice naming is that a slice should include the
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
by libvirt will be associated with <code>machine.slice</code> by default.
|
by libvirt will be associated with <code>machine.slice</code> by default.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4><a id="systemdLayout">Systemd cgroup layout</a></h4>
|
<h4><a name="systemdLayout">Systemd cgroup layout</a></h4>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Given this, a possible systemd cgroups layout involving 3 qemu guests,
|
Given this, a possible systemd cgroups layout involving 3 qemu guests,
|
||||||
@@ -145,7 +145,7 @@ $ROOT
|
|||||||
+- machine-lxc\x2dcontainer3.scope
|
+- machine-lxc\x2dcontainer3.scope
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="currentLayoutGeneric">Non-systemd cgroups layout</a></h3>
|
<h3><a name="currentLayoutGeneric">Non-systemd cgroups layout</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
On hosts which do not use systemd, each consumer has a corresponding cgroup
|
On hosts which do not use systemd, each consumer has a corresponding cgroup
|
||||||
@@ -206,7 +206,7 @@ $ROOT
|
|||||||
+- container3.libvirt-lxc
|
+- container3.libvirt-lxc
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="customPartiton">Using custom partitions</a></h2>
|
<h2><a name="customPartiton">Using custom partitions</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If there is a need to apply resource constraints to groups of
|
If there is a need to apply resource constraints to groups of
|
||||||
@@ -221,11 +221,11 @@ $ROOT
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<resource>
|
<resource>
|
||||||
<partition>/machine/production</partition>
|
<partition>/machine/production</partition>
|
||||||
</resource>
|
</resource>
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -255,7 +255,7 @@ $ROOT
|
|||||||
later in this document did not support customization per guest.
|
later in this document did not support customization per guest.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="createSystemd">Creating custom partitions (systemd)</a></h3>
|
<h3><a name="createSystemd">Creating custom partitions (systemd)</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Given the XML config above, the admin on a systemd based host would
|
Given the XML config above, the admin on a systemd based host would
|
||||||
@@ -272,7 +272,7 @@ EOF
|
|||||||
# systemctl start machine-testing.slice
|
# systemctl start machine-testing.slice
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="createNonSystemd">Creating custom partitions (non-systemd)</a></h3>
|
<h3><a name="createNonSystemd">Creating custom partitions (non-systemd)</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Given the XML config above, the admin on a non-systemd based host
|
Given the XML config above, the admin on a non-systemd based host
|
||||||
@@ -291,7 +291,7 @@ EOF
|
|||||||
done
|
done
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="resourceAPIs">Resource management APIs/commands</a></h2>
|
<h2><a name="resourceAPIs">Resource management APIs/commands</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Since libvirt aims to provide an API which is portable across
|
Since libvirt aims to provide an API which is portable across
|
||||||
@@ -354,7 +354,7 @@ swap_hard_limit: unlimited
|
|||||||
network interfaces.
|
network interfaces.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="legacyLayout">Legacy cgroups layout</a></h2>
|
<h2><a name="legacyLayout">Legacy cgroups layout</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Prior to libvirt 1.0.5, the cgroups layout created by libvirt was different
|
Prior to libvirt 1.0.5, the cgroups layout created by libvirt was different
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1><a id="installation">libvirt Installation</a></h1>
|
<h1><a name="installation">libvirt Installation</a></h1>
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="compiling">Compiling a release tarball</a></h2>
|
<h2><a name="compiling">Compiling a release tarball</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
libvirt uses the standard configure/make/install steps:
|
libvirt uses the standard configure/make/install steps:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
|
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
|
||||||
$ cd libvirt-x.x.x
|
$ cd libvirt-x.x.x
|
||||||
$ ./configure</pre>
|
$ ./configure</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <i>configure</i> script can be given options to change its default
|
The <i>configure</i> script can be given options to change its default
|
||||||
@@ -28,7 +28,7 @@ $ ./configure</pre>
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ ./configure <i>--help</i></pre>
|
$ ./configure <i>--help</i></pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When you have determined which options you want to use (if any),
|
When you have determined which options you want to use (if any),
|
||||||
@@ -49,16 +49,16 @@ $ ./configure <i>--help</i></pre>
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ ./configure <i>[possible options]</i>
|
$ ./configure <i>[possible options]</i>
|
||||||
$ make
|
$ make
|
||||||
$ <b>sudo</b> <i>make install</i></pre>
|
$ <b>sudo</b> <i>make install</i></pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
At this point you <b>may</b> have to run ldconfig or a similar utility
|
At this point you <b>may</b> have to run ldconfig or a similar utility
|
||||||
to update your list of installed shared libs.
|
to update your list of installed shared libs.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="building">Building from a GIT checkout</a></h2>
|
<h2><a name="building">Building from a GIT checkout</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt build process uses GNU autotools, so after obtaining a
|
The libvirt build process uses GNU autotools, so after obtaining a
|
||||||
@@ -91,7 +91,7 @@ $ <b>sudo</b> <i>make install</i></pre>
|
|||||||
drive or manual download, and run this any time libvirt.git
|
drive or manual download, and run this any time libvirt.git
|
||||||
updates the commit stored in the .gnulib submodule:</p>
|
updates the commit stored in the .gnulib submodule:</p>
|
||||||
<pre>
|
<pre>
|
||||||
$ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
|
$ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>To build & install libvirt to your home
|
<p>To build & install libvirt to your home
|
||||||
@@ -99,9 +99,9 @@ $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ ./autogen.sh --prefix=$HOME/usr
|
$ ./autogen.sh --prefix=$HOME/usr
|
||||||
$ make
|
$ make
|
||||||
$ <b>sudo</b> make install</pre>
|
$ <b>sudo</b> make install</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Be aware though, that binaries built with a custom prefix will not
|
Be aware though, that binaries built with a custom prefix will not
|
||||||
@@ -111,8 +111,8 @@ $ <b>sudo</b> make install</pre>
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ ./autogen.sh --system
|
$ ./autogen.sh --system
|
||||||
$ make
|
$ make
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -123,9 +123,9 @@ $ make
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ su -
|
$ su -
|
||||||
# service libvirtd stop (or systemctl stop libvirtd.service)
|
# service libvirtd stop (or systemctl stop libvirtd.service)
|
||||||
# /home/to/your/checkout/daemon/libvirtd
|
# /home/to/your/checkout/daemon/libvirtd
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -134,7 +134,7 @@ $ su -
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
$ ./run ./tools/virsh ....
|
$ ./run ./tools/virsh ....
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Contacting the project contributors</h1>
|
<h1>Contacting the development team</h1>
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="security">Security Issues</a></h2>
|
<h2><a name="security">Security Issues</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If you think that an issue with libvirt may have security
|
If you think that an issue with libvirt may have security
|
||||||
@@ -18,13 +18,13 @@
|
|||||||
<a href="securityprocess.html">security process</a> instead.
|
<a href="securityprocess.html">security process</a> instead.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="email">Mailing lists</a></h2>
|
<h2><a name="email">Mailing lists</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
There are three mailing-lists:
|
There are three mailing-lists:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<dl class="mail">
|
<dl>
|
||||||
<dt><a href="https://www.redhat.com/mailman/listinfo/libvir-list">libvir-list@redhat.com</a> (for development)</dt>
|
<dt><a href="https://www.redhat.com/mailman/listinfo/libvir-list">libvir-list@redhat.com</a> (for development)</dt>
|
||||||
<dd>
|
<dd>
|
||||||
Archives at <a href="https://www.redhat.com/archives/libvir-list">https://www.redhat.com/archives/libvir-list</a>
|
Archives at <a href="https://www.redhat.com/archives/libvir-list">https://www.redhat.com/archives/libvir-list</a>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
page.
|
page.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="irc">IRC discussion</a></h2>
|
<h2><a name="irc">IRC discussion</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Some of the libvirt developers may be found on IRC on the <a href="http://oftc.net">OFTC IRC</a>
|
Some of the libvirt developers may be found on IRC on the <a href="http://oftc.net">OFTC IRC</a>
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Contributing to libvirt</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
This page provides guidance on how to contribute to the
|
|
||||||
libvirt project
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
|
||||||
|
|
||||||
<h2><a id="skills">Contributions required</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The libvirt project is always looking for new contributors to
|
|
||||||
participate in ongoing activities. While code development is a
|
|
||||||
major part of the project, assistance is needed in many other
|
|
||||||
areas including documentation writing, bug triage, testing,
|
|
||||||
application integration, website / wiki content management,
|
|
||||||
translation, branding, social media and more. The only
|
|
||||||
requirement is an interest in virtualization and desire to
|
|
||||||
help.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following is a non-exhaustive list of areas in which
|
|
||||||
people can contribute to libvirt. If you have ideas for
|
|
||||||
other contributions feel free to follow them.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><strong>Software development</strong>. The core library / daemon (and
|
|
||||||
thus the bulk of coding) is written in C, but there are
|
|
||||||
language bindings written in Python, Perl, Java, Ruby,
|
|
||||||
Php, OCaml and Go. There are also higher level wrappers
|
|
||||||
mapping libvirt into other object frameworks, such GLib,
|
|
||||||
CIM and SNMP. For those interested in working on the core parts of
|
|
||||||
libvirt, the <a href="hacking.html">contributor guidelines</a> are
|
|
||||||
mandatory reading</li>
|
|
||||||
<li><strong>Translation</strong>. All the libvirt modules aim to support
|
|
||||||
translations where appropriate. All translation is
|
|
||||||
handling outside of the normal libvirt review process,
|
|
||||||
using the <a href="http://fedora.zanata.org">Fedora
|
|
||||||
instance</a> of the Zanata tool. Thus people wishing
|
|
||||||
to contribute to translation should join the Fedora
|
|
||||||
translation team</li>
|
|
||||||
<li><strong>Documentation</strong>. There are docbook guides on various
|
|
||||||
aspects of libvirt, particularly application development
|
|
||||||
guides for the C library and Python, and a virsh command
|
|
||||||
reference. There is thus scope for work by people who are
|
|
||||||
familiar with using or developing against libvirt, to
|
|
||||||
write further content for these guides. There is also a
|
|
||||||
need for people to review existing content for copy editing
|
|
||||||
and identifying gaps in the docs</li>
|
|
||||||
<li><strong>Website / wiki curation</strong>. The bulk of the website is
|
|
||||||
maintained in the primary GIT repository, while the wiki
|
|
||||||
site uses mediawiki. In both cases there is a need for
|
|
||||||
people to both write new content and curate existing
|
|
||||||
content to identify outdated information, improve its
|
|
||||||
organization and target gaps.</li>
|
|
||||||
<li><strong>Testing</strong>. There are a number of tests suites that can run
|
|
||||||
automated tests against libvirt. The coverage of the tests
|
|
||||||
is never complete, so there is a need for people to create
|
|
||||||
new test suites and / or provide environments to actually
|
|
||||||
run the tests in a variety of deployment scenarios.</li>
|
|
||||||
<li><strong>Code analysis</strong>. The libvirt project has access to the coverity
|
|
||||||
tool to run static analysis against the codebase, however,
|
|
||||||
there are other types of code analysis that can be useful.
|
|
||||||
In particular fuzzing of the inputs can be very effective
|
|
||||||
at identifying problematic edge cases.</li>
|
|
||||||
<li><strong>Security handling</strong>. Downstream (operating system) vendors
|
|
||||||
who distribute libvirt may wish to propose a person to
|
|
||||||
be part of the security handling team, to get early access
|
|
||||||
to information about forthcoming vulnerability fixes.</li>
|
|
||||||
<li><strong>Evangalism</strong>. Work done by the project is of no benefit
|
|
||||||
unless the (potential) user community knows that it
|
|
||||||
exists. Thus it is critically important to the health
|
|
||||||
and future growth of the project, that there are a people
|
|
||||||
who evangalise the work created by the project. This can
|
|
||||||
take many forms, writing blog posts (about usage of features,
|
|
||||||
personal user experiances, areas for future work, and more),
|
|
||||||
syndicating docs and blogs via social media, giving user
|
|
||||||
group and/or conference talks about libvirt.</li>
|
|
||||||
<li><strong>User assistance</strong>. Since documentation
|
|
||||||
is never perfect, there are inevitably cases where users
|
|
||||||
will struggle to attain a deployment goal they have, or
|
|
||||||
run into trouble with managing an existing deployment.
|
|
||||||
While some users may be able to contact a software vendor
|
|
||||||
to obtain support, it is common to rely on community help
|
|
||||||
forums such as <a href="contact.html#email">libvirt users
|
|
||||||
mailing list</a>, or sites such as
|
|
||||||
<a href="http://stackoverflow.com/questions/tagged/libvirt">stackoverflow.</a>
|
|
||||||
People who are familiar with libvirt and have ability &
|
|
||||||
desire to help other users are encouraged to participate in
|
|
||||||
these help forums.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2><a id="comms">Communication</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For full details on contacting other project contributors
|
|
||||||
read the <a href="contact.html">contact</a> page. There
|
|
||||||
are two main channels that libvirt uses for communication
|
|
||||||
between contributors:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a id="email">Mailing lists</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The project has a number of
|
|
||||||
<a href="contact.html#email">mailing lists</a> for
|
|
||||||
general communication between contributors.
|
|
||||||
In general any design discussions and review
|
|
||||||
of contributions will take place on the mailing
|
|
||||||
lists, so it is important for all contributors
|
|
||||||
to follow the traffic.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a id="irc">Instant messaging / chat</a></h3>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Contributors to libvirt are encouraged to join the
|
|
||||||
<a href="contact.html#irc">IRC channel</a> used by
|
|
||||||
the project, where they can have live conversations
|
|
||||||
with others members.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a id="outreach">Student / outreach coding programs</a></h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Since 2016, the libvirt project directly participates as an
|
|
||||||
organization in the <a href="http://wiki.libvirt.org/page/Google_Summer_of_Code_Ideas">Google Summer of Code program</a>. Prior to
|
|
||||||
this the project had a number of students in the program
|
|
||||||
via a joint application with the QEMU project. People are
|
|
||||||
encouraged to look at both the libvirt and QEMU programs
|
|
||||||
to identify potentially interesting projects to work on.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>C# API bindings</h1>
|
<h1>C# API bindings</h1>
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="description">Description</a></h2>
|
<h2><a name="description">Description</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The C# libvirt bindings are a class library. They use a Microsoft
|
The C# libvirt bindings are a class library. They use a Microsoft
|
||||||
@@ -19,7 +19,9 @@
|
|||||||
to libvirt.
|
to libvirt.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="requirements">Requirements</a></h2>
|
<p> </p>
|
||||||
|
|
||||||
|
<h2><a name="requirements">Requirements</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
These bindings depend upon the libvirt libraries being installed.
|
These bindings depend upon the libvirt libraries being installed.
|
||||||
@@ -29,8 +31,10 @@
|
|||||||
compiling libvirt for windows.
|
compiling libvirt for windows.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
|
||||||
<!-- 2010-10-19 JC: Commented out until we have C# tarballs to download
|
<!-- 2010-10-19 JC: Commented out until we have C# tarballs to download
|
||||||
<h2><a id="getting">Getting them</a></h2>
|
<h2><a name="getting">Getting them</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The latest versions of the libvirt C# bindings can be downloaded from:
|
The latest versions of the libvirt C# bindings can be downloaded from:
|
||||||
@@ -38,15 +42,15 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="ftp://libvirt.org/libvirt/csharp/">libvirt.org FTP server</a></li>
|
<li><a href="ftp://libvirt.org/libvirt/csharp/">libvirt.org FTP server</a></li>
|
||||||
<li><a href="https://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li>
|
<li><a href="http://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<h2><a id="git">GIT source repository</a></h2>
|
<h2><a name="git">GIT source repository</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The C# bindings source code is maintained in a <a
|
The C# bindings source code is maintained in a <a
|
||||||
href="http://git-scm.com/">git</a> repository available on
|
href="http://git-scm.com/">git</a> repository available on
|
||||||
<a href="https://libvirt.org/git/">libvirt.org</a>:
|
<a href="http://libvirt.org/git/">libvirt.org</a>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@@ -58,10 +62,12 @@ git clone git://libvirt.org/libvirt-csharp.git
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">https://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a>
|
<a href="http://libvirt.org/git/?p=libvirt-csharp.git;a=summary">http://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="usage">Usage</a></h2>
|
<p> </p>
|
||||||
|
|
||||||
|
<h2><a name="usage">Usage</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt C# bindings class library exposes the <b>Libvirt</b>
|
The libvirt C# bindings class library exposes the <b>Libvirt</b>
|
||||||
@@ -110,15 +116,19 @@ git clone git://libvirt.org/libvirt-csharp.git
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="authors">Authors</a></h2>
|
<p> </p>
|
||||||
|
|
||||||
|
<h2><a name="authors">Authors</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The C# bindings are the work of Arnaud Champion
|
The C# bindings are the work of Arnaud Champion
|
||||||
<<a href="mailto:arnaud.champion AT devatom.fr">arnaud.champion AT devatom.fr</a>>,
|
<<a href="mailto:arnaud.champion AT devatom.fr">arnaud.champion AT devatom.fr</a>>,
|
||||||
based upon the previous work of Jaromír Červenka.
|
based upon the previous work of Jaromír Červenka.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="notes">Test Configuration</a></h2>
|
<p> </p>
|
||||||
|
|
||||||
|
<h2><a name="notes">Test Configuration</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Testing is performed using the following configurations:
|
Testing is performed using the following configurations:
|
||||||
@@ -129,85 +139,87 @@ git clone git://libvirt.org/libvirt-csharp.git
|
|||||||
<li>Ubuntu 10.10 amd64 / Mono 2.6.7 (compiled in 64 bits)</li>
|
<li>Ubuntu 10.10 amd64 / Mono 2.6.7 (compiled in 64 bits)</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="type">Type Coverage</a></h2>
|
<p> </p>
|
||||||
|
|
||||||
|
<h2><a name="type">Type Coverage</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Coverage of the libvirt types is:
|
Coverage of the libvirt types is:
|
||||||
</p>
|
</p>
|
||||||
<table class="top_table">
|
<table class="top_table">
|
||||||
<tr><th>Type</th><th>Name</th><th>Binding?</th><th>Tested?</th><th>Sample Code?</th><th>Works?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
<tr><th>Type</th><th>Name</th><th>Binding?</th><th>Tested?</th><th>Sample Code?</th><th>Works?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
||||||
<tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virConnectAuth</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virConnectAuth</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>struct</td><td>virConnectCredential</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virConnectCredential</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virConnectCredentialType</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virConnectCredentialType</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virConnectFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virConnectFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainBlockStatsInfo</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virDomainBlockStatsInfo</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventDefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventDefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventID</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainEventID</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventResumedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventResumedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventStartedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventStartedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventStoppedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventStoppedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventSuspendedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventSuspendedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventUndefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virDomainEventUndefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainInfo</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virDomainInfo</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>struct</td><td>virDomainInterfaceStatsStruct</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virDomainInterfaceStatsStruct</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainJobType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainJobType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virEventHandleType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>enum</td><td>virEventHandleType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virNWFilter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virNWFilter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virSchedParameter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virSchedParameter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virSecret</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virSecret</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virSecurityModel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virSecurityModel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virStream</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virStream</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStreamEventType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStreamEventType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virStreamFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virStreamFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>enum</td><td>virVcpuState</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>enum</td><td>virVcpuState</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>struct</td><td>virError</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>struct</td><td>virError</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p></p>
|
<p> </p>
|
||||||
|
|
||||||
<h2><a id="funccover">Function Coverage</a></h2>
|
<h2><a name="funccover">Function Coverage</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Coverage of the libvirt functions is:
|
Coverage of the libvirt functions is:
|
||||||
@@ -215,274 +227,274 @@ git clone git://libvirt.org/libvirt-csharp.git
|
|||||||
<table class="top_table">
|
<table class="top_table">
|
||||||
<tr><th>Name</th><th>Binding?</th><th>Type?</th><th>Tested?</th><th>Sample Code?</th><th>Working?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
<tr><th>Name</th><th>Binding?</th><th>Type?</th><th>Tested?</th><th>Sample Code?</th><th>Working?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
|
||||||
<tr><td>virConnectAuthCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectAuthCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectClose</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectClose</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventRegister</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectDomainEventRegister</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectListDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectListDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes, if the host handle the method</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes, if the host handle the method</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectListStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectListStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectNumOfDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectNumOfDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectNumOfDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectNumOfStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectNumOfStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectOpen</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen, virEventRegisterImpl, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectOpen</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen, virEventRegisterImpl, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectOpenAuth</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnectOpenAuth</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainBlockStats</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainBlockStats</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetName</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainGetName</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainInterfaceStats </td><td>No</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainInterfaceStats </td><td>No</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainLookupByID</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainLookupByID</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virDomainLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainManagedSave </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainManagedSave </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainMigrate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainMigrate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainMigrateToURI </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainMigrateToURI </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainRef </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainRef </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSetMaxMemory </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSetMaxMemory </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventHandleCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virEventHandleCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virEventRegisterImpl</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virEventRegisterImpl</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventTimeoutCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virEventTimeoutCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virFreeCallback</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virFreeCallback</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceRef </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterRef </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretFree </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretFree </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetUUIDString </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetUUIDString </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretSetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretSetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virSecretUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virSecretUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetConnect </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetConnect </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>No</td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>No</td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamAbort </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamAbort </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamFinish </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamFinish </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamFree </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamFree </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamNew</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamNew</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamRecv</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamRecv</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamSend</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamSend</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamSendAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamSendAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
|
<tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
|
||||||
<tr><td>virGetLastError</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virGetLastError</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virConnSetErrorFunc</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virConnSetErrorFunc</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
<tr><td>virErrorFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
<tr><td>virErrorFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
|
||||||
|
|||||||
50
docs/deployment.html.in
Normal file
50
docs/deployment.html.in
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?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>Deployment</h1>
|
||||||
|
|
||||||
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
|
<h2><a name="packages">Pre-packaged releases</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The libvirt API is now available in all major Linux distributions,
|
||||||
|
so the simplest deployment approach is to use your distributions'
|
||||||
|
package management software to install the <code>libvirt</code>
|
||||||
|
module.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="tarball">Self-built releases</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
libvirt uses GNU autotools for its build system, so deployment
|
||||||
|
follows the usual process of <code>configure; make ; make install</code>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
# ./configure --prefix=$HOME/usr
|
||||||
|
# make
|
||||||
|
# make install
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="git">Built from GIT</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When building from GIT it is necessary to generate the autotools
|
||||||
|
support files. This requires having <code>autoconf</code>,
|
||||||
|
<code>automake</code>, <code>libtool</code> and <code>intltool</code>
|
||||||
|
installed. The process can be automated with the <code>autogen.sh</code>
|
||||||
|
script.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
# ./autogen.sh --prefix=$HOME/usr
|
||||||
|
# make
|
||||||
|
# make install
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>libvirt Application Development Guides</h1>
|
<h1>libvirt Application Development Guides</h1>
|
||||||
@@ -12,10 +12,10 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li>
|
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li>
|
||||||
<li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li>
|
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li>
|
||||||
<li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li>
|
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li>
|
||||||
<li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li>
|
<li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2>Contributing content</h2>
|
<h2>Contributing content</h2>
|
||||||
@@ -28,14 +28,14 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
# C language
|
# C language
|
||||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a>
|
$ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a>
|
||||||
|
|
||||||
# Python language
|
# Python language
|
||||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a>
|
$ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a>
|
||||||
|
|
||||||
# Publican Style/Theme
|
# Publican Style/Theme
|
||||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a>
|
$ git clone <a href="http://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -566,8 +566,8 @@ initially for the <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.
|
|||||||
paravirtualization</a> but should be able to integrate other virtualization
|
paravirtualization</a> but should be able to integrate other virtualization
|
||||||
mechanisms if needed.</p>
|
mechanisms if needed.</p>
|
||||||
<p> If you get lost searching for some specific API use, try
|
<p> If you get lost searching for some specific API use, try
|
||||||
<a href="https://libvirt.org/search.php">the online search
|
<a href="http://libvirt.org/search.php">the online search
|
||||||
engine</a> hosted on <a href="https://libvirt.org/">libvirt.org</a>
|
engine</a> hosted on <a href="http://libvirt.org/">libvirt.org</a>
|
||||||
it indexes the project page, the APIs as well as the mailing-list archives. </p>
|
it indexes the project page, the APIs as well as the mailing-list archives. </p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,169 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body class="docs">
|
<body>
|
||||||
<div class="panel">
|
<h1>Documentation</h1>
|
||||||
<h2>Deployment / operation</h2>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="apps.html">Applications</a></dt>
|
|
||||||
<dd>Applications known to use libvirt</dd>
|
|
||||||
|
|
||||||
<dt><a href="windows.html">Windows</a></dt>
|
|
||||||
<dd>Downloads for Windows</dd>
|
|
||||||
|
|
||||||
<dt><a href="migration.html">Migration</a></dt>
|
|
||||||
<dd>Migrating guests between machines</dd>
|
|
||||||
|
|
||||||
<dt><a href="remote.html">Remote access</a></dt>
|
|
||||||
<dd>Enable remote access over TCP</dd>
|
|
||||||
|
|
||||||
<dt><a href="auth.html">Authentication</a></dt>
|
|
||||||
<dd>Configure authentication for the libvirt daemon</dd>
|
|
||||||
|
|
||||||
<dt><a href="acl.html">Access control</a></dt>
|
|
||||||
<dd>Configure access control libvirt APIs with <a href="aclpolkit.html">polkit</a></dd>
|
|
||||||
|
|
||||||
<dt><a href="logging.html">Logging</a></dt>
|
|
||||||
<dd>The library and the daemon logging support</dd>
|
|
||||||
|
|
||||||
<dt><a href="auditlog.html">Audit log</a></dt>
|
|
||||||
<dd>Audit trail logs for host operations</dd>
|
|
||||||
|
|
||||||
<dt><a href="firewall.html">Firewall</a></dt>
|
|
||||||
<dd>Firewall and network filter configuration</dd>
|
|
||||||
|
|
||||||
<dt><a href="hooks.html">Hooks</a></dt>
|
|
||||||
<dd>Hooks for system specific management</dd>
|
|
||||||
|
|
||||||
<dt><a href="nss.html">NSS module</a></dt>
|
|
||||||
<dd>Enable domain host name translation to IP addresses</dd>
|
|
||||||
|
|
||||||
<dt><a href="http://wiki.libvirt.org/page/FAQ">FAQ</a></dt>
|
|
||||||
<dd>Frequently asked questions</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel">
|
|
||||||
<h2>Application development</h2>
|
|
||||||
<dl>
|
|
||||||
<dt><a href="devguide.html">Development Guide</a></dt>
|
|
||||||
<dd>A guide and reference for developing with libvirt</dd>
|
|
||||||
|
|
||||||
<dt><a href="virshcmdref.html">Virsh Commands</a></dt>
|
|
||||||
<dd>Command reference for virsh</dd>
|
|
||||||
|
|
||||||
<dt><a href="bindings.html">Language bindings</a></dt>
|
|
||||||
<dd>Bindings of the libvirt API for
|
|
||||||
<a href="csharp.html">c#</a>,
|
|
||||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go">go</a>,
|
|
||||||
<a href="java.html">java</a>,
|
|
||||||
<a href="https://libvirt.org/ocaml/">ocaml</a>.
|
|
||||||
<a href="http://search.cpan.org/dist/Sys-Virt/">perl</a>,
|
|
||||||
<a href="python.html">python</a>,
|
|
||||||
<a href="php.html">php</a>,
|
|
||||||
<a href="https://libvirt.org/ruby/">ruby</a></dd>
|
|
||||||
|
|
||||||
|
|
||||||
<dt><a href="format.html">XML schemas</a></dt>
|
|
||||||
<dd>Description of the XML schemas for
|
|
||||||
<a href="formatdomain.html">domains</a>,
|
|
||||||
<a href="formatnetwork.html">networks</a>,
|
|
||||||
<a href="formatnwfilter.html">network filtering</a>,
|
|
||||||
<a href="formatstorage.html">storage</a>,
|
|
||||||
<a href="formatstorageencryption.html">storage encryption</a>,
|
|
||||||
<a href="formatcaps.html">capabilities</a>,
|
|
||||||
<a href="formatdomaincaps.html">domain capabilities</a>,
|
|
||||||
<a href="formatnode.html">node devices</a>,
|
|
||||||
<a href="formatsecret.html">secrets</a>,
|
|
||||||
<a href="formatsnapshot.html">snapshots</a></dd>
|
|
||||||
|
|
||||||
<dt><a href="uri.html">URI format</a></dt>
|
|
||||||
<dd>The URI formats used for connecting to libvirt</dd>
|
|
||||||
|
|
||||||
<dt><a href="locking.html">Disk locking</a></dt>
|
|
||||||
<dd>Ensuring exclusive guest access to disks with
|
|
||||||
<a href="locking-lockd.html">virtlockd</a> or
|
|
||||||
<a href="locking-sanlock.html">Sanlock</a></dd>
|
|
||||||
|
|
||||||
<dt><a href="cgroups.html">CGroups</a></dt>
|
|
||||||
<dd>Control groups integration</dd>
|
|
||||||
|
|
||||||
<dt><a href="html/index.html">API reference</a></dt>
|
|
||||||
<dd>Reference manual for the C public API, split in
|
|
||||||
<a href="html/libvirt-libvirt-common.html">common</a>,
|
|
||||||
<a href="html/libvirt-libvirt-domain.html">domain</a>,
|
|
||||||
<a href="html/libvirt-libvirt-domain-snapshot.html">domain snapshot</a>,
|
|
||||||
<a href="html/libvirt-virterror.html">error</a>,
|
|
||||||
<a href="html/libvirt-libvirt-event.html">event</a>,
|
|
||||||
<a href="html/libvirt-libvirt-host.html">host</a>,
|
|
||||||
<a href="html/libvirt-libvirt-interface.html">interface</a>,
|
|
||||||
<a href="html/libvirt-libvirt-network.html">network</a>,
|
|
||||||
<a href="html/libvirt-libvirt-nodedev.html">node device</a>,
|
|
||||||
<a href="html/libvirt-libvirt-nwfilter.html">network filter</a>,
|
|
||||||
<a href="html/libvirt-libvirt-secret.html">secret</a>,
|
|
||||||
<a href="html/libvirt-libvirt-storage.html">storage</a>,
|
|
||||||
<a href="html/libvirt-libvirt-stream.html">stream</a>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><a href="drivers.html">Drivers</a></dt>
|
|
||||||
<dd>Hypervisor specific driver information</dd>
|
|
||||||
|
|
||||||
<dt><a href="support.html">Support guarantees</a></dt>
|
|
||||||
<dd>Details of support status for various interfaces</dd>
|
|
||||||
|
|
||||||
<dt><a href="hvsupport.html">Driver support</a></dt>
|
|
||||||
<dd>matrix of API support per hypervisor per release</dd>
|
|
||||||
|
|
||||||
<dt><a href="secureusage.html">Secure usage</a></dt>
|
|
||||||
<dd>Secure usage of the libvirt APIs</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel">
|
|
||||||
<h2>Project development</h2>
|
|
||||||
<dl>
|
|
||||||
<dt><a href="hacking.html">Contributor guidelines</a></dt>
|
|
||||||
<dd>General hacking guidelines for contributors</dd>
|
|
||||||
|
|
||||||
<dt><a href="bugs.html">Bug reports</a></dt>
|
|
||||||
<dd>How and where to report bugs and request features</dd>
|
|
||||||
|
|
||||||
<dt><a href="compiling.html">Compiling</a></dt>
|
|
||||||
<dd>How to compile libvirt</dd>
|
|
||||||
|
|
||||||
<dt><a href="goals.html">Goals</a></dt>
|
|
||||||
<dd>Terminology and goals of libvirt API</dd>
|
|
||||||
|
|
||||||
<dt><a href="api.html">API concepts</a></dt>
|
|
||||||
<dd>The libvirt API concepts</dd>
|
|
||||||
|
|
||||||
<dt><a href="api_extension.html">API extensions</a></dt>
|
|
||||||
<dd>Adding new public libvirt APIs</dd>
|
|
||||||
|
|
||||||
<dt><a href="internals/eventloop.html">Event loop and worker pool</a></dt>
|
|
||||||
<dd>Libvirt's event loop and worker pool mode</dd>
|
|
||||||
|
|
||||||
<dt><a href="internals/command.html">Spawning commands</a></dt>
|
|
||||||
<dd>Spawning commands from libvirt driver code</dd>
|
|
||||||
|
|
||||||
<dt><a href="internals/rpc.html">RPC protocol & APIs</a></dt>
|
|
||||||
<dd>RPC protocol information and API / dispatch guide</dd>
|
|
||||||
|
|
||||||
<dt><a href="internals/locking.html">Lock managers</a></dt>
|
|
||||||
<dd>Use lock managers to protect disk content</dd>
|
|
||||||
|
|
||||||
<dt><a href="internals/oomtesting.html">Out of memory testing</a></dt>
|
|
||||||
<dd>Simulating OOM conditions in the test suite</dd>
|
|
||||||
|
|
||||||
<dt><a href="testsuites.html">Functional testing</a></dt>
|
|
||||||
<dd>Testing libvirt with <a href="testtck.html">TCK test suite</a> and
|
|
||||||
<a href="testapi.html">Libvirt-test-API</a></dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br class="clear"/>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,424 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Downloads</h1>
|
<h1>Downloads</h1>
|
||||||
|
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
|
|
||||||
<h2><a id="releases">Project modules</a></h2>
|
<h2><a name="releases">Official Releases</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt project maintains a number of inter-related modules beyond
|
The latest versions of the libvirt C library can be downloaded from:
|
||||||
the core C library/daemon.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<table class="top_table downloads">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Module</th>
|
|
||||||
<th>Releases</th>
|
|
||||||
<th>GIT Repo</th>
|
|
||||||
<th>GIT Mirrors</th>
|
|
||||||
<th>Resources</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>libvirt</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt">github</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="html/index.html">api ref</a>
|
|
||||||
<a href="news.html">changes</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th colspan="7">Language bindings</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>C#</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/csharp/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/csharp/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-csharp">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-csharp">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Go</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/go/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/go/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-go.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-go">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-go">github</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go">api ref</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Java</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/java/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/java/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-java.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-java">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-java">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>OCaml</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/ocaml/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/ocaml/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-ocaml.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-ocaml">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-ocaml">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Perl (Sys::Virt)</td>
|
|
||||||
<td>
|
|
||||||
<a href="http://search.cpan.org/dist/Sys-Virt/">cpan</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-perl.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-perl">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-perl">github</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="http://search.cpan.org/dist/Sys-Virt/">api ref</a>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-perl.git;a=blob;f=Changes;hb=HEAD">changes</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>PHP</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/php/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/php/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-php.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-php">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-php">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Python</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/python/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/python/">https</a>
|
|
||||||
<a href="https://pypi.python.org/pypi/libvirt-python">pypi</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-python.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-python">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-python">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Ruby</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/ruby/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/ruby/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=ruby-libvirt.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/ruby-libvirt">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/ruby-libvirt">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Rust</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/rust/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/rust/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-rust.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-rust">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-rust">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th colspan="7">Integration modules</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>GLib / GConfig / GObject</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/glib/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/glib/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-glib.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-glib">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-glib">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Go XML</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/go/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/go/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-go-xml.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-go-xml">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-go-xml">github</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go-xml">api ref</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Console Proxy</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/consoleproxy/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/consoleproxy/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-console-proxy.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-console-proxy">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-console-proxy">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>CIM provider</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/CIM/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/CIM/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-cim.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-cim">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-cim">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>CIM utils</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/CIM/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/CIM/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libcmpiutil.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libcmpiutil">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libcmpiutil">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>SNMP</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/snmp/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/snmp/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-snmp.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-snmp">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-snmp">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Application Sandbox</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/sandbox/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/sandbox/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-sandbox.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-sandbox">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-sandbox">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th colspan="7">Testing</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>TCK</td>
|
|
||||||
<td>
|
|
||||||
<a href="ftp://libvirt.org/libvirt/tck/">ftp</a>
|
|
||||||
<a href="https://libvirt.org/sources/tck/">https</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-tck.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-tck">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-tck">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Test API</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-test-API.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-test-API">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-test-API">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Jenkins Config</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-jenkins-ci.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-jenkins-ci">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-jenkins-ci">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>CIM Test</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=cimtest.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/cimtest">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/cimtest">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th colspan="7">Documentation</th>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Publican Brand</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-publican.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-publican">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-publican">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>App Development Guide</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-appdev-guide">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-appdev-guide">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>App Development Guide Python</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-appdev-guide-python">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-appdev-guide-python">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>virsh Command Reference</td>
|
|
||||||
<td></td>
|
|
||||||
<td>
|
|
||||||
<a href="https://libvirt.org/git/?p=libvirt-virshcmdref.git;a=summary">libvirt</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a href="https://gitlab.com/libvirt/libvirt-virshcmdref">gitlab</a>
|
|
||||||
<a href="https://github.com/libvirt/libvirt-virshcmdref">github</a>
|
|
||||||
</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h2>Primary download site</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Most modules have releases made available for download on the project
|
|
||||||
site, via FTP, HTTP or HTTPS. Some modules are instead made available
|
|
||||||
at alternative locations, for example, the Perl binding is made
|
|
||||||
available only on CPAN.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="ftp://libvirt.org/libvirt/">libvirt.org FTP server</a></li>
|
<li><a href="ftp://libvirt.org/libvirt/">libvirt.org FTP server</a></li>
|
||||||
<li><a href="https://libvirt.org/sources/">libvirt.org HTTP server</a></li>
|
<li><a href="http://libvirt.org/sources/">libvirt.org HTTP server</a></li>
|
||||||
<li><a href="https://libvirt.org/sources/">libvirt.org HTTPS server</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="hourly">Hourly development snapshots</a></h2>
|
<h2><a name="hourly">Hourly development snapshots</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Once an hour, an automated snapshot is made from the git server
|
Once an hour, an automated snapshot is made from the git server
|
||||||
@@ -430,31 +29,29 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.xz">libvirt.org FTP server</a></li>
|
<li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.xz">libvirt.org FTP server</a></li>
|
||||||
<li><a href="https://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li>
|
<li><a href="http://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="schedule">Primary release schedule</a></h2>
|
<h2><a name="schedule">Primary release schedule</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The core libvirt module follows a time based plan, with releases made
|
Libvirt follows a time based plan, with releases made once a month
|
||||||
once a month on the 1st of each month give or take a few days. The only
|
on the 1st of each month give or take a few days. The only exception
|
||||||
exception is at the start of the year where there are two 6 weeks gaps
|
is at the start of the year where there are two 6 weeks gaps (first
|
||||||
(first release in the middle of Jan, then skip the Feb release), giving
|
release in the middle of Jan, then skip the Feb release), giving
|
||||||
a total of 11 releases a year. The Python and Perl modules will aim to
|
a total of 11 releases a year.
|
||||||
release at the same time as the core libvirt module. Other modules have
|
|
||||||
independant ad-hoc releases with no fixed time schedle.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="numbering">Release numbering</a></h2>
|
<h2><a name="numbering">Release numbering</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Since libvirt 2.0.0, a time based version numbering rule
|
Since libvirt 2.0.0, a time based version numbering rule
|
||||||
is applied to the core library releases. As such, the changes
|
is applied. As such, the changes in version number have
|
||||||
in version number have do not have any implications with respect
|
do not have any implications with respect to the scope of
|
||||||
to the scope of features or bugfixes included, the stability of
|
features or bugfixes included, the stability of the code,
|
||||||
the code, or the API / ABI compatibility (libvirt API / ABI is
|
or the API / ABI compatibility (libvirt API / ABI is guaranteed
|
||||||
guaranteed stable forever). The rules applied for changing the
|
stable forever). The rules applied for changing the libvirt
|
||||||
libvirt version number are:
|
version number are:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<dl>
|
<dl>
|
||||||
@@ -462,8 +59,7 @@
|
|||||||
<dd>incremented by 1 for the first release of the year (the
|
<dd>incremented by 1 for the first release of the year (the
|
||||||
Jan 15th release)</dd>
|
Jan 15th release)</dd>
|
||||||
<dt><code>minor</code></dt>
|
<dt><code>minor</code></dt>
|
||||||
<dd>reset to 0 with every major increment, otherwise incremented by 1
|
<dd>incremented by 1 for each monthly release from git master</dd>
|
||||||
for each monthly release from git master</dd>
|
|
||||||
<dt><code>micro</code></dt>
|
<dt><code>micro</code></dt>
|
||||||
<dd>always 0 for releases from git master, incremented by 1
|
<dd>always 0 for releases from git master, incremented by 1
|
||||||
for each stable maintenance release</dd>
|
for each stable maintenance release</dd>
|
||||||
@@ -472,18 +68,13 @@
|
|||||||
<p>
|
<p>
|
||||||
Prior to 2.0.0, the major/minor numbers were incremented
|
Prior to 2.0.0, the major/minor numbers were incremented
|
||||||
fairly arbitrarily, and maintenance releases appended a
|
fairly arbitrarily, and maintenance releases appended a
|
||||||
fourth digit. The language bindings will aim to use the
|
fourth digit.
|
||||||
same version number as the most recent core library API
|
|
||||||
they support. The other modules have their own distinct
|
|
||||||
release numbering sequence, though they generally aim
|
|
||||||
to follow the above rules for incrementing major/minor/micro
|
|
||||||
digits.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="maintenance">Maintenance releases</a></h2>
|
<h2><a name="maintenance">Maintenance releases</a></h2>
|
||||||
<p>
|
<p>
|
||||||
In the git repository are several stable maintenance branches
|
In the git repository are several stable maintenance branches,
|
||||||
for the core library, matching the
|
matching the
|
||||||
pattern <code>v<i>major</i>.<i>minor</i>-maint</code>;
|
pattern <code>v<i>major</i>.<i>minor</i>-maint</code>;
|
||||||
these branches are forked off the corresponding
|
these branches are forked off the corresponding
|
||||||
<code>v<i>major</i>.<i>minor</i>.0</code> formal
|
<code>v<i>major</i>.<i>minor</i>.0</code> formal
|
||||||
@@ -497,9 +88,7 @@
|
|||||||
to the primary releases which are made once a month, there
|
to the primary releases which are made once a month, there
|
||||||
is no formal schedule for the maintenance releases, which
|
is no formal schedule for the maintenance releases, which
|
||||||
are made whenever there is a need to make available key
|
are made whenever there is a need to make available key
|
||||||
bugfixes to downstream consumers. The language bindings
|
bugfixes to downstream consumers.
|
||||||
and other modules generally do not provide stable branch
|
|
||||||
releases.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -508,19 +97,25 @@
|
|||||||
wiki page</a>.
|
wiki page</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="git">GIT source repository</a></h2>
|
<h2><a name="git">GIT source repository</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
All modules maintained by the libvirt project have their primary
|
Libvirt code source is now maintained in a <a href="http://git-scm.com/">git</a>
|
||||||
source available in the <a href="https://libvirt.org/git/">project GIT server</a>.
|
repository available on <a href="http://libvirt.org/git/">libvirt.org</a>:
|
||||||
Each module can be cloned anonymously using:
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
git clone git://libvirt.org/[module name].git</pre>
|
git clone git://libvirt.org/libvirt.git</pre>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In addition to this primary repository, there are the following read-only git
|
It can also be browsed at:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<a href="http://libvirt.org/git/?p=libvirt.git;a=summary">http://libvirt.org/git/?p=libvirt.git;a=summary</a></pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In addition to this repository, there are the following read-only git
|
||||||
repositories which mirror the master one. Note that we currently do not
|
repositories which mirror the master one. Note that we currently do not
|
||||||
use the full set of features on these mirrors (e.g. pull requests on
|
use the full set of features on these mirrors (e.g. pull requests on
|
||||||
GitHub, so please don't use them). All patch review and discussion only
|
GitHub, so please don't use them). All patch review and discussion only
|
||||||
@@ -529,8 +124,58 @@ git clone git://libvirt.org/[module name].git</pre>
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<a href="https://github.com/libvirt/">https://github.com/libvirt/</a>
|
<a href="https://github.com/libvirt/libvirt">https://github.com/libvirt/libvirt</a>
|
||||||
<a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/</a></pre>
|
<a href="http://repo.or.cz/w/libvirt.git">http://repo.or.cz/w/libvirt.git</a>
|
||||||
|
<a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/libvirt</a></pre>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<h1>libvirt Application Development Guide</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The guide is both a learning tool for developing with libvirt and an
|
||||||
|
API reference document. It is a work in progress, composed by a
|
||||||
|
professional author from contributions written by members of the
|
||||||
|
libvirt team.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Contributions to the guide are <b>VERY</b> welcome. If you'd like to get
|
||||||
|
your name on this and demonstrate your virtualisation prowess, a solid
|
||||||
|
contribution to the content here will do it. :)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="appdevpdf">Application Development Guide PDF</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
PDF download is available here:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://libvirt.org/guide/pdf/Application_Development_Guide.pdf">libvirt App Dev Guide</a> (PDF)</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2><a name="appdevgit">Application Development Guide source GIT repository</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The source is also in a git repository:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
git clone git://libvirt.org/libvirt-appdev-guide.git</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Browsable at:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary</a></pre>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Once you've have obtained the libvirt source code, you can compile it
|
||||||
|
using the <a href="compiling.html">instructions here</a>.
|
||||||
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Internal drivers</h1>
|
<h1>Internal drivers</h1>
|
||||||
|
|
||||||
<ul>
|
<ul id="toc"></ul>
|
||||||
<li><a href="#hypervisor">Hypervisor drivers</a></li>
|
|
||||||
<li><a href="#storage">Storage drivers</a></li>
|
|
||||||
<li><a href="drvnodedev.html">Node device driver</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt public API delegates its implementation to one or
|
The libvirt public API delegates its implementation to one or
|
||||||
@@ -18,7 +14,7 @@
|
|||||||
network and storage driver active.
|
network and storage driver active.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="hypervisor">Hypervisor drivers</a></h2>
|
<h2><a name="hypervisor">Hypervisor drivers</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The hypervisor drivers currently supported by libvirt are:
|
The hypervisor drivers currently supported by libvirt are:
|
||||||
@@ -40,7 +36,7 @@
|
|||||||
<li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
|
<li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="storage">Storage drivers</a></h2>
|
<h2><a name="storage">Storage drivers</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong><a href="storage.html#StorageBackendDir">Directory backend</a></strong></li>
|
<li><strong><a href="storage.html#StorageBackendDir">Directory backend</a></strong></li>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Bhyve driver</h1>
|
<h1>Bhyve driver</h1>
|
||||||
@@ -13,25 +13,14 @@ of bhyve are supported.
|
|||||||
|
|
||||||
In order to enable bhyve on your FreeBSD host, you'll need to load the <code>vmm</code>
|
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
|
kernel module. Additionally, <code>if_tap</code> and <code>if_bridge</code> modules
|
||||||
should be loaded for networking support. Also, <span class="since">since 3.2.0</span> the
|
should be loaded for networking support.
|
||||||
<code>virt-host-validate(1)</code> supports the bhyve host validation and could be
|
|
||||||
used like this:
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ virt-host-validate bhyve
|
|
||||||
BHYVE: Checking for vmm module : PASS
|
|
||||||
BHYVE: Checking for if_tap module : PASS
|
|
||||||
BHYVE: Checking for if_bridge module : PASS
|
|
||||||
BHYVE: Checking for nmdm module : PASS
|
|
||||||
$
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Additional information on bhyve could be obtained on <a href="http://bhyve.org/">bhyve.org</a>.
|
Additional information on bhyve could be obtained on <a href="http://bhyve.org/">bhyve.org</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="uri">Connections to the Bhyve driver</a></h2>
|
<h2><a name="uri">Connections to the Bhyve driver</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The libvirt bhyve driver is a single-instance privileged driver. Some sample
|
The libvirt bhyve driver is a single-instance privileged driver. Some sample
|
||||||
connection URIs are:
|
connection URIs are:
|
||||||
@@ -43,7 +32,7 @@ bhyve+unix:///system (local access)
|
|||||||
bhyve+ssh://root@example.com/system (remote access, SSH tunnelled)
|
bhyve+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="exconfig">Example guest domain XML configurations</a></h2>
|
<h2><a name="exconfig">Example guest domain XML configurations</a></h2>
|
||||||
|
|
||||||
<h3>Example config</h3>
|
<h3>Example config</h3>
|
||||||
<p>
|
<p>
|
||||||
@@ -155,60 +144,9 @@ Note the addition of <bootloader>.
|
|||||||
</domain>
|
</domain>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3>Example config (Linux UEFI guest, VNC, tablet)</h3>
|
<h2><a name="usage">Guest usage / management</a></h2>
|
||||||
|
|
||||||
<p>This is an example to boot into Fedora 25 installation:</p>
|
<h3><a name="console">Connecting to a guest console</a></h3>
|
||||||
|
|
||||||
<pre>
|
|
||||||
<domain type='bhyve'>
|
|
||||||
<name>fedora_uefi_vnc_tablet</name>
|
|
||||||
<memory unit='G'>4</memory>
|
|
||||||
<vcpu>2</vcpu>
|
|
||||||
<os>
|
|
||||||
<type>hvm</type>
|
|
||||||
<b><loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader></b>
|
|
||||||
</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='cdrom'>
|
|
||||||
<driver name='file' type='raw'/>
|
|
||||||
<source file='/path/to/Fedora-Workstation-Live-x86_64-25-1.3.iso'/>
|
|
||||||
<target dev='hdc' bus='sata'/>
|
|
||||||
<readonly/>
|
|
||||||
</disk>
|
|
||||||
<disk type='file' device='disk'>
|
|
||||||
<driver name='file' type='raw'/>
|
|
||||||
<source file='/path/to/linux_uefi.img'/>
|
|
||||||
<target dev='hda' bus='sata'/>
|
|
||||||
</disk>
|
|
||||||
<interface type='bridge'>
|
|
||||||
<model type='virtio'/>
|
|
||||||
<source bridge="virbr0"/>
|
|
||||||
</interface>
|
|
||||||
<serial type="nmdm">
|
|
||||||
<source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
|
|
||||||
</serial>
|
|
||||||
<b><graphics type='vnc' port='5904'>
|
|
||||||
<listen type='address' address='127.0.0.1'/>
|
|
||||||
</graphics>
|
|
||||||
<controller type='usb' model='nec-xhci'/>
|
|
||||||
<input type='tablet' bus='usb'/></b>
|
|
||||||
</devices>
|
|
||||||
</domain>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>Please refer to the <a href="#uefi">UEFI</a> section for a more detailed explanation.</p>
|
|
||||||
|
|
||||||
<h2><a id="usage">Guest usage / management</a></h2>
|
|
||||||
|
|
||||||
<h3><a id="console">Connecting to a guest console</a></h3>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Guest console connection is supported through the <code>nmdm</code> device. It could be enabled by adding
|
Guest console connection is supported through the <code>nmdm</code> device. It could be enabled by adding
|
||||||
@@ -216,13 +154,13 @@ the following to the domain XML (<span class="since">Since 1.2.4</span>):
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<devices>
|
<devices>
|
||||||
<serial type="nmdm">
|
<serial type="nmdm">
|
||||||
<source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
|
<source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
|
||||||
</serial>
|
</serial>
|
||||||
</devices>
|
</devices>
|
||||||
...</pre>
|
...</pre>
|
||||||
|
|
||||||
|
|
||||||
<p>Make sure to load the <code>nmdm</code> kernel module if you plan to use that.</p>
|
<p>Make sure to load the <code>nmdm</code> kernel module if you plan to use that.</p>
|
||||||
@@ -253,7 +191,7 @@ device) is:</p>
|
|||||||
|
|
||||||
<pre>cu -l /dev/nmdm0B</pre>
|
<pre>cu -l /dev/nmdm0B</pre>
|
||||||
|
|
||||||
<h3><a id="xmltonative">Converting from domain XML to Bhyve args</a></h3>
|
<h3><a name="xmltonative">Converting from domain XML to Bhyve args</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-to-native</code> command can preview the actual
|
The <code>virsh domxml-to-native</code> command can preview the actual
|
||||||
@@ -275,23 +213,23 @@ tweak them.</p>
|
|||||||
/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
|
/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>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="zfsvolume">Using ZFS volumes</a></h3>
|
<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>.
|
<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>
|
An example of domain XML device entry for that will look like:</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<disk type='volume' device='disk'>
|
<disk type='volume' device='disk'>
|
||||||
<source pool='zfspool' volume='vol1'/>
|
<source pool='zfspool' volume='vol1'/>
|
||||||
<target dev='vdb' bus='virtio'/>
|
<target dev='vdb' bus='virtio'/>
|
||||||
</disk>
|
</disk>
|
||||||
...</pre>
|
...</pre>
|
||||||
|
|
||||||
<p>Please refer to the <a href="storage.html">Storage documentation</a> for more details on storage
|
<p>Please refer to the <a href="storage.html">Storage documentation</a> for more details on storage
|
||||||
management.</p>
|
management.</p>
|
||||||
|
|
||||||
<h3><a id="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3>
|
<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
|
<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
|
bootloader, e.g. <code>grub-bhyve(1)</code>. Arguments to the bootloader may be
|
||||||
@@ -303,93 +241,16 @@ the first disk in the domain (either <code>cdrom</code>- or
|
|||||||
attempt to boot from the first partition in the disk image.</p>
|
attempt to boot from the first partition in the disk image.</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<bootloader>/usr/local/sbin/grub-bhyve</bootloader>
|
<bootloader>/usr/local/sbin/grub-bhyve</bootloader>
|
||||||
<bootloader_args>...</bootloader_args>
|
<bootloader_args>...</bootloader_args>
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>Caveat: <code>bootloader_args</code> does not support any quoting.
|
<p>Caveat: <code>bootloader_args</code> does not support any quoting.
|
||||||
Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p>
|
Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p>
|
||||||
|
|
||||||
<h3><a id="uefi">Using UEFI bootrom, VNC, and USB tablet</a></h3>
|
<h3><a name="clockconfig">Clock configuration</a></h3>
|
||||||
|
|
||||||
<p><span class="since">Since 3.2.0</span>, in addition to <a href="#grubbhyve">grub-bhyve</a>,
|
|
||||||
non-FreeBSD guests could be also booted using an UEFI boot ROM, provided both guest OS and
|
|
||||||
installed <code>bhyve(1)</code> version support UEFI. To use that, <code>loader</code>
|
|
||||||
should be specified in the <code>os</code> section:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<domain type='bhyve'>
|
|
||||||
...
|
|
||||||
<os>
|
|
||||||
<type>hvm</type>
|
|
||||||
<loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader>
|
|
||||||
</os>
|
|
||||||
...
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>This uses the UEFI firmware provided by
|
|
||||||
the <a href="https://www.freshports.org/sysutils/bhyve-firmware/">sysutils/bhyve-firmware</a>
|
|
||||||
FreeBSD port.</p>
|
|
||||||
|
|
||||||
<p>VNC and the tablet input device could be configured this way:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<domain type='bhyve'>
|
|
||||||
<devices>
|
|
||||||
...
|
|
||||||
<graphics type='vnc' port='5904'>
|
|
||||||
<listen type='address' address='127.0.0.1'/>
|
|
||||||
</graphics>
|
|
||||||
<controller type='usb' model='nec-xhci'/>
|
|
||||||
<input type='tablet' bus='usb'/>
|
|
||||||
</devices>
|
|
||||||
...
|
|
||||||
</domain>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>This way, VNC will be accessible on <code>127.0.0.1:5904</code>.</p>
|
|
||||||
|
|
||||||
<p>Please note that the tablet device requires to have a USB controller
|
|
||||||
of the <code>nec-xhci</code> model. Currently, only a single controller of this
|
|
||||||
type and a single tablet are supported per domain.</p>
|
|
||||||
|
|
||||||
<p><span class="since">Since 3.5.0</span>, it's possible to configure how the video device is exposed
|
|
||||||
to the guest using the <code>vgaconf</code> attribute:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<domain type='bhyve'>
|
|
||||||
<devices>
|
|
||||||
...
|
|
||||||
<graphics type='vnc' port='5904'>
|
|
||||||
<listen type='address' address='127.0.0.1'/>
|
|
||||||
</graphics>
|
|
||||||
<video>
|
|
||||||
<driver vgaconf='on'/>
|
|
||||||
<model type='gop' heads='1' primary='yes'/>
|
|
||||||
</video>
|
|
||||||
...
|
|
||||||
</devices>
|
|
||||||
...
|
|
||||||
</domain>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>If not specified, bhyve's default mode for <code>vgaconf</code>
|
|
||||||
will be used. Please refer to the
|
|
||||||
<a href="https://www.freebsd.org/cgi/man.cgi?query=bhyve&sektion=8&manpath=FreeBSD+12-current">bhyve(8)</a>
|
|
||||||
manual page and the <a href="https://wiki.freebsd.org/bhyve">bhyve wiki</a> for more details on using
|
|
||||||
the <code>vgaconf</code> option.</p>
|
|
||||||
|
|
||||||
<p><span class="since">Since 3.7.0</span>, it's possible to use <code>autoport</code>
|
|
||||||
to let libvirt allocate VNC port automatically (instead of explicitly specifying
|
|
||||||
it with the <code>port</code> attribute):</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<graphics type='vnc' autoport='yes'>
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3><a id="clockconfig">Clock configuration</a></h3>
|
|
||||||
|
|
||||||
<p>Originally bhyve supported only localtime for RTC. Support for UTC time was introduced in
|
<p>Originally bhyve supported only localtime for RTC. Support for UTC time was introduced in
|
||||||
<a href="http://svnweb.freebsd.org/changeset/base/284894">r284894</a> for <i>10-STABLE</i> and
|
<a href="http://svnweb.freebsd.org/changeset/base/284894">r284894</a> for <i>10-STABLE</i> and
|
||||||
@@ -415,21 +276,6 @@ you'll need to explicitly specify 'localtime' in this case:</p>
|
|||||||
<clock offset='localtime'/>
|
<clock offset='localtime'/>
|
||||||
...
|
...
|
||||||
</domain>
|
</domain>
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3><a id="e1000">e1000 NIC</a></h3>
|
|
||||||
|
|
||||||
<p>As of <a href="https://svnweb.freebsd.org/changeset/base/302504">r302504</a> bhyve
|
|
||||||
supports Intel e1000 network adapter emulation. It's supported in libvirt
|
|
||||||
<span class="since">since 3.1.0</span> and could be used as follows:</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
...
|
|
||||||
<interface type='bridge'>
|
|
||||||
<source bridge='virbr0'/>
|
|
||||||
<model type='<b>e1000</b>'/>
|
|
||||||
</interface>
|
|
||||||
...
|
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>VMware ESX hypervisor driver</h1>
|
<h1>VMware ESX hypervisor driver</h1>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
connect to a VMware vCenter 2.5/4.x/5.x (VPX).
|
connect to a VMware vCenter 2.5/4.x/5.x (VPX).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="prereq">Deployment pre-requisites</a></h2>
|
<h2><a name="prereq">Deployment pre-requisites</a></h2>
|
||||||
<p>
|
<p>
|
||||||
None. Any out-of-the-box installation of VPX/ESX(i)/GSX should work. No
|
None. Any out-of-the-box installation of VPX/ESX(i)/GSX should work. No
|
||||||
preparations are required on the server side, no libvirtd must be
|
preparations are required on the server side, no libvirtd must be
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
VMware vSphere API</a>.
|
VMware vSphere API</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="uri">Connections to the VMware ESX driver</a></h2>
|
<h2><a name="uri">Connections to the VMware ESX driver</a></h2>
|
||||||
<p>
|
<p>
|
||||||
Some example remote connection URIs for the driver are:
|
Some example remote connection URIs for the driver are:
|
||||||
</p>
|
</p>
|
||||||
@@ -54,7 +54,7 @@ esx://example-esx.com/?no_verify=1 (ESX over HTTPS, but doesn't verify the s
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="uriformat">URI Format</a></h3>
|
<h3><a name="uriformat">URI Format</a></h3>
|
||||||
<p>
|
<p>
|
||||||
URIs have this general form (<code>[...]</code> marks an optional part).
|
URIs have this general form (<code>[...]</code> marks an optional part).
|
||||||
</p>
|
</p>
|
||||||
@@ -93,7 +93,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h4><a id="extraparams">Extra parameters</a></h4>
|
<h4><a name="extraparams">Extra parameters</a></h4>
|
||||||
<p>
|
<p>
|
||||||
Extra parameters can be added to a URI as part of the query string
|
Extra parameters can be added to a URI as part of the query string
|
||||||
(the part following <code>?</code>). A single parameter is formed by a
|
(the part following <code>?</code>). A single parameter is formed by a
|
||||||
@@ -188,7 +188,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="auth">Authentication</a></h3>
|
<h3><a name="auth">Authentication</a></h3>
|
||||||
<p>
|
<p>
|
||||||
In order to perform any useful operation the driver needs to log into
|
In order to perform any useful operation the driver needs to log into
|
||||||
the ESX server. Therefore, only <code>virConnectOpenAuth</code> can be
|
the ESX server. Therefore, only <code>virConnectOpenAuth</code> can be
|
||||||
@@ -208,7 +208,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="certificates">Certificates for HTTPS</a></h3>
|
<h3><a name="certificates">Certificates for HTTPS</a></h3>
|
||||||
<p>
|
<p>
|
||||||
By default the ESX driver uses HTTPS to communicate with an ESX server.
|
By default the ESX driver uses HTTPS to communicate with an ESX server.
|
||||||
Proper HTTPS communication requires correctly configured SSL
|
Proper HTTPS communication requires correctly configured SSL
|
||||||
@@ -244,7 +244,7 @@ error: internal error curl_easy_perform() returned an error: Peer certificate ca
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="connproblems">Connection problems</a></h3>
|
<h3><a name="connproblems">Connection problems</a></h3>
|
||||||
<p>
|
<p>
|
||||||
There are also other causes for connection problems than the
|
There are also other causes for connection problems than the
|
||||||
<a href="#certificates">HTTPS certificate</a> related ones.
|
<a href="#certificates">HTTPS certificate</a> related ones.
|
||||||
@@ -303,7 +303,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="questions">Questions blocking tasks</a></h2>
|
<h2><a name="questions">Questions blocking tasks</a></h2>
|
||||||
<p>
|
<p>
|
||||||
Some methods of the VI API start tasks, for example
|
Some methods of the VI API start tasks, for example
|
||||||
<code>PowerOnVM_Task()</code>. Such tasks may be blocked by questions
|
<code>PowerOnVM_Task()</code>. Such tasks may be blocked by questions
|
||||||
@@ -322,12 +322,12 @@ error: invalid argument in libvirt was built without the 'esx' driver
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="xmlspecial">Specialties in the domain XML config</a></h2>
|
<h2><a name="xmlspecial">Specialties in the domain XML config</a></h2>
|
||||||
<p>
|
<p>
|
||||||
There are several specialties in the domain XML config for ESX domains.
|
There are several specialties in the domain XML config for ESX domains.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="restrictions">Restrictions</a></h3>
|
<h3><a name="restrictions">Restrictions</a></h3>
|
||||||
<p>
|
<p>
|
||||||
There are some restrictions for some values of the domain XML config.
|
There are some restrictions for some values of the domain XML config.
|
||||||
The driver will complain if this restrictions are violated.
|
The driver will complain if this restrictions are violated.
|
||||||
@@ -347,7 +347,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="datastore">Datastore references</a></h3>
|
<h3><a name="datastore">Datastore references</a></h3>
|
||||||
<p>
|
<p>
|
||||||
Storage is managed in datastores. VMware uses a special path format to
|
Storage is managed in datastores. VMware uses a special path format to
|
||||||
reference files in a datastore. Basically, the datastore name is put
|
reference files in a datastore. Basically, the datastore name is put
|
||||||
@@ -366,7 +366,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="macaddresses">MAC addresses</a></h3>
|
<h3><a name="macaddresses">MAC addresses</a></h3>
|
||||||
<p>
|
<p>
|
||||||
VMware has registered two MAC address prefixes for domains:
|
VMware has registered two MAC address prefixes for domains:
|
||||||
<code>00:0c:29</code> and <code>00:50:56</code>. These prefixes are
|
<code>00:0c:29</code> and <code>00:50:56</code>. These prefixes are
|
||||||
@@ -427,7 +427,7 @@ ethernet0.checkMACAddress = "false"
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="hardware">Available hardware</a></h3>
|
<h3><a name="hardware">Available hardware</a></h3>
|
||||||
<p>
|
<p>
|
||||||
VMware ESX supports different models of SCSI controllers and network
|
VMware ESX supports different models of SCSI controllers and network
|
||||||
cards.
|
cards.
|
||||||
@@ -467,14 +467,14 @@ ethernet0.checkMACAddress = "false"
|
|||||||
Here a domain XML snippet:
|
Here a domain XML snippet:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<disk type='file' device='disk'>
|
<disk type='file' device='disk'>
|
||||||
<source file='[local-storage] Fedora11/Fedora11.vmdk'/>
|
<source file='[local-storage] Fedora11/Fedora11.vmdk'/>
|
||||||
<target dev='sda' bus='scsi'/>
|
<target dev='sda' bus='scsi'/>
|
||||||
<address type='drive' controller='0' bus='0' unit='0'/>
|
<address type='drive' controller='0' bus='0' unit='0'/>
|
||||||
</disk>
|
</disk>
|
||||||
<controller type='scsi' index='0' model='<strong>lsilogic</strong>'/>
|
<controller type='scsi' index='0' model='<strong>lsilogic</strong>'/>
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
<p>
|
<p>
|
||||||
The controller element is supported <span class="since">since 0.8.2</span>.
|
The controller element is supported <span class="since">since 0.8.2</span>.
|
||||||
@@ -482,13 +482,13 @@ ethernet0.checkMACAddress = "false"
|
|||||||
specify the SCSI controller model. This attribute usage is deprecated now.
|
specify the SCSI controller model. This attribute usage is deprecated now.
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<disk type='file' device='disk'>
|
<disk type='file' device='disk'>
|
||||||
<driver name='<strong>lsilogic</strong>'/>
|
<driver name='<strong>lsilogic</strong>'/>
|
||||||
<source file='[local-storage] Fedora11/Fedora11.vmdk'/>
|
<source file='[local-storage] Fedora11/Fedora11.vmdk'/>
|
||||||
<target dev='sda' bus='scsi'/>
|
<target dev='sda' bus='scsi'/>
|
||||||
</disk>
|
</disk>
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
@@ -513,24 +513,24 @@ ethernet0.checkMACAddress = "false"
|
|||||||
Here a domain XML snippet:
|
Here a domain XML snippet:
|
||||||
</p>
|
</p>
|
||||||
<pre>
|
<pre>
|
||||||
...
|
...
|
||||||
<interface type='bridge'>
|
<interface type='bridge'>
|
||||||
<mac address='00:50:56:25:48:c7'/>
|
<mac address='00:50:56:25:48:c7'/>
|
||||||
<source bridge='VM Network'/>
|
<source bridge='VM Network'/>
|
||||||
<model type='<strong>e1000</strong>'/>
|
<model type='<strong>e1000</strong>'/>
|
||||||
</interface>
|
</interface>
|
||||||
...
|
...
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="importexport">Import and export of domain XML configs</a></h2>
|
<h2><a name="importexport">Import and export of domain XML configs</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The ESX driver currently supports a native config format known as
|
The ESX driver currently supports a native config format known as
|
||||||
<code>vmware-vmx</code> to handle VMware VMX configs.
|
<code>vmware-vmx</code> to handle VMware VMX configs.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="xmlimport">Converting from VMware VMX config to domain XML config</a></h3>
|
<h3><a name="xmlimport">Converting from VMware VMX config to domain XML config</a></h3>
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-from-native</code> provides a way to convert an
|
The <code>virsh domxml-from-native</code> provides a way to convert an
|
||||||
existing VMware VMX config into a domain XML config that can then be
|
existing VMware VMX config into a domain XML config that can then be
|
||||||
@@ -621,7 +621,7 @@ Enter root password for example.com:
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="xmlexport">Converting from domain XML config to VMware VMX config</a></h3>
|
<h3><a name="xmlexport">Converting from domain XML config to VMware VMX config</a></h3>
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-to-native</code> provides a way to convert a
|
The <code>virsh domxml-to-native</code> provides a way to convert a
|
||||||
domain XML config into a VMware VMX config.
|
domain XML config into a VMware VMX config.
|
||||||
@@ -675,7 +675,7 @@ ethernet0.address = "00:50:56:25:48:C7"
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="xmlconfig">Example domain XML configs</a></h2>
|
<h2><a name="xmlconfig">Example domain XML configs</a></h2>
|
||||||
|
|
||||||
<h3>Fedora11 on x86_64</h3>
|
<h3>Fedora11 on x86_64</h3>
|
||||||
<pre>
|
<pre>
|
||||||
@@ -704,7 +704,7 @@ ethernet0.address = "00:50:56:25:48:C7"
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="migration">Migration</a></h2>
|
<h2><a name="migration">Migration</a></h2>
|
||||||
<p>
|
<p>
|
||||||
A migration cannot be initiated on an ESX server directly, a VMware
|
A migration cannot be initiated on an ESX server directly, a VMware
|
||||||
vCenter is necessary for this. The <code>vcenter</code> query
|
vCenter is necessary for this. The <code>vcenter</code> query
|
||||||
@@ -749,7 +749,7 @@ Enter administrator password for example-vcenter.com:
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="scheduler">Scheduler configuration</a></h2>
|
<h2><a name="scheduler">Scheduler configuration</a></h2>
|
||||||
<p>
|
<p>
|
||||||
The driver exposes the ESX CPU scheduler. The parameters listed below
|
The driver exposes the ESX CPU scheduler. The parameters listed below
|
||||||
are available to control the scheduler.
|
are available to control the scheduler.
|
||||||
@@ -780,7 +780,7 @@ Enter administrator password for example-vcenter.com:
|
|||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="tools">VMware tools</a></h2>
|
<h2><a name="tools">VMware tools</a></h2>
|
||||||
<p>
|
<p>
|
||||||
Some actions require installed VMware tools. If the VMware tools are
|
Some actions require installed VMware tools. If the VMware tools are
|
||||||
not installed in the guest and one of the actions below is to be
|
not installed in the guest and one of the actions below is to be
|
||||||
@@ -796,7 +796,7 @@ Enter administrator password for example-vcenter.com:
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="links">Links</a></h2>
|
<h2><a name="links">Links</a></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a href="http://www.vmware.com/support/developer/vc-sdk/">
|
<a href="http://www.vmware.com/support/developer/vc-sdk/">
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Microsoft Hyper-V hypervisor driver</h1>
|
<h1>Microsoft Hyper-V hypervisor driver</h1>
|
||||||
<ul id="toc"></ul>
|
<ul id="toc"></ul>
|
||||||
<p>
|
<p>
|
||||||
The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2 and newer.
|
The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
The <a href="http://www.microsoft.com/hyper-v-server/">Microsoft Hyper-V</a>
|
The <a href="http://www.microsoft.com/hyper-v-server/">Microsoft Hyper-V</a>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="uri">Connections to the Microsoft Hyper-V driver</a></h2>
|
<h2><a name="uri">Connections to the Microsoft Hyper-V driver</a></h2>
|
||||||
<p>
|
<p>
|
||||||
Some example remote connection URIs for the driver are:
|
Some example remote connection URIs for the driver are:
|
||||||
</p>
|
</p>
|
||||||
@@ -36,7 +36,7 @@ hyperv://example-hyperv.com/?transport=http (over HTTP)
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="uriformat">URI Format</a></h3>
|
<h3><a name="uriformat">URI Format</a></h3>
|
||||||
<p>
|
<p>
|
||||||
URIs have this general form (<code>[...]</code> marks an optional part).
|
URIs have this general form (<code>[...]</code> marks an optional part).
|
||||||
</p>
|
</p>
|
||||||
@@ -49,7 +49,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters]
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h4><a id="extraparams">Extra parameters</a></h4>
|
<h4><a name="extraparams">Extra parameters</a></h4>
|
||||||
<p>
|
<p>
|
||||||
Extra parameters can be added to a URI as part of the query string
|
Extra parameters can be added to a URI as part of the query string
|
||||||
(the part following <code>?</code>). A single parameter is formed by a
|
(the part following <code>?</code>). A single parameter is formed by a
|
||||||
@@ -83,7 +83,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters]
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="auth">Authentication</a></h3>
|
<h3><a name="auth">Authentication</a></h3>
|
||||||
<p>
|
<p>
|
||||||
In order to perform any useful operation the driver needs to log into
|
In order to perform any useful operation the driver needs to log into
|
||||||
the Hyper-V server. Therefore, only <code>virConnectOpenAuth</code> can
|
the Hyper-V server. Therefore, only <code>virConnectOpenAuth</code> can
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>LXC container driver</h1>
|
<h1>LXC container driver</h1>
|
||||||
@@ -18,7 +18,7 @@ particular sVirt for mandatory access control, auditing of operations,
|
|||||||
integration with control groups and many other features.
|
integration with control groups and many other features.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="cgroups">Control groups Requirements</a></h2>
|
<h2><a name="cgroups">Control groups Requirements</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In order to control the resource usage of processes inside containers, the
|
In order to control the resource usage of processes inside containers, the
|
||||||
@@ -32,7 +32,7 @@ init service will be required. For further information, consult the general
|
|||||||
libvirt <a href="cgroups.html">cgroups documentation</a>.
|
libvirt <a href="cgroups.html">cgroups documentation</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="namespaces">Namespace requirements</a></h2>
|
<h2><a name="namespaces">Namespace requirements</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In order to separate processes inside a container from those in the
|
In order to separate processes inside a container from those in the
|
||||||
@@ -47,9 +47,9 @@ configured UID/GID mapping is a pre-requisite to making containers
|
|||||||
secure, in the absence of sVirt confinement.</strong>
|
secure, in the absence of sVirt confinement.</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="init">Default container setup</a></h2>
|
<h2><a name="init">Default container setup</a></h2>
|
||||||
|
|
||||||
<h3><a id="cliargs">Command line arguments</a></h3>
|
<h3><a name="cliargs">Command line arguments</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When the container "init" process is started, it will typically
|
When the container "init" process is started, it will typically
|
||||||
@@ -62,15 +62,15 @@ would use the following XML
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<os>
|
<os>
|
||||||
<type arch='x86_64'>exe</type>
|
<type arch='x86_64'>exe</type>
|
||||||
<init>/bin/systemd</init>
|
<init>/bin/systemd</init>
|
||||||
<initarg>--unit</initarg>
|
<initarg>--unit</initarg>
|
||||||
<initarg>emergency.service</initarg>
|
<initarg>emergency.service</initarg>
|
||||||
</os>
|
</os>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="envvars">Environment variables</a></h3>
|
<h3><a name="envvars">Environment variables</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When the container "init" process is started, it will be given several useful
|
When the container "init" process is started, it will be given several useful
|
||||||
@@ -108,7 +108,7 @@ Use of this is discouraged, in favour of passing arguments directly to the
|
|||||||
container init process via the <code>initarg</code> config element.</dd>
|
container init process via the <code>initarg</code> config element.</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<h3><a id="fsmounts">Filesystem mounts</a></h3>
|
<h3><a name="fsmounts">Filesystem mounts</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In the absence of any explicit configuration, the container will
|
In the absence of any explicit configuration, the container will
|
||||||
@@ -131,7 +131,7 @@ only expose the sub-tree associated with the container</li>
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="devnodes">Device nodes</a></h3>
|
<h3><a name="devnodes">Device nodes</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The container init process will be started with <code>CAP_MKNOD</code>
|
The container init process will be started with <code>CAP_MKNOD</code>
|
||||||
@@ -178,7 +178,7 @@ Further block or character devices will be made available to containers
|
|||||||
depending on their configuration.
|
depending on their configuration.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="security">Security considerations</a></h2>
|
<h2><a name="security">Security considerations</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt LXC driver is fairly flexible in how it can be configured,
|
The libvirt LXC driver is fairly flexible in how it can be configured,
|
||||||
@@ -190,7 +190,7 @@ isolation between a container and the host must ensure that they are
|
|||||||
writing a suitable configuration.
|
writing a suitable configuration.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securenetworking">Network isolation</a></h3>
|
<h3><a name="securenetworking">Network isolation</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If the guest configuration does not list any network interfaces,
|
If the guest configuration does not list any network interfaces,
|
||||||
@@ -205,7 +205,7 @@ namespace is not wanted, then applications should set the
|
|||||||
<code><features>....</features></code> element.
|
<code><features>....</features></code> element.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securefs">Filesystem isolation</a></h3>
|
<h3><a name="securefs">Filesystem isolation</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If the guest configuration does not list any filesystems, then
|
If the guest configuration does not list any filesystems, then
|
||||||
@@ -250,7 +250,7 @@ a bind mount to hide them. This is particularly important for the
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="secureusers">User and group isolation</a></h3>
|
<h3><a name="secureusers">User and group isolation</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
If the guest configuration does not list any ID mapping, then the
|
If the guest configuration does not list any ID mapping, then the
|
||||||
@@ -281,7 +281,7 @@ causes libvirt to activate the user namespace feature.
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="activation">Systemd Socket Activation Integration</a></h2>
|
<h2><a name="activation">Systemd Socket Activation Integration</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt LXC driver provides the ability to pass across pre-opened file
|
The libvirt LXC driver provides the ability to pass across pre-opened file
|
||||||
@@ -477,7 +477,7 @@ configured to block read/write/mknod from all devices except those
|
|||||||
that a container is authorized to use.
|
that a container is authorized to use.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="exconfig">Example configurations</a></h2>
|
<h2><a name="exconfig">Example configurations</a></h2>
|
||||||
|
|
||||||
<h3>Example config version 1</h3>
|
<h3>Example config version 1</h3>
|
||||||
<p></p>
|
<p></p>
|
||||||
@@ -542,7 +542,7 @@ debootstrap, whatever) under /opt/vm-1-root:
|
|||||||
</domain>
|
</domain>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="capabilities">Altering the available capabilities</a></h2>
|
<h2><a name="capabilities">Altering the available capabilities</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
By default the libvirt LXC driver drops some capabilities among which CAP_MKNOD.
|
By default the libvirt LXC driver drops some capabilities among which CAP_MKNOD.
|
||||||
@@ -590,7 +590,7 @@ Note that allowing capabilities that are normally dropped by default can serious
|
|||||||
affect the security of the container and the host.
|
affect the security of the container and the host.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="share">Inherit namespaces</a></h2>
|
<h2><a name="share">Inherit namespaces</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Libvirt allows you to inherit the namespace from container/process just like lxc tools
|
Libvirt allows you to inherit the namespace from container/process just like lxc tools
|
||||||
@@ -611,11 +611,7 @@ ignored.
|
|||||||
</domain>
|
</domain>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p>
|
<h2><a name="usage">Container usage / management</a></h2>
|
||||||
The use of namespace passthrough requires libvirt >= 1.2.19
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2><a id="usage">Container usage / management</a></h2>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
As with any libvirt virtualization driver, LXC containers can be
|
As with any libvirt virtualization driver, LXC containers can be
|
||||||
@@ -629,7 +625,7 @@ and LXC. For further details about usage of virsh consult its
|
|||||||
manual page.
|
manual page.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="usageSave">Defining (saving) container configuration</a></h3>
|
<h3><a name="usageSave">Defining (saving) container configuration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh define</code> command takes an XML configuration
|
The <code>virsh define</code> command takes an XML configuration
|
||||||
@@ -640,7 +636,7 @@ document and loads it into libvirt, saving the configuration on disk
|
|||||||
# virsh -c lxc:/// define myguest.xml
|
# virsh -c lxc:/// define myguest.xml
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageView">Viewing container configuration</a></h3>
|
<h3><a name="usageView">Viewing container configuration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh dumpxml</code> command can be used to view the
|
The <code>virsh dumpxml</code> command can be used to view the
|
||||||
@@ -655,7 +651,7 @@ using the <code>--inactive</code> flag
|
|||||||
# virsh -c lxc:/// dumpxml myguest
|
# virsh -c lxc:/// dumpxml myguest
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageStart">Starting containers</a></h3>
|
<h3><a name="usageStart">Starting containers</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh start</code> command can be used to start a
|
The <code>virsh start</code> command can be used to start a
|
||||||
@@ -677,7 +673,7 @@ by libvirt, using the <code>virsh create</code> command.
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="usageStop">Stopping containers</a></h3>
|
<h3><a name="usageStop">Stopping containers</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh shutdown</code> command can be used
|
The <code>virsh shutdown</code> command can be used
|
||||||
@@ -702,7 +698,7 @@ request, it can be forcibly stopped using the <code>virsh destroy</code>
|
|||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="usageReboot">Rebooting a container</a></h3>
|
<h3><a name="usageReboot">Rebooting a container</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh reboot</code> command can be used
|
The <code>virsh reboot</code> command can be used
|
||||||
@@ -717,7 +713,7 @@ to PID 1 inside the container.
|
|||||||
# virsh -c lxc:/// reboot myguest
|
# virsh -c lxc:/// reboot myguest
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageDelete">Undefining (deleting) a container configuration</a></h3>
|
<h3><a name="usageDelete">Undefining (deleting) a container configuration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh undefine</code> command can be used to delete the
|
The <code>virsh undefine</code> command can be used to delete the
|
||||||
@@ -729,7 +725,7 @@ running, this will turn it into a "transient" guest.
|
|||||||
# virsh -c lxc:/// undefine myguest
|
# virsh -c lxc:/// undefine myguest
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageConnect">Connecting to a container console</a></h3>
|
<h3><a name="usageConnect">Connecting to a container console</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh console</code> command can be used to connect
|
The <code>virsh console</code> command can be used to connect
|
||||||
@@ -752,7 +748,7 @@ as 'console0', 'console1', 'console2', etc.
|
|||||||
# virsh -c lxc:/// console myguest --devname console1
|
# virsh -c lxc:/// console myguest --devname console1
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageEnter">Running commands in a container</a></h3>
|
<h3><a name="usageEnter">Running commands in a container</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh lxc-enter-namespace</code> command can be used
|
The <code>virsh lxc-enter-namespace</code> command can be used
|
||||||
@@ -764,7 +760,7 @@ and then execute an arbitrary command.
|
|||||||
# virsh -c lxc:/// lxc-enter-namespace myguest -- /bin/ls -al /dev
|
# virsh -c lxc:/// lxc-enter-namespace myguest -- /bin/ls -al /dev
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageTop">Monitoring container utilization</a></h3>
|
<h3><a name="usageTop">Monitoring container utilization</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virt-top</code> command can be used to monitor the
|
The <code>virt-top</code> command can be used to monitor the
|
||||||
@@ -776,7 +772,7 @@ host
|
|||||||
# virt-top -c lxc:///
|
# virt-top -c lxc:///
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3><a id="usageConvert">Converting LXC container configuration</a></h3>
|
<h3><a name="usageConvert">Converting LXC container configuration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-from-native</code> command can be used to convert
|
The <code>virsh domxml-from-native</code> command can be used to convert
|
||||||
|
|||||||
@@ -1,355 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<body>
|
|
||||||
<h1>Host device management</h1>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Libvirt provides management of both physical and virtual host devices
|
|
||||||
(historically also referred to as node devices) like USB, PCI, SCSI, and
|
|
||||||
network devices. This also includes various virtualization capabilities
|
|
||||||
which the aforementioned devices provide for utilization, for example
|
|
||||||
SR-IOV, NPIV, MDEV, DRM, etc.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The node device driver provides means to list and show details about host
|
|
||||||
devices (<code>virsh nodedev-list</code>,
|
|
||||||
<code>virsh nodedev-dumpxml</code>), which are generic and can be used
|
|
||||||
with all devices. It also provides means to create and destroy devices
|
|
||||||
(<code>virsh nodedev-create</code>, <code>virsh nodedev-destroy</code>)
|
|
||||||
which are meant to be used to create virtual devices, currently only
|
|
||||||
supported by NPIV
|
|
||||||
(<a href="http://wiki.libvirt.org/page/NPIV_in_libvirt">more info about NPIV)</a>).
|
|
||||||
Devices on the host system are arranged in a tree-like hierarchy, with
|
|
||||||
the root node being called <code>computer</code>. The node device driver
|
|
||||||
supports two backends to manage the devices, HAL and udev, with the former
|
|
||||||
being deprecated in favour of the latter.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The generic format of a host device XML can be seen below.
|
|
||||||
To identify a device both within the host and the device tree hierarchy,
|
|
||||||
the following elements are used:
|
|
||||||
</p>
|
|
||||||
<dl>
|
|
||||||
<dt><code>name</code></dt>
|
|
||||||
<dd>
|
|
||||||
The device's name will be generated by libvirt using the subsystem,
|
|
||||||
like pci and the device's sysfs basename.
|
|
||||||
</dd>
|
|
||||||
<dt><code>path</code></dt>
|
|
||||||
<dd>
|
|
||||||
Fully qualified sysfs path to the device.
|
|
||||||
</dd>
|
|
||||||
<dt><code>parent</code></dt>
|
|
||||||
<dd>
|
|
||||||
This element identifies the parent node in the device hierarchy. The
|
|
||||||
value of the element will correspond with the device parent's
|
|
||||||
<code>name</code> element or <code>computer</code> if the device does
|
|
||||||
not have any parent.
|
|
||||||
</dd>
|
|
||||||
<dt><code>driver</code></dt>
|
|
||||||
<dd>
|
|
||||||
This elements reports the driver in use for this device. The presence
|
|
||||||
of this element in the output XML depends on whether the underlying
|
|
||||||
device manager (most likely udev) exposes information about the
|
|
||||||
driver.
|
|
||||||
</dd>
|
|
||||||
<dt><code>capability</code></dt>
|
|
||||||
<dd>
|
|
||||||
Describes the device in terms of feature support. The element has one
|
|
||||||
mandatory attribute <code>type</code> the value of which determines
|
|
||||||
the type of the device. Currently recognized values for the attribute
|
|
||||||
are:
|
|
||||||
<code>system</code>,
|
|
||||||
<code>pci</code>,
|
|
||||||
<code>usb</code>,
|
|
||||||
<code>usb_device</code>,
|
|
||||||
<code>net</code>,
|
|
||||||
<code>scsi</code>,
|
|
||||||
<code>scsi_host</code> (<span class="since">Since 0.4.7</span>),
|
|
||||||
<code>fc_host</code>,
|
|
||||||
<code>vports</code>,
|
|
||||||
<code>scsi_target</code> (<span class="since">Since 0.7.3</span>),
|
|
||||||
<code>storage</code> (<span class="since">Since 1.0.4</span>),
|
|
||||||
<code>scsi_generic</code> (<span class="since">Since 1.0.7</span>),
|
|
||||||
<code>drm</code> (<span class="since">Since 3.1.0</span>), and
|
|
||||||
<code>mdev</code> (<span class="since">Since 3.4.0</span>).
|
|
||||||
This element can be nested in which case it further specifies a
|
|
||||||
device's capability. Refer to specific device types to see more values
|
|
||||||
for the <code>type</code> attribute which are exclusive.
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h2>Basic structure of a node device</h2>
|
|
||||||
<pre>
|
|
||||||
<device>
|
|
||||||
<name>pci_0000_00_17_0</name>
|
|
||||||
<path>/sys/devices/pci0000:00/0000:00:17.0</path>
|
|
||||||
<parent>computer</parent>
|
|
||||||
<driver>
|
|
||||||
<name>ahci</name>
|
|
||||||
</driver>
|
|
||||||
<capability type='pci'>
|
|
||||||
...
|
|
||||||
</capability>
|
|
||||||
</device></pre>
|
|
||||||
|
|
||||||
<ul id="toc"/>
|
|
||||||
|
|
||||||
<h2><a id="PCI">PCI host devices</a></h2>
|
|
||||||
<dl>
|
|
||||||
<dt><code>capability</code></dt>
|
|
||||||
<dd>
|
|
||||||
When used as top level element, the supported values for the
|
|
||||||
<code>type</code> attribute are <code>pci</code> and
|
|
||||||
<code>phys_function</code> (see <a href="#SRIOVCap">SR-IOV below</a>).
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<pre>
|
|
||||||
<device>
|
|
||||||
<name>pci_0000_04_00_1</name>
|
|
||||||
<path>/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.1</path>
|
|
||||||
<parent>pci_0000_00_06_0</parent>
|
|
||||||
<driver>
|
|
||||||
<name>igb</name>
|
|
||||||
</driver>
|
|
||||||
<capability type='pci'>
|
|
||||||
<domain>0</domain>
|
|
||||||
<bus>4</bus>
|
|
||||||
<slot>0</slot>
|
|
||||||
<function>1</function>
|
|
||||||
<product id='0x10c9'>82576 Gigabit Network Connection</product>
|
|
||||||
<vendor id='0x8086'>Intel Corporation</vendor>
|
|
||||||
<iommuGroup number='15'>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x00' function='0x1'/>
|
|
||||||
</iommuGroup>
|
|
||||||
<numa node='0'/>
|
|
||||||
<pci-express>
|
|
||||||
<link validity='cap' port='1' speed='2.5' width='2'/>
|
|
||||||
<link validity='sta' speed='2.5' width='2'/>
|
|
||||||
</pci-express>
|
|
||||||
</capability>
|
|
||||||
</device></pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The XML format for a PCI device stays the same for any further
|
|
||||||
capabilities it supports, a single nested <code><capability></code>
|
|
||||||
element will be included for each capability the device supports.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3><a id="SRIOVCap">SR-IOV capability</a></h3>
|
|
||||||
<p>
|
|
||||||
Single root input/output virtualization (SR-IOV) allows sharing of the
|
|
||||||
PCIe resources by multiple virtual environments. That is achieved by
|
|
||||||
slicing up a single full-featured physical resource called physical
|
|
||||||
function (PF) into multiple devices called virtual functions (VFs) sharing
|
|
||||||
their configuration with the underlying PF. Despite the SR-IOV
|
|
||||||
specification, the amount of VFs that can be created on a PF varies among
|
|
||||||
manufacturers.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Suppose the NIC <a href="#PCI">above</a> was also SR-IOV capable, it would
|
|
||||||
also include a nested
|
|
||||||
<code><capability></code> element enumerating all virtual
|
|
||||||
functions available on the physical device (physical port) like in the
|
|
||||||
example below.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<capability type='pci'>
|
|
||||||
...
|
|
||||||
<capability type='virt_functions' maxCount='7'>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x10' function='0x3'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x10' function='0x5'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x10' function='0x7'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x11' function='0x1'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x11' function='0x3'/>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x11' function='0x5'/>
|
|
||||||
</capability>
|
|
||||||
...
|
|
||||||
</capability></pre>
|
|
||||||
<p>
|
|
||||||
A SR-IOV child device on the other hand, would then report its top level
|
|
||||||
capability type as a <code>phys_function</code> instead:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<device>
|
|
||||||
...
|
|
||||||
<capability type='phys_function'>
|
|
||||||
<address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
|
|
||||||
</capability>
|
|
||||||
...
|
|
||||||
<device></pre>
|
|
||||||
|
|
||||||
<h3><a id="MDEVCap">MDEV capability</a></h3>
|
|
||||||
<p>
|
|
||||||
A PCI device capable of creating mediated devices will include a nested
|
|
||||||
capability <code>mdev_types</code> which enumerates all supported mdev
|
|
||||||
types on the physical device, along with the type attributes available
|
|
||||||
through sysfs:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>type</code></dt>
|
|
||||||
<dd>
|
|
||||||
This element describes a mediated device type which acts as an
|
|
||||||
abstract template defining a resource allocation for instances of this
|
|
||||||
device type. The element has one attribute <code>id</code> which holds
|
|
||||||
an official vendor-supplied identifier for the type.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><code>name</code></dt>
|
|
||||||
<dd>
|
|
||||||
The <code>name</code> element holds a vendor-supplied code name for
|
|
||||||
the given mediated device type. This is an optional element.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><code>deviceAPI</code></dt>
|
|
||||||
<dd>
|
|
||||||
The value of this element describes how an instance of the given type
|
|
||||||
will be presented to the guest by the VFIO framework.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><code>availableInstances</code></dt>
|
|
||||||
<dd>
|
|
||||||
This element reports the current state of resource allocation. In other
|
|
||||||
words, how many instances of the given type can still be successfully
|
|
||||||
created on the physical device.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
For a more info about mediated devices, refer to the
|
|
||||||
<a href="#MDEV">paragraph below</a>.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
<device>
|
|
||||||
...
|
|
||||||
<driver>
|
|
||||||
<name>nvidia</name>
|
|
||||||
</driver>
|
|
||||||
<capability type='pci'>
|
|
||||||
...
|
|
||||||
<capability type='mdev_types'>
|
|
||||||
<type id='nvidia-11'>
|
|
||||||
<name>GRID M60-0B</name>
|
|
||||||
<deviceAPI>vfio-pci</deviceAPI>
|
|
||||||
<availableInstances>16</availableInstances>
|
|
||||||
</type>
|
|
||||||
<!-- Here would come the rest of the available mdev types -->
|
|
||||||
</capability>
|
|
||||||
...
|
|
||||||
</capability>
|
|
||||||
</device></pre>
|
|
||||||
|
|
||||||
<h2><a id="MDEV">Mediated devices (MDEVs)</a></h2>
|
|
||||||
<p>
|
|
||||||
Mediated devices (<span class="since">Since 3.2.0</span>) are software
|
|
||||||
devices defining resource allocation on the backing physical device which
|
|
||||||
in turn allows the parent physical device's resources to be divided into
|
|
||||||
several mediated devices, thus sharing the physical device's performance
|
|
||||||
among multiple guests. Unlike SR-IOV however, where a PCIe device appears
|
|
||||||
as multiple separate PCIe devices on the host's PCI bus, mediated devices
|
|
||||||
only appear on the mdev virtual bus. Therefore, no detach/reattach
|
|
||||||
procedure from/to the host driver procedure is involved even though
|
|
||||||
mediated devices are used in a direct device assignment manner.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following sub-elements and attributes are exposed within the
|
|
||||||
<code>capability</code> element:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><code>type</code></dt>
|
|
||||||
<dd>
|
|
||||||
This element describes a mediated device type which acts as an
|
|
||||||
abstract template defining a resource allocation for instances of this
|
|
||||||
device type. The element has one attribute <code>id</code> which holds
|
|
||||||
an official vendor-supplied identifier for the type.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dt><code>iommuGroup</code></dt>
|
|
||||||
<dd>
|
|
||||||
This element supports a single attribute <code>number</code> which holds
|
|
||||||
the IOMMU group number the mediated device belongs to.
|
|
||||||
<span class="since">Since 3.4.0</span>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<h3>Example of a mediated device</h3>
|
|
||||||
<pre>
|
|
||||||
<device>
|
|
||||||
<name>mdev_4b20d080_1b54_4048_85b3_a6a62d165c01</name>
|
|
||||||
<path>/sys/devices/pci0000:00/0000:00:02.0/4b20d080-1b54-4048-85b3-a6a62d165c01</path>
|
|
||||||
<parent>pci_0000_06_00_0</parent>
|
|
||||||
<driver>
|
|
||||||
<name>vfio_mdev</name>
|
|
||||||
</driver>
|
|
||||||
<capability type='mdev'>
|
|
||||||
<type id='nvidia-11'/>
|
|
||||||
<iommuGroup number='12'/>
|
|
||||||
<capability/>
|
|
||||||
<device/></pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The support of mediated device's framework in libvirt's node device driver
|
|
||||||
covers the following features:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
list available mediated devices on the host
|
|
||||||
(<span class="since">Since 3.4.0</span>)
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
display device details
|
|
||||||
(<span class="since">Since 3.4.0</span>)
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Because mediated devices are instantiated from vendor specific templates,
|
|
||||||
simply called 'types', information describing these types is contained
|
|
||||||
within the parent device's capabilities
|
|
||||||
(see the example in <a href="#PCI">PCI host devices</a>).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To see the supported mediated device types on a specific physical device
|
|
||||||
use the following:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ ls /sys/class/mdev_bus/<device>/mdev_supported_types</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
To manually instantiate a mediated device, use one of the following as a
|
|
||||||
reference:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ uuidgen > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create
|
|
||||||
...
|
|
||||||
$ echo <UUID> > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Manual removal of a mediated device is then performed as follows:
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
$ echo 1 > /sys/bus/mdev/devices/<uuid>/remove</pre>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>OpenVZ container driver</h1>
|
<h1>OpenVZ container driver</h1>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
undue trouble.
|
undue trouble.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="connections">Connections to OpenVZ driver</a></h2>
|
<h2><a name="connections">Connections to OpenVZ driver</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt OpenVZ driver is a single-instance privileged driver,
|
The libvirt OpenVZ driver is a single-instance privileged driver,
|
||||||
@@ -40,7 +40,7 @@ openvz+tcp://example.com/system (remote access, SASl/Kerberos)
|
|||||||
openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
|
openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="notes">Notes on bridged networking</a></h2>
|
<h2><a name="notes">Notes on bridged networking</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Bridged networking enables a guest domain (ie container) to have its
|
Bridged networking enables a guest domain (ie container) to have its
|
||||||
@@ -49,7 +49,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
|
|||||||
the host OS.
|
the host OS.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="host">Host network devices</a></h3>
|
<h3><a name="host">Host network devices</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
One or more of the physical devices must be attached to a bridge. The
|
One or more of the physical devices must be attached to a bridge. The
|
||||||
@@ -60,7 +60,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
|
|||||||
physical device "eth0", or a bonding device "bond0".
|
physical device "eth0", or a bonding device "bond0".
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="tools">OpenVZ tools configuration</a></h3>
|
<h3><a name="tools">OpenVZ tools configuration</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
OpenVZ releases later than 3.0.23 ship with a standard network device
|
OpenVZ releases later than 3.0.23 ship with a standard network device
|
||||||
@@ -85,7 +85,7 @@ EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="example">Example guest domain XML configuration</a></h2>
|
<h2><a name="example">Example guest domain XML configuration</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The current libvirt OpenVZ driver has a restriction that the
|
The current libvirt OpenVZ driver has a restriction that the
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>IBM PowerVM hypervisor driver (phyp)</h1>
|
<h1>IBM PowerVM hypervisor driver (phyp)</h1>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM
|
The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
<h2><a id="uri">Connections to the PowerVM driver</a></h2>
|
<h2><a name="uri">Connections to the PowerVM driver</a></h2>
|
||||||
<p>
|
<p>
|
||||||
Some example remote connection URIs for the driver are:
|
Some example remote connection URIs for the driver are:
|
||||||
</p>
|
</p>
|
||||||
@@ -38,7 +38,7 @@ phyp://user@ivm/system (IVM connection)
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="uriformat">URI Format</a></h3>
|
<h3><a name="uriformat">URI Format</a></h3>
|
||||||
<p>
|
<p>
|
||||||
URIs have this general form (<code>[...]</code> marks an
|
URIs have this general form (<code>[...]</code> marks an
|
||||||
optional part, <code>{...|...}</code> marks a mandatory choice).
|
optional part, <code>{...|...}</code> marks a mandatory choice).
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>KVM/QEMU hypervisor driver</h1>
|
<h1>KVM/QEMU hypervisor driver</h1>
|
||||||
@@ -11,19 +11,19 @@
|
|||||||
version 0.12.0 or later.
|
version 0.12.0 or later.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
The <a href="https://www.linux-kvm.org/">KVM</a> Linux
|
The <a href="http://www.linux-kvm.org/">KVM</a> Linux
|
||||||
hypervisor
|
hypervisor
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
The <a href="https://wiki.qemu.org/Index.html">QEMU</a> emulator
|
The <a href="http://wiki.qemu.org/Index.html">QEMU</a> emulator
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="prereq">Deployment pre-requisites</a></h2>
|
<h2><a name="prereq">Deployment pre-requisites</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2><a id="uris">Connections to QEMU driver</a></h2>
|
<h2><a name="uris">Connections to QEMU driver</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt QEMU driver is a multi-instance driver, providing a single
|
The libvirt QEMU driver is a multi-instance driver, providing a single
|
||||||
@@ -63,14 +63,14 @@ qemu+tcp://example.com/system (remote access, SASl/Kerberos)
|
|||||||
qemu+ssh://root@example.com/system (remote access, SSH tunnelled)
|
qemu+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="security">Driver security architecture</a></h2>
|
<h2><a name="security">Driver security architecture</a></h2>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
There are multiple layers to security in the QEMU driver, allowing for
|
There are multiple layers to security in the QEMU driver, allowing for
|
||||||
flexibility in the use of QEMU based virtual machines.
|
flexibility in the use of QEMU based virtual machines.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securitydriver">Driver instances</a></h3>
|
<h3><a name="securitydriver">Driver instances</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
As explained above there are two ways to access the QEMU driver
|
As explained above there are two ways to access the QEMU driver
|
||||||
@@ -94,7 +94,7 @@ qemu+ssh://root@example.com/system (remote access, SSH tunnelled)
|
|||||||
elevated privileges.
|
elevated privileges.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securitydac">POSIX users/groups</a></h3>
|
<h3><a name="securitydac">POSIX users/groups</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
In the "session" instance, the POSIX users/groups model restricts QEMU
|
In the "session" instance, the POSIX users/groups model restricts QEMU
|
||||||
@@ -187,7 +187,7 @@ chmod o+x /path/to/directory
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3><a id="securitycap">Linux process capabilities</a></h3>
|
<h3><a name="securitycap">Linux process capabilities</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The libvirt QEMU driver has a build time option allowing it to use
|
The libvirt QEMU driver has a build time option allowing it to use
|
||||||
@@ -224,7 +224,7 @@ chmod o+x /path/to/directory
|
|||||||
to changing the <code>/etc/libvirt/qemu.conf</code> settings.
|
to changing the <code>/etc/libvirt/qemu.conf</code> settings.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securityselinux">SELinux basic confinement</a></h3>
|
<h3><a name="securityselinux">SELinux basic confinement</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The basic SELinux protection for QEMU virtual machines is intended to
|
The basic SELinux protection for QEMU virtual machines is intended to
|
||||||
@@ -255,7 +255,7 @@ chmod o+x /path/to/directory
|
|||||||
SELinux boolean.
|
SELinux boolean.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securitysvirt">SELinux sVirt confinement</a></h3>
|
<h3><a name="securitysvirt">SELinux sVirt confinement</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The SELinux sVirt protection for QEMU virtual machines builds to the
|
The SELinux sVirt protection for QEMU virtual machines builds to the
|
||||||
@@ -305,7 +305,7 @@ chmod o+x /path/to/directory
|
|||||||
file can be used to change the setting to <code>security_driver="none"</code>
|
file can be used to change the setting to <code>security_driver="none"</code>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3><a id="securitysvirtaa">AppArmor sVirt confinement</a></h3>
|
<h3><a name="securitysvirtaa">AppArmor sVirt confinement</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
When using basic AppArmor protection for the libvirtd daemon and
|
When using basic AppArmor protection for the libvirtd daemon and
|
||||||
@@ -373,7 +373,7 @@ chmod o+x /path/to/directory
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<h3><a id="securityacl">Cgroups device ACLs</a></h3>
|
<h3><a name="securityacl">Cgroups device ACLs</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Recent Linux kernels have a capability known as "cgroups" which is used
|
Recent Linux kernels have a capability known as "cgroups" which is used
|
||||||
@@ -416,7 +416,7 @@ mount -t cgroup none /dev/cgroup -o devices
|
|||||||
<code>/dev/cgroup/libvirt/qemu/$VMNAME/</code>
|
<code>/dev/cgroup/libvirt/qemu/$VMNAME/</code>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="imex">Import and export of libvirt domain XML configs</a></h2>
|
<h2><a name="imex">Import and export of libvirt domain XML configs</a></h2>
|
||||||
|
|
||||||
<p>The QEMU driver currently supports a single native
|
<p>The QEMU driver currently supports a single native
|
||||||
config format known as <code>qemu-argv</code>. The data for this format
|
config format known as <code>qemu-argv</code>. The data for this format
|
||||||
@@ -424,7 +424,7 @@ mount -t cgroup none /dev/cgroup -o devices
|
|||||||
then the QEMu binary name, finally followed by the QEMU command line
|
then the QEMu binary name, finally followed by the QEMU command line
|
||||||
arguments</p>
|
arguments</p>
|
||||||
|
|
||||||
<h3><a id="xmlimport">Converting from QEMU args to domain XML</a></h3>
|
<h3><a name="xmlimport">Converting from QEMU args to domain XML</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-from-native</code> provides a way to
|
The <code>virsh domxml-from-native</code> provides a way to
|
||||||
@@ -473,7 +473,7 @@ $ virsh domxml-from-native qemu-argv demo.args
|
|||||||
|
|
||||||
<p>NB, don't include the literal \ in the args, put everything on one line</p>
|
<p>NB, don't include the literal \ in the args, put everything on one line</p>
|
||||||
|
|
||||||
<h3><a id="xmlexport">Converting from domain XML to QEMU args</a></h3>
|
<h3><a name="xmlexport">Converting from domain XML to QEMU args</a></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The <code>virsh domxml-to-native</code> provides a way to convert a
|
The <code>virsh domxml-to-native</code> provides a way to convert a
|
||||||
@@ -515,7 +515,7 @@ $ virsh domxml-to-native qemu-argv demo.xml
|
|||||||
-serial none -parallel none -usb
|
-serial none -parallel none -usb
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="qemucommand">Pass-through of arbitrary qemu
|
<h2><a name="qemucommand">Pass-through of arbitrary qemu
|
||||||
commands</a></h2>
|
commands</a></h2>
|
||||||
|
|
||||||
<p>Libvirt provides an XML namespace and an optional
|
<p>Libvirt provides an XML namespace and an optional
|
||||||
@@ -582,7 +582,7 @@ $ virsh domxml-to-native qemu-argv demo.xml
|
|||||||
</domain>
|
</domain>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2><a id="xmlconfig">Example domain XML config</a></h2>
|
<h2><a name="xmlconfig">Example domain XML config</a></h2>
|
||||||
|
|
||||||
<h3>QEMU emulated guest on x86_64</h3>
|
<h3>QEMU emulated guest on x86_64</h3>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Remote management driver</h1>
|
<h1>Remote management driver</h1>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>Test "mock" driver</h1>
|
<h1>Test "mock" driver</h1>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html>
|
<!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">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<body>
|
<body>
|
||||||
<h1>User Mode Linux driver</h1>
|
<h1>User Mode Linux driver</h1>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
has pre-created TAP devices.
|
has pre-created TAP devices.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2><a id="project">Project Links</a></h2>
|
<h2><a name="project">Project Links</a></h2>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user