mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-10-07 15:34:05 +03:00
Compare commits
7 Commits
v6.1.0
...
v5.2-maint
Author | SHA1 | Date | |
---|---|---|---|
|
45ae5e529d | ||
|
4f50f36c00 | ||
|
96bca3af45 | ||
|
3d9c891466 | ||
|
c909c8e185 | ||
|
16a5284eb1 | ||
|
de48bfbe09 |
@@ -1,5 +1,7 @@
|
||||
-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
|
||||
|
@@ -1 +0,0 @@
|
||||
../.ctags
|
@@ -1,21 +0,0 @@
|
||||
# EditorConfig is a file format and collection of text editor plugins
|
||||
# for maintaining consistent coding styles between different editors
|
||||
# and IDEs. Most popular editors support this either natively or via
|
||||
# plugin.
|
||||
#
|
||||
# Check https://editorconfig.org for details.
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
|
||||
[*.c]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.{rng,xml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
227
.gitignore
vendored
227
.gitignore
vendored
@@ -1,40 +1,213 @@
|
||||
# vim related ignores
|
||||
*.swp
|
||||
.lvimrc
|
||||
|
||||
# emacs related ignores
|
||||
*#*#
|
||||
*.#*#
|
||||
.#*
|
||||
*~
|
||||
|
||||
# autotools related ignores
|
||||
!/m4/virt-*.m4
|
||||
*.[187]
|
||||
*.[187].in
|
||||
*.a
|
||||
*.cov
|
||||
*.exe
|
||||
*.exe.manifest
|
||||
*.gcda
|
||||
*.gcno
|
||||
*.gcov
|
||||
*.html
|
||||
*.i
|
||||
*.la
|
||||
*.lo
|
||||
*.loT
|
||||
*.o
|
||||
*.orig
|
||||
*.pem
|
||||
*.pyc
|
||||
*.rej
|
||||
*.s
|
||||
*.service
|
||||
*.socket
|
||||
*.swp
|
||||
*~
|
||||
.#*
|
||||
.color_coded
|
||||
.deps
|
||||
.dirstamp
|
||||
.gdb_history
|
||||
.git
|
||||
.git-module-status
|
||||
.libs
|
||||
.lvimrc
|
||||
.memdump
|
||||
.sc-start-sc_*
|
||||
.ycm_extra_conf.py
|
||||
/AUTHORS
|
||||
/ChangeLog
|
||||
/GNUmakefile
|
||||
/INSTALL
|
||||
/NEWS
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/build-aux/compile
|
||||
/build-aux/config.guess
|
||||
/build-aux/config.sub
|
||||
/build-aux/depcomp
|
||||
/build-aux/install-sh
|
||||
/build-aux/ltmain.sh
|
||||
/build-aux/missing
|
||||
/build-aux/test-driver
|
||||
/build-aux/*
|
||||
/build/
|
||||
/confdefs.h
|
||||
/config.cache
|
||||
/config.guess
|
||||
/config.h
|
||||
/config.h.in
|
||||
/config.log
|
||||
/config.rpath
|
||||
/config.status
|
||||
/config.sub
|
||||
/configure
|
||||
/configure.lineno
|
||||
/conftest.*
|
||||
/docs/aclperms.htmlinc
|
||||
/docs/apibuild.py.stamp
|
||||
/docs/devhelp/libvirt.devhelp
|
||||
/docs/hvsupport.html.in
|
||||
/docs/libvirt-admin-*.xml
|
||||
/docs/libvirt-api.xml
|
||||
/docs/libvirt-lxc-*.xml
|
||||
/docs/libvirt-qemu-*.xml
|
||||
/docs/libvirt-refs.xml
|
||||
/docs/news.html.in
|
||||
/docs/search.php
|
||||
/docs/todo.html.in
|
||||
/examples/admin/client_close
|
||||
/examples/admin/client_info
|
||||
/examples/admin/client_limits
|
||||
/examples/admin/list_clients
|
||||
/examples/admin/list_servers
|
||||
/examples/admin/logging
|
||||
/examples/admin/threadpool_params
|
||||
/examples/object-events/event-test
|
||||
/examples/dominfo/info1
|
||||
/examples/domsuspend/suspend
|
||||
/examples/dommigrate/dommigrate
|
||||
/examples/domtop/domtop
|
||||
/examples/hellolibvirt/hellolibvirt
|
||||
/examples/openauth/openauth
|
||||
/examples/rename/rename
|
||||
/gnulib/lib/*
|
||||
/gnulib/m4/*
|
||||
/gnulib/tests/*
|
||||
/include/libvirt/libvirt-common.h
|
||||
/libtool
|
||||
/libvirt-*.tar.xz
|
||||
/libvirt-[0-9]*
|
||||
/libvirt*.pc
|
||||
/libvirt.spec
|
||||
/ltconfig
|
||||
/ltmain.sh
|
||||
/m4/*
|
||||
/maint.mk
|
||||
/mingw-libvirt.spec
|
||||
/mkinstalldirs
|
||||
/po/*gmo
|
||||
/po/*po
|
||||
!/po/*.mini.po
|
||||
/po/*pot
|
||||
/proxy/
|
||||
/python/
|
||||
/run
|
||||
/sc_*
|
||||
/src/.*.stamp
|
||||
/src/*.pc
|
||||
/src/access/org.libvirt.api.policy
|
||||
/src/access/viraccessapicheck.c
|
||||
/src/access/viraccessapicheck.h
|
||||
/src/access/viraccessapichecklxc.c
|
||||
/src/access/viraccessapichecklxc.h
|
||||
/src/access/viraccessapicheckqemu.c
|
||||
/src/access/viraccessapicheckqemu.h
|
||||
/src/admin/admin_client.h
|
||||
/src/admin/admin_protocol.[ch]
|
||||
/src/admin/admin_server_dispatch_stubs.h
|
||||
/src/esx/*.generated.*
|
||||
/src/hyperv/*.generated.*
|
||||
/src/libvirt*.def
|
||||
/src/libvirt.syms
|
||||
/src/libvirt_access.syms
|
||||
/src/libvirt_access.xml
|
||||
/src/libvirt_access_lxc.syms
|
||||
/src/libvirt_access_lxc.xml
|
||||
/src/libvirt_access_qemu.syms
|
||||
/src/libvirt_access_qemu.xml
|
||||
/src/libvirt_admin.syms
|
||||
/src/libvirt_*.stp
|
||||
/src/libvirt_*helper
|
||||
/src/libvirt_*probes.h
|
||||
/src/libvirt_lxc
|
||||
/src/libvirtd
|
||||
/src/libvirtd*.logrotate
|
||||
/src/locking/libxl-lockd.conf
|
||||
/src/locking/libxl-sanlock.conf
|
||||
/src/locking/lock_daemon_dispatch_stubs.h
|
||||
/src/locking/lock_protocol.[ch]
|
||||
/src/locking/qemu-lockd.conf
|
||||
/src/locking/qemu-sanlock.conf
|
||||
/src/locking/test_libvirt_sanlock.aug
|
||||
/src/logging/log_daemon_dispatch_stubs.h
|
||||
/src/logging/log_protocol.[ch]
|
||||
/src/lxc/lxc_controller_dispatch.h
|
||||
/src/lxc/lxc_monitor_dispatch.h
|
||||
/src/lxc/lxc_monitor_protocol.c
|
||||
/src/lxc/lxc_monitor_protocol.h
|
||||
/src/lxc/lxc_protocol.[ch]
|
||||
/src/lxc/test_libvirtd_lxc.aug
|
||||
/src/qemu/test_libvirtd_qemu.aug
|
||||
/src/remote/*_client_bodies.h
|
||||
/src/remote/*_protocol.[ch]
|
||||
/src/remote/*_stubs.h
|
||||
/src/rpc/virkeepaliveprotocol.[ch]
|
||||
/src/rpc/virnetprotocol.[ch]
|
||||
/src/test_libvirt*.aug
|
||||
/src/test_virtlockd.aug
|
||||
/src/test_virtlogd.aug
|
||||
/src/util/virkeycodetable*.h
|
||||
/src/util/virkeynametable*.h
|
||||
/src/virt-aa-helper
|
||||
/src/virtlockd
|
||||
/src/virtlogd
|
||||
/src/virt-guest-shutdown.target
|
||||
/tests/*.log
|
||||
/tests/*.pid
|
||||
/tests/*.trs
|
||||
/tests/*test
|
||||
/tests/commandhelper
|
||||
/tests/qemucapsprobe
|
||||
!/tests/virsh-self-test
|
||||
!/tests/virt-aa-helper-test
|
||||
!/tests/virt-admin-self-test
|
||||
/tests/objectlocking
|
||||
/tests/objectlocking-files.txt
|
||||
/tests/objectlocking.cm[ix]
|
||||
/tests/reconnect
|
||||
/tests/ssh
|
||||
/tests/test_file_access.txt
|
||||
/tests/test_conf
|
||||
/tools/libvirt-guests.sh
|
||||
/tools/virt-login-shell
|
||||
/tools/virsh
|
||||
/tools/virsh-*-edit.c
|
||||
/tools/virt-admin
|
||||
/tools/virt-*-validate
|
||||
/tools/virt-sanlock-cleanup
|
||||
/tools/wireshark/src/libvirt
|
||||
/update.log
|
||||
GPATH
|
||||
GRTAGS
|
||||
GTAGS
|
||||
Makefile
|
||||
Makefile.in
|
||||
|
||||
# git related ignores
|
||||
*.rej
|
||||
*.orig
|
||||
.git-module-status
|
||||
|
||||
# libvirt related ignores
|
||||
/build/
|
||||
/ci/scratch/
|
||||
TAGS
|
||||
coverage
|
||||
cscope.files
|
||||
cscope.in.out
|
||||
cscope.out
|
||||
cscope.po.out
|
||||
results.log
|
||||
stamp-h
|
||||
stamp-h.in
|
||||
stamp-h1
|
||||
tags
|
||||
!/build-aux/*.pl
|
||||
!/gnulib/lib/Makefile.am
|
||||
!/gnulib/tests/Makefile.am
|
||||
!/m4/virt-*.m4
|
||||
|
@@ -1,46 +0,0 @@
|
||||
.job_template: &job_definition
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../autogen.sh $CONFIGURE_OPTS || (cat config.log && exit 1)
|
||||
- make -j $(getconf _NPROCESSORS_ONLN)
|
||||
|
||||
# We could run every arch on every versions, but it is a little
|
||||
# overkill. Instead we split jobs evenly across 9, 10 and sid
|
||||
# to achieve reasonable cross-coverage.
|
||||
|
||||
debian-9-cross-armv6l:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-9-cross-armv6l:latest
|
||||
|
||||
debian-9-cross-mips64el:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-9-cross-mips64el:latest
|
||||
|
||||
debian-9-cross-mips:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-9-cross-mips:latest
|
||||
|
||||
debian-10-cross-aarch64:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-10-cross-aarch64:latest
|
||||
|
||||
debian-10-cross-ppc64le:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-10-cross-ppc64le:latest
|
||||
|
||||
debian-10-cross-s390x:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-10-cross-s390x:latest
|
||||
|
||||
debian-sid-cross-armv7l:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-sid-cross-armv7l:latest
|
||||
|
||||
debian-sid-cross-i686:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-sid-cross-i686:latest
|
||||
|
||||
debian-sid-cross-mipsel:
|
||||
<<: *job_definition
|
||||
image: quay.io/libvirt/buildenv-libvirt-debian-sid-cross-mipsel:latest
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
||||
[submodule "gnulib"]
|
||||
path = .gnulib
|
||||
url = https://git.savannah.gnu.org/git/gnulib.git/
|
||||
[submodule "keycodemapdb"]
|
||||
path = src/keycodemapdb
|
||||
url = https://gitlab.com/keycodemap/keycodemapdb.git
|
||||
|
@@ -1,4 +1,3 @@
|
||||
[gitpublishprofile "default"]
|
||||
base = master
|
||||
to = libvir-list@redhat.com
|
||||
prefix = libvirt PATCH
|
||||
|
1
.gnulib
Submodule
1
.gnulib
Submodule
Submodule .gnulib added at 8089c00979
4
.mailmap
4
.mailmap
@@ -43,10 +43,6 @@
|
||||
<nshirokovskiy@virtuozzo.com> <nshirokovskiy@parallels.com>
|
||||
<jyang@redhat.com> <osier@yunify.com>
|
||||
<kkoukiou@redhat.com> <k.koukiou@googlemail.com>
|
||||
<intrigeri@boum.org> <intrigeri+libvirt@boum.org>
|
||||
<fidencio@redhat.com> <fabiano@fidencio.org>
|
||||
<shi_lei@massclouds.com> <shilei.massclouds@gmx.com>
|
||||
<adrian.brzezinski@eo.pl> <redhat@adrb.pl>
|
||||
|
||||
# Name consolidation:
|
||||
# Preferred author spelling <preferred email>
|
||||
|
128
.travis.yml
128
.travis.yml
@@ -5,100 +5,92 @@ branches:
|
||||
except:
|
||||
- /^.*-maint$/
|
||||
|
||||
addons:
|
||||
homebrew:
|
||||
update: true
|
||||
packages:
|
||||
- ccache
|
||||
- rpcgen
|
||||
- xz
|
||||
- yajl
|
||||
- glib
|
||||
- docutils
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="ubuntu-1804"
|
||||
- MAKE_ARGS="syntax-check distcheck"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE CI_MAKE_ARGS="$MAKE_ARGS"
|
||||
- IMAGE="ubuntu-18"
|
||||
- DOCKER_CMD="$LINUX_CMD"
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="centos-7"
|
||||
- MAKE_ARGS="syntax-check distcheck"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE CI_MAKE_ARGS="$MAKE_ARGS"
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="debian-9"
|
||||
- MAKE_ARGS="syntax-check distcheck"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE CI_MAKE_ARGS="$MAKE_ARGS"
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="fedora-31"
|
||||
- MAKE_ARGS="syntax-check distcheck"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE CI_MAKE_ARGS="$MAKE_ARGS"
|
||||
- DOCKER_CMD="$LINUX_CMD"
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="fedora-rawhide"
|
||||
- MAKE_ARGS="syntax-check distcheck"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE CI_MAKE_ARGS="$MAKE_ARGS"
|
||||
- MINGW="mingw32"
|
||||
- DOCKER_CMD="$MINGW_CMD"
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="fedora-30-cross-mingw32"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE
|
||||
- services:
|
||||
- docker
|
||||
env:
|
||||
- IMAGE="fedora-30-cross-mingw64"
|
||||
script:
|
||||
- make -C ci/ ci-build@$IMAGE
|
||||
- IMAGE="fedora-rawhide"
|
||||
- MINGW="mingw64"
|
||||
- DOCKER_CMD="$MINGW_CMD"
|
||||
- compiler: clang
|
||||
language: c
|
||||
os: osx
|
||||
osx_image: xcode10.3
|
||||
env:
|
||||
- PATH="/usr/local/opt/gettext/bin:/usr/local/opt/ccache/libexec:/usr/local/opt/rpcgen/bin:$PATH"
|
||||
- PKG_CONFIG_PATH="/usr/local/opt/libxml2/lib/pkgconfig"
|
||||
before_script:
|
||||
# Hack to blow away py2
|
||||
- brew link --overwrite python
|
||||
script:
|
||||
# We can't run 'distcheck' or 'syntax-check' because they fail on
|
||||
# macOS, but doing 'install' and 'dist' gives us some useful coverage
|
||||
- mkdir build && cd build
|
||||
- ../autogen.sh --prefix=$(pwd)/install-root && make -j3 && make -j3 install && make -j3 dist
|
||||
- compiler: clang
|
||||
language: c
|
||||
os: osx
|
||||
osx_image: xcode11.3
|
||||
env:
|
||||
- PATH="/usr/local/opt/gettext/bin:/usr/local/opt/ccache/libexec:/usr/local/opt/rpcgen/bin:$PATH"
|
||||
- PKG_CONFIG_PATH="/usr/local/opt/libxml2/lib/pkgconfig"
|
||||
before_script:
|
||||
# Hack to blow away py2
|
||||
- brew link --overwrite python
|
||||
script:
|
||||
# We can't run 'distcheck' or 'syntax-check' because they fail on
|
||||
# macOS, but doing 'install' and 'dist' gives us some useful coverage
|
||||
- mkdir build && cd build
|
||||
- ../autogen.sh --prefix=$(pwd)/install-root && make -j3 && make -j3 install && make -j3 dist
|
||||
/bin/sh -xc "$MACOS_CMD"
|
||||
|
||||
script:
|
||||
- docker run
|
||||
-v $(pwd):/build
|
||||
-w /build
|
||||
-e VIR_TEST_DEBUG="$VIR_TEST_DEBUG"
|
||||
-e MINGW="$MINGW"
|
||||
"quay.io/libvirt/buildenv-$IMAGE:master"
|
||||
/bin/sh -xc "$DOCKER_CMD"
|
||||
|
||||
git:
|
||||
submodules: true
|
||||
|
||||
env:
|
||||
global:
|
||||
- VIR_TEST_DEBUG=1
|
||||
- LINUX_CMD="
|
||||
./autogen.sh &&
|
||||
make -j3 syntax-check &&
|
||||
make -j3 distcheck ||
|
||||
(
|
||||
echo '=== LOG FILE(S) START ===';
|
||||
find -name test-suite.log | xargs cat;
|
||||
echo '=== LOG FILE(S) END ===';
|
||||
exit 1
|
||||
)
|
||||
"
|
||||
- MINGW_CMD="
|
||||
NOCONFIGURE=1 ./autogen.sh &&
|
||||
\$MINGW-configure &&
|
||||
make -j3 ||
|
||||
(
|
||||
echo '=== LOG FILE(S) START ===';
|
||||
find -name test-suite.log | xargs cat;
|
||||
echo '=== LOG FILE(S) END ===';
|
||||
exit 1
|
||||
)
|
||||
"
|
||||
# We can't run 'distcheck' or 'syntax-check' because they fail on
|
||||
# macOS, but doing 'install' and 'dist' gives us some useful coverage
|
||||
- MACOS_CMD="
|
||||
brew update &&
|
||||
brew install ccache rpcgen xz yajl &&
|
||||
./autogen.sh --prefix=\$(pwd)/install-root &&
|
||||
make -j3 &&
|
||||
make -j3 install &&
|
||||
make -j3 dist ||
|
||||
(
|
||||
echo '=== LOG FILE(S) START ===';
|
||||
find -name test-suite.log | xargs cat;
|
||||
echo '=== LOG FILE(S) END ===';
|
||||
exit 1
|
||||
)
|
||||
"
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
# The channel name "irc.oftc.net#virt" is encrypted against libvirt/libvirt
|
||||
|
@@ -1,6 +1,8 @@
|
||||
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',
|
||||
|
@@ -19,7 +19,6 @@ Daniel Veillard <veillard@redhat.com>
|
||||
Doug Goldstein <cardoe@gentoo.org>
|
||||
Eric Blake <eblake@redhat.com>
|
||||
Erik Skultety <eskultet@redhat.com>
|
||||
Fabiano Fidêncio <fidencio@redhat.com>
|
||||
Gao Feng <gaofeng@cn.fujitsu.com>
|
||||
Guido Günther <agx@sigxcpu.org>
|
||||
Ján Tomko <jtomko@redhat.com>
|
||||
|
15
ChangeLog
15
ChangeLog
@@ -1,15 +0,0 @@
|
||||
libvirt ChangeLog
|
||||
=================
|
||||
|
||||
The libvirt project doesn't include a detailed ChangeLog in its release
|
||||
archives.
|
||||
|
||||
If you're interested in the full list of changes made to libvirt since
|
||||
the project was started, you can clone the git repository from
|
||||
|
||||
https://libvirt.org/git/libvirt.git
|
||||
|
||||
and browse them locally using your favorite git history viewer or,
|
||||
alternatively, browse them online at
|
||||
|
||||
https://libvirt.org/git/?p=libvirt.git;a=log
|
16699
ChangeLog-old
Normal file
16699
ChangeLog-old
Normal file
File diff suppressed because it is too large
Load Diff
74
GNUmakefile
74
GNUmakefile
@@ -1,74 +0,0 @@
|
||||
# Having a separate GNUmakefile lets me 'include' the dynamically
|
||||
# generated rules created via cfg.mk (package-local configuration)
|
||||
# as well as maint.mk (generic maintainer rules).
|
||||
# This makefile is used only if you run GNU Make.
|
||||
# It is necessary if you want to build targets usually of interest
|
||||
# only to the maintainer.
|
||||
|
||||
# Copyright (C) 2001, 2003, 2006-2019 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program 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 General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
_build-aux ?= build-aux
|
||||
_autoreconf ?= autoreconf -v
|
||||
|
||||
# If the user runs GNU make but has not yet run ./configure,
|
||||
# give them a diagnostic.
|
||||
_gl-Makefile := $(wildcard [M]akefile)
|
||||
ifneq ($(_gl-Makefile),)
|
||||
|
||||
# Make tar archive easier to reproduce.
|
||||
export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
|
||||
|
||||
# Allow the user to add to this in the Makefile.
|
||||
ALL_RECURSIVE_TARGETS =
|
||||
|
||||
include Makefile
|
||||
include $(srcdir)/$(_build-aux)/syntax-check.mk
|
||||
|
||||
else
|
||||
|
||||
.DEFAULT_GOAL := abort-due-to-no-makefile
|
||||
srcdir = .
|
||||
|
||||
# The package can override .DEFAULT_GOAL to run actions like autoreconf.
|
||||
include $(srcdir)/$(_build-aux)/syntax-check.mk
|
||||
|
||||
ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile)
|
||||
$(MAKECMDGOALS): abort-due-to-no-makefile
|
||||
endif
|
||||
|
||||
abort-due-to-no-makefile:
|
||||
@echo There seems to be no Makefile in this directory. 1>&2
|
||||
@echo "You must run ./configure before running 'make'." 1>&2
|
||||
@exit 1
|
||||
|
||||
endif
|
||||
|
||||
# Tell version 3.79 and up of GNU make to not build goals in this
|
||||
# directory in parallel, in case someone tries to build multiple
|
||||
# targets, and one of them can cause a recursive target to be invoked.
|
||||
|
||||
# Only set this if Automake doesn't provide it.
|
||||
AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
|
||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) \
|
||||
dist distcheck tags ctags
|
||||
|
||||
ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)
|
||||
|
||||
ifneq ($(word 2, $(MAKECMDGOALS)), )
|
||||
ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
|
||||
.NOTPARALLEL:
|
||||
endif
|
||||
endif
|
135
Makefile.am
135
Makefile.am
@@ -16,23 +16,20 @@
|
||||
## License along with this library. If not, see
|
||||
## <http://www.gnu.org/licenses/>.
|
||||
|
||||
LCOV = lcov
|
||||
GENHTML = genhtml
|
||||
|
||||
# when building from tarball -Werror isn't auto enabled
|
||||
# so force it explicitly
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-werror
|
||||
|
||||
SUBDIRS = . include/libvirt src tools docs \
|
||||
SUBDIRS = . gnulib/lib include/libvirt src tools docs gnulib/tests \
|
||||
tests po examples
|
||||
|
||||
XZ_OPT ?= -v -T0
|
||||
export XZ_OPT
|
||||
|
||||
# have gnulib 'make coverage' output to 'cov' dir
|
||||
COVERAGE_OUT = "cov"
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = \
|
||||
config-post.h \
|
||||
ChangeLog-old \
|
||||
libvirt.spec libvirt.spec.in \
|
||||
mingw-libvirt.spec.in \
|
||||
libvirt.pc.in \
|
||||
@@ -41,43 +38,10 @@ EXTRA_DIST = \
|
||||
libvirt-admin.pc.in \
|
||||
Makefile.nonreentrant \
|
||||
autogen.sh \
|
||||
GNUmakefile \
|
||||
cfg.mk \
|
||||
run.in \
|
||||
README.md \
|
||||
AUTHORS.in \
|
||||
scripts/apibuild.py \
|
||||
scripts/augeas-gentest.py \
|
||||
build-aux/check-spacing.pl \
|
||||
scripts/check-aclperms.py \
|
||||
scripts/check-aclrules.py \
|
||||
scripts/check-drivername.py \
|
||||
scripts/check-driverimpls.py \
|
||||
scripts/check-file-access.py \
|
||||
scripts/check-remote-protocol.py \
|
||||
scripts/check-symfile.py \
|
||||
scripts/check-symsorting.py \
|
||||
scripts/dtrace2systemtap.py \
|
||||
scripts/esx_vi_generator.py \
|
||||
scripts/genaclperms.py \
|
||||
scripts/genpolkit.py \
|
||||
scripts/gensystemtap.py \
|
||||
scripts/group-qemu-caps.py \
|
||||
scripts/header-ifdef.py \
|
||||
scripts/hvsupport.py \
|
||||
scripts/hyperv_wmi_generator.py \
|
||||
scripts/minimize-po.py \
|
||||
scripts/mock-noinline.py \
|
||||
scripts/prohibit-duplicate-header.py \
|
||||
scripts/reformat-news.py \
|
||||
scripts/test-wrap-argv.py \
|
||||
build-aux/syntax-check.mk \
|
||||
build-aux/useless-if-before-free \
|
||||
build-aux/vc-list-files \
|
||||
ci/Makefile \
|
||||
ci/build.sh \
|
||||
ci/list-images.sh \
|
||||
ci/prepare.sh \
|
||||
$(NULL)
|
||||
AUTHORS.in
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
||||
@@ -85,7 +49,7 @@ pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
||||
NEWS: \
|
||||
$(srcdir)/docs/news.xml \
|
||||
$(srcdir)/docs/news-ascii.xsl \
|
||||
$(top_srcdir)/scripts/reformat-news.py
|
||||
$(srcdir)/docs/reformat-news.py
|
||||
$(AM_V_GEN) \
|
||||
if [ -x $(XSLTPROC) ]; then \
|
||||
$(XSLTPROC) --nonet \
|
||||
@@ -93,14 +57,14 @@ NEWS: \
|
||||
$(srcdir)/docs/news.xml \
|
||||
>$@-tmp \
|
||||
|| { rm -f $@-tmp; exit 1; }; \
|
||||
$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/reformat-news.py $@-tmp >$@ \
|
||||
$(PYTHON) $(srcdir)/docs/reformat-news.py $@-tmp >$@ \
|
||||
|| { rm -f $@-tmp; exit 1; }; \
|
||||
rm -f $@-tmp; \
|
||||
fi
|
||||
EXTRA_DIST += \
|
||||
$(srcdir)/docs/news.xml \
|
||||
$(srcdir)/docs/news-ascii.xsl \
|
||||
$(NULL)
|
||||
$(srcdir)/docs/reformat-news.py
|
||||
|
||||
rpm: clean
|
||||
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
|
||||
@@ -110,33 +74,24 @@ srpm: clean
|
||||
|
||||
check-local: all tests
|
||||
|
||||
check-access: all
|
||||
check-access:
|
||||
@($(MAKE) $(AM_MAKEFLAGS) -C tests check-access)
|
||||
|
||||
cov: clean-cov
|
||||
$(MKDIR_P) $(top_builddir)/coverage
|
||||
$(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp \
|
||||
-d $(top_builddir)/src \
|
||||
-d $(top_builddir)/tests
|
||||
$(LCOV) -r $(top_builddir)/coverage/libvirt.info.tmp \
|
||||
-o $(top_builddir)/coverage/libvirt.info
|
||||
rm $(top_builddir)/coverage/libvirt.info.tmp
|
||||
$(GENHTML) --show-details -t "libvirt" -o $(top_builddir)/coverage \
|
||||
--legend $(top_builddir)/coverage/libvirt.info
|
||||
|
||||
clean-cov:
|
||||
rm -rf $(top_builddir)/coverage
|
||||
|
||||
MAINTAINERCLEANFILES = .git-module-status
|
||||
|
||||
BUILT_SOURCES = configmake.h
|
||||
CLEANFILES = configmake.h
|
||||
dist-hook: gen-ChangeLog gen-AUTHORS
|
||||
|
||||
distclean-local: clean-GNUmakefile
|
||||
clean-GNUmakefile:
|
||||
test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile
|
||||
|
||||
dist-hook: gen-AUTHORS
|
||||
# Generate the ChangeLog file (with all entries since the switch to git)
|
||||
# and insert it into the directory we're about to use to create a tarball.
|
||||
gen_start_date = 2009-07-04
|
||||
.PHONY: gen-ChangeLog
|
||||
gen-ChangeLog:
|
||||
$(AM_V_GEN)if test -d .git; then \
|
||||
$(top_srcdir)/build-aux/gitlog-to-changelog \
|
||||
--since=$(gen_start_date) > $(distdir)/cl-t; \
|
||||
rm -f $(distdir)/ChangeLog; \
|
||||
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
|
||||
fi
|
||||
|
||||
.PHONY: gen-AUTHORS
|
||||
gen-AUTHORS:
|
||||
@@ -154,47 +109,3 @@ gen-AUTHORS:
|
||||
mv -f $(distdir)/AUTHORS-tmp $(distdir)/AUTHORS && \
|
||||
rm -f all.list maint.list contrib.list; \
|
||||
fi
|
||||
|
||||
ci-%:
|
||||
$(MAKE) -C $(srcdir)/ci/ $@
|
||||
|
||||
# Listed in the same order as the GNU makefile conventions, and
|
||||
# provided by autoconf 2.59c+ or 2.70.
|
||||
# The Automake-defined pkg* macros are appended, in the order
|
||||
# listed in the Automake 1.10a+ documentation.
|
||||
configmake.h: Makefile
|
||||
$(AM_V_GEN)rm -f $@-t && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
echo '#if WIN32'; \
|
||||
echo '# include <winsock2.h> /* avoid mingw pollution on DATADIR */'; \
|
||||
echo '#endif'; \
|
||||
echo '#define PREFIX "$(prefix)"'; \
|
||||
echo '#define EXEC_PREFIX "$(exec_prefix)"'; \
|
||||
echo '#define BINDIR "$(bindir)"'; \
|
||||
echo '#define SBINDIR "$(sbindir)"'; \
|
||||
echo '#define LIBEXECDIR "$(libexecdir)"'; \
|
||||
echo '#define DATAROOTDIR "$(datarootdir)"'; \
|
||||
echo '#define DATADIR "$(datadir)"'; \
|
||||
echo '#define SYSCONFDIR "$(sysconfdir)"'; \
|
||||
echo '#define SHAREDSTATEDIR "$(sharedstatedir)"'; \
|
||||
echo '#define LOCALSTATEDIR "$(localstatedir)"'; \
|
||||
echo '#define RUNSTATEDIR "$(runstatedir)"'; \
|
||||
echo '#define INCLUDEDIR "$(includedir)"'; \
|
||||
echo '#define OLDINCLUDEDIR "$(oldincludedir)"'; \
|
||||
echo '#define DOCDIR "$(docdir)"'; \
|
||||
echo '#define INFODIR "$(infodir)"'; \
|
||||
echo '#define HTMLDIR "$(htmldir)"'; \
|
||||
echo '#define DVIDIR "$(dvidir)"'; \
|
||||
echo '#define PDFDIR "$(pdfdir)"'; \
|
||||
echo '#define PSDIR "$(psdir)"'; \
|
||||
echo '#define LIBDIR "$(libdir)"'; \
|
||||
echo '#define LISPDIR "$(lispdir)"'; \
|
||||
echo '#define LOCALEDIR "$(localedir)"'; \
|
||||
echo '#define MANDIR "$(mandir)"'; \
|
||||
echo '#define MANEXT "$(manext)"'; \
|
||||
echo '#define PKGDATADIR "$(pkgdatadir)"'; \
|
||||
echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \
|
||||
echo '#define PKGLIBDIR "$(pkglibdir)"'; \
|
||||
echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \
|
||||
} | sed '/""/d' > $@-t && \
|
||||
mv -f $@-t $@
|
||||
|
@@ -11,7 +11,7 @@ We've opted to keep only the highest-level sources in the GIT repository.
|
||||
This eases our maintenance burden, (fewer merges etc.), but imposes more
|
||||
requirements on anyone wishing to build from the just-checked-out sources.
|
||||
Note the requirements to build the released archive are much less and
|
||||
are just the requirements of the standard configure && make procedure.
|
||||
are just the requirements of the standard ./configure && make procedure.
|
||||
Specific development tools and versions will be checked for and listed by
|
||||
the bootstrap script.
|
||||
|
||||
@@ -28,13 +28,16 @@ You can get a copy of the source repository like this:
|
||||
$ git clone https://libvirt.org/git/libvirt.git
|
||||
$ cd libvirt
|
||||
|
||||
We require to have the build directory different than the source directory:
|
||||
As an optional step, if you already have a copy of the gnulib git
|
||||
repository on your hard drive, then you can use it as a reference to
|
||||
reduce download time and disk space requirements:
|
||||
|
||||
$ mkdir build && cd build
|
||||
$ export GNULIB_SRCDIR=/path/to/gnulib
|
||||
|
||||
The next step is to invoke ../autogen.sh:
|
||||
The next step is to get all required pieces from gnulib,
|
||||
to run autoreconf, and to invoke ./configure:
|
||||
|
||||
$ ../autogen.sh
|
||||
$ ./autogen.sh
|
||||
|
||||
And there you are! Just
|
||||
|
||||
@@ -44,7 +47,6 @@ And there you are! Just
|
||||
At this point, there should be no difference between your local copy,
|
||||
and the GIT master copy:
|
||||
|
||||
$ cd ..
|
||||
$ git diff
|
||||
|
||||
should output no difference.
|
||||
|
13
README.md
13
README.md
@@ -30,7 +30,7 @@ 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.0 (or later). See the files `COPYING.LESSER`
|
||||
Public License, version 2.1 (or later). See the files `COPYING.LESSER`
|
||||
and `COPYING` for full license terms & conditions.
|
||||
|
||||
|
||||
@@ -38,13 +38,11 @@ Installation
|
||||
------------
|
||||
|
||||
Libvirt uses the GNU Autotools build system, so in general can be built
|
||||
and installed with the usual commands, however, we mandate to have the
|
||||
build directory different than the source directory. For example, to build
|
||||
in a manner that is suitable for installing as root, use:
|
||||
and installed with the usual commands. For example, to build in a manner
|
||||
that is suitable for installing as root, use:
|
||||
|
||||
```
|
||||
$ mkdir build && cd build
|
||||
$ ../configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
|
||||
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
|
||||
$ make
|
||||
$ sudo make install
|
||||
```
|
||||
@@ -52,8 +50,7 @@ $ sudo make install
|
||||
While to build & install as an unprivileged user
|
||||
|
||||
```
|
||||
$ mkdir build && cd build
|
||||
$ ../configure --prefix=$HOME/usr
|
||||
$ ./configure --prefix=$HOME/usr
|
||||
$ make
|
||||
$ make install
|
||||
```
|
||||
|
226
autogen.sh
226
autogen.sh
@@ -1,44 +1,208 @@
|
||||
#!/bin/sh
|
||||
# Run this to generate all the initial makefiles, etc.
|
||||
test -n "$srcdir" || srcdir=$(dirname "$0")
|
||||
test -n "$srcdir" || srcdir=.
|
||||
|
||||
olddir=$(pwd)
|
||||
|
||||
cd "$srcdir"
|
||||
|
||||
(test -f src/libvirt.c) || {
|
||||
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||
echo " top-level libvirt directory"
|
||||
die()
|
||||
{
|
||||
echo "error: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
git submodule update --init || exit 1
|
||||
starting_point=$(pwd)
|
||||
|
||||
autoreconf --verbose --force --install || exit 1
|
||||
srcdir=$(dirname "$0")
|
||||
test "$srcdir" || srcdir=.
|
||||
|
||||
if test "x$1" = "x--system"; then
|
||||
shift
|
||||
prefix=/usr
|
||||
libdir=$prefix/lib
|
||||
sysconfdir=/etc
|
||||
localstatedir=/var
|
||||
if [ -d /usr/lib64 ]; then
|
||||
libdir=$prefix/lib64
|
||||
fi
|
||||
EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir"
|
||||
fi
|
||||
cd "$srcdir" || {
|
||||
die "Failed to cd into $srcdir"
|
||||
}
|
||||
|
||||
cd "$olddir"
|
||||
test -f src/libvirt.c || {
|
||||
die "$0 must live in the top-level libvirt directory"
|
||||
}
|
||||
|
||||
if [ "$NOCONFIGURE" = "" ]; then
|
||||
$srcdir/configure $EXTRA_ARGS "$@" || exit 1
|
||||
|
||||
if [ "$1" = "--help" ]; then
|
||||
exit 0
|
||||
dry_run=
|
||||
no_git=
|
||||
gnulib_srcdir=
|
||||
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"
|
||||
shift
|
||||
;;
|
||||
--gnulib-srcdir=*)
|
||||
gnulib_srcdir=" $1"
|
||||
shift
|
||||
;;
|
||||
--gnulib-srcdir)
|
||||
gnulib_srcdir=" $1=$2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
--system)
|
||||
prefix=/usr
|
||||
sysconfdir=/etc
|
||||
localstatedir=/var
|
||||
if test -d $prefix/lib64; then
|
||||
libdir=$prefix/lib64
|
||||
else
|
||||
echo "Now type 'make' to compile libvirt" || exit 1
|
||||
libdir=$prefix/lib
|
||||
fi
|
||||
else
|
||||
echo "Skipping configure process."
|
||||
extra_args="--prefix=$prefix --localstatedir=$localstatedir"
|
||||
extra_args="$extra_args --sysconfdir=$sysconfdir --libdir=$libdir"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
# All remaining arguments will be passed to configure verbatim
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
no_git="$no_git$gnulib_srcdir"
|
||||
|
||||
gnulib_hash()
|
||||
{
|
||||
local no_git=$1
|
||||
|
||||
if test "$no_git"; then
|
||||
echo "no-git"
|
||||
return
|
||||
fi
|
||||
|
||||
# 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 ls-tree -d HEAD gnulib/local | awk '{ print $3 }'
|
||||
}
|
||||
|
||||
# Only look into git submodules if we're in a git checkout
|
||||
if test -d .git || test -f .git; then
|
||||
|
||||
# Check for dirty submodules
|
||||
if test -z "$CLEAN_SUBMODULE"; then
|
||||
for path in $(git submodule status | awk '{ print $2 }'); do
|
||||
case "$(git diff "$path")" in
|
||||
*-dirty*)
|
||||
echo "error: $path is dirty, please investigate" >&2
|
||||
echo "set CLEAN_SUBMODULE to discard submodule changes" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
if test "$CLEAN_SUBMODULE" && test -z "$no_git"; then
|
||||
if test -z "$dry_run"; then
|
||||
echo "Cleaning up submodules..."
|
||||
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 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
|
||||
# Whenever the gnulib submodule or any of the related bits
|
||||
# has been changed in some way (see gnulib_hash) we need to
|
||||
# run bootstrap again. If we're performing a dry run, we
|
||||
# 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
|
||||
fi
|
||||
|
||||
# When performing a dry run, we can stop here
|
||||
test "$dry_run" && exit "$dry_run"
|
||||
|
||||
# If asked not to run configure, we can stop here
|
||||
test "$NOCONFIGURE" && exit 0
|
||||
|
||||
cd "$starting_point" || {
|
||||
die "Failed to cd into $starting_point"
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
# Make sure we can find GNU make and tell the user
|
||||
# the right command to run
|
||||
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
|
||||
if test -z "$*" && test -z "$extra_args"; then
|
||||
echo "I am going to run configure with no arguments - if you wish"
|
||||
echo "to pass any to it, please specify them on the $0 command line."
|
||||
else
|
||||
echo "Running configure with $extra_args $@"
|
||||
fi
|
||||
"$srcdir/configure" $extra_args "$@" || {
|
||||
die "configure failed"
|
||||
}
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Now type '$MAKE' to compile libvirt."
|
||||
|
199
bootstrap.conf
Normal file
199
bootstrap.conf
Normal file
@@ -0,0 +1,199 @@
|
||||
# Bootstrap configuration.
|
||||
|
||||
# Copyright (C) 2010-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 program 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/>.
|
||||
|
||||
# gnulib modules used by this package.
|
||||
gnulib_modules='
|
||||
accept
|
||||
areadlink
|
||||
autobuild
|
||||
base64
|
||||
bind
|
||||
bitrotate
|
||||
byteswap
|
||||
c-ctype
|
||||
c-strcase
|
||||
c-strcasestr
|
||||
calloc-posix
|
||||
canonicalize-lgpl
|
||||
chown
|
||||
clock-time
|
||||
close
|
||||
connect
|
||||
configmake
|
||||
count-leading-zeros
|
||||
count-one-bits
|
||||
dirname-lgpl
|
||||
environ
|
||||
execinfo
|
||||
fclose
|
||||
fcntl
|
||||
fcntl-h
|
||||
fdatasync
|
||||
ffs
|
||||
ffsl
|
||||
fnmatch
|
||||
fsync
|
||||
func
|
||||
getaddrinfo
|
||||
getcwd-lgpl
|
||||
gethostname
|
||||
getopt-posix
|
||||
getpass
|
||||
getpeername
|
||||
getsockname
|
||||
gettimeofday
|
||||
gitlog-to-changelog
|
||||
gnumakefile
|
||||
ignore-value
|
||||
inet_pton
|
||||
intprops
|
||||
ioctl
|
||||
isatty
|
||||
largefile
|
||||
ldexp
|
||||
listen
|
||||
localeconv
|
||||
maintainer-makefile
|
||||
manywarnings
|
||||
mgetgroups
|
||||
mkdtemp
|
||||
mkostemp
|
||||
mkostemps
|
||||
mktempd
|
||||
net_if
|
||||
netdb
|
||||
nonblocking
|
||||
openpty
|
||||
passfd
|
||||
perror
|
||||
physmem
|
||||
pipe-posix
|
||||
pipe2
|
||||
poll
|
||||
posix-shell
|
||||
pthread
|
||||
pthread_sigmask
|
||||
recv
|
||||
regex
|
||||
sched
|
||||
secure_getenv
|
||||
send
|
||||
setenv
|
||||
setsockopt
|
||||
sigaction
|
||||
sigpipe
|
||||
snprintf
|
||||
socket
|
||||
stat-time
|
||||
stdarg
|
||||
stpcpy
|
||||
strchrnul
|
||||
strdup-posix
|
||||
strndup
|
||||
strerror
|
||||
strerror_r-posix
|
||||
strptime
|
||||
strsep
|
||||
strtok_r
|
||||
sys_stat
|
||||
sys_wait
|
||||
termios
|
||||
time_r
|
||||
timegm
|
||||
ttyname_r
|
||||
uname
|
||||
unsetenv
|
||||
useless-if-before-free
|
||||
usleep
|
||||
vasprintf
|
||||
verify
|
||||
vc-list-files
|
||||
vsnprintf
|
||||
waitpid
|
||||
warnings
|
||||
wcwidth
|
||||
'
|
||||
|
||||
SKIP_PO=true
|
||||
|
||||
# Enable copy-mode for MSYS/MinGW. MSYS' ln doesn't work well in the way
|
||||
# bootstrap uses it with relative paths.
|
||||
if test -n "$MSYSTEM"; then
|
||||
copy=true
|
||||
fi
|
||||
|
||||
|
||||
# Tell gnulib to:
|
||||
# require LGPLv2+
|
||||
# apply any local diffs in gnulib/local/ dir
|
||||
# put *.m4 files in m4/ dir
|
||||
# put *.[ch] files in new gnulib/lib/ dir
|
||||
# import gnulib tests in new gnulib/tests/ dir
|
||||
gnulib_name=libgnu
|
||||
m4_base=m4
|
||||
source_base=gnulib/lib
|
||||
tests_base=gnulib/tests
|
||||
gnulib_tool_option_extras="\
|
||||
--lgpl=2\
|
||||
--with-tests\
|
||||
--makefile-name=gnulib.mk\
|
||||
--avoid=pt_chown\
|
||||
--avoid=lock-tests\
|
||||
"
|
||||
local_gl_dir=gnulib/local
|
||||
|
||||
# Build prerequisites
|
||||
# Note that some of these programs are only required for 'make dist' to
|
||||
# succeed from a fresh git checkout; not all of these programs are
|
||||
# required to run 'make dist' on a tarball.
|
||||
buildreq="\
|
||||
autoconf 2.59
|
||||
automake 1.9.6
|
||||
git 1.5.5
|
||||
gzip -
|
||||
libtool -
|
||||
patch -
|
||||
perl 5.5
|
||||
pkg-config -
|
||||
rpcgen -
|
||||
tar -
|
||||
xmllint -
|
||||
xsltproc -
|
||||
"
|
||||
|
||||
# Automake requires that ChangeLog and AUTHORS exist.
|
||||
touch AUTHORS ChangeLog || exit 1
|
||||
|
||||
# Override bootstrap's list - we don't use mdate-sh or texinfo.tex.
|
||||
gnulib_extra_files="
|
||||
build-aux/install-sh
|
||||
build-aux/depcomp
|
||||
build-aux/config.guess
|
||||
build-aux/config.sub
|
||||
doc/INSTALL
|
||||
"
|
||||
|
||||
|
||||
bootstrap_post_import_hook()
|
||||
{
|
||||
# Change paths in gnulib/tests/gnulib.mk from "../../.." to "../..",
|
||||
# and make tests conditional by changing "TESTS" to "GNULIB_TESTS".
|
||||
m=gnulib/tests/gnulib.mk
|
||||
sed 's,\.\./\.\./\.\.,../..,g; s/^TESTS /GNULIB_TESTS /' $m > $m-t
|
||||
mv -f $m-t $m
|
||||
}
|
68
build-aux/augeas-gentest.pl
Executable file
68
build-aux/augeas-gentest.pl
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env perl
|
||||
#
|
||||
# augeas-gentest.pl: Generate an augeas test file, from an
|
||||
# example config file + test file template
|
||||
#
|
||||
# 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/>.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
die "syntax: $0 CONFIG TEMPLATE AUGTEST\n" unless @ARGV == 3;
|
||||
|
||||
my $config = shift @ARGV;
|
||||
my $template = shift @ARGV;
|
||||
my $augtest = shift @ARGV;
|
||||
|
||||
open AUGTEST, ">", $augtest or die "cannot create $augtest: $!";
|
||||
|
||||
$SIG{__DIE__} = sub {
|
||||
unlink $augtest;
|
||||
};
|
||||
|
||||
open CONFIG, "<", $config or die "cannot read $config: $!";
|
||||
open TEMPLATE, "<", $template or die "cannot read $template: $!";
|
||||
|
||||
my $group = 0;
|
||||
while (<TEMPLATE>) {
|
||||
if (/::CONFIG::/) {
|
||||
my $group = 0;
|
||||
print AUGTEST " let conf = \"";
|
||||
while (<CONFIG>) {
|
||||
if (/^#\w/) {
|
||||
s/^#//;
|
||||
s/\"/\\\"/g;
|
||||
print AUGTEST $_;
|
||||
$group = /\[\s$/;
|
||||
} elsif ($group) {
|
||||
s/\"/\\\"/g;
|
||||
if (/#\s*\]/) {
|
||||
$group = 0;
|
||||
}
|
||||
if (/^#/) {
|
||||
s/^#//;
|
||||
print AUGTEST $_;
|
||||
}
|
||||
}
|
||||
}
|
||||
print AUGTEST "\"\n";
|
||||
} else {
|
||||
print AUGTEST $_;
|
||||
}
|
||||
}
|
||||
|
||||
close TEMPLATE;
|
||||
close CONFIG;
|
||||
close AUGTEST or die "cannot save $augtest: $!";
|
156
build-aux/header-ifdef.pl
Normal file
156
build-aux/header-ifdef.pl
Normal file
@@ -0,0 +1,156 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# Validate that header files follow a standard layout:
|
||||
#
|
||||
# /*
|
||||
# ...copyright header...
|
||||
# */
|
||||
# <one blank line>
|
||||
# #ifndef SYMBOL
|
||||
# # define SYMBOL
|
||||
# ....content....
|
||||
# #endif /* SYMBOL */
|
||||
#
|
||||
# For any file ending priv.h, before the #ifndef
|
||||
# We will have a further section
|
||||
#
|
||||
# #ifndef SYMBOL_ALLOW
|
||||
# # error ....
|
||||
# #endif /* SYMBOL_ALLOW */
|
||||
# <one blank line>
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my $STATE_COPYRIGHT_COMMENT = 0;
|
||||
my $STATE_COPYRIGHT_BLANK = 1;
|
||||
my $STATE_PRIV_START = 2;
|
||||
my $STATE_PRIV_ERROR = 3;
|
||||
my $STATE_PRIV_END = 4;
|
||||
my $STATE_PRIV_BLANK = 5;
|
||||
my $STATE_GUARD_START = 6;
|
||||
my $STATE_GUARD_DEFINE = 7;
|
||||
my $STATE_GUARD_END = 8;
|
||||
my $STATE_EOF = 9;
|
||||
|
||||
my $file = " ";
|
||||
my $ret = 0;
|
||||
my $ifdef = "";
|
||||
my $ifdefpriv = "";
|
||||
|
||||
my $state = $STATE_EOF;
|
||||
my $mistake = 0;
|
||||
|
||||
sub mistake {
|
||||
my $msg = shift;
|
||||
warn $msg;
|
||||
$mistake = 1;
|
||||
$ret = 1;
|
||||
}
|
||||
|
||||
while (<>) {
|
||||
if (not $file eq $ARGV) {
|
||||
if ($state == $STATE_COPYRIGHT_COMMENT) {
|
||||
&mistake("$file: missing copyright comment");
|
||||
} elsif ($state == $STATE_COPYRIGHT_BLANK) {
|
||||
&mistake("$file: missing blank line after copyright header");
|
||||
} elsif ($state == $STATE_PRIV_START) {
|
||||
&mistake("$file: missing '#ifndef $ifdefpriv'");
|
||||
} elsif ($state == $STATE_PRIV_ERROR) {
|
||||
&mistake("$file: missing '# error ...priv allow...'");
|
||||
} elsif ($state == $STATE_PRIV_END) {
|
||||
&mistake("$file: missing '#endif /* $ifdefpriv */'");
|
||||
} elsif ($state == $STATE_PRIV_BLANK) {
|
||||
&mistake("$file: missing blank line after priv header check");
|
||||
} elsif ($state == $STATE_GUARD_START) {
|
||||
&mistake("$file: missing '#ifndef $ifdef'");
|
||||
} elsif ($state == $STATE_GUARD_DEFINE) {
|
||||
&mistake("$file: missing '# define $ifdef'");
|
||||
} elsif ($state == $STATE_GUARD_END) {
|
||||
&mistake("$file: missing '#endif /* $ifdef */'");
|
||||
}
|
||||
|
||||
$ifdef = uc $ARGV;
|
||||
$ifdef =~ s,.*/,,;
|
||||
$ifdef =~ s,[^A-Z0-9],_,g;
|
||||
$ifdef =~ s,__+,_,g;
|
||||
unless ($ifdef =~ /^LIBVIRT_/ && $ARGV !~ /libvirt_internal.h/) {
|
||||
$ifdef = "LIBVIRT_" . $ifdef;
|
||||
}
|
||||
$ifdefpriv = $ifdef . "_ALLOW";
|
||||
|
||||
$file = $ARGV;
|
||||
$state = $STATE_COPYRIGHT_COMMENT;
|
||||
$mistake = 0;
|
||||
}
|
||||
|
||||
if ($mistake ||
|
||||
$ARGV =~ /config-post\.h$/ ||
|
||||
$ARGV =~ /vbox_(CAPI|XPCOM)/) {
|
||||
$state = $STATE_EOF;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($state == $STATE_COPYRIGHT_COMMENT) {
|
||||
if (m,\*/,) {
|
||||
$state = $STATE_COPYRIGHT_BLANK;
|
||||
}
|
||||
} elsif ($state == $STATE_COPYRIGHT_BLANK) {
|
||||
if (! /^$/) {
|
||||
&mistake("$file: missing blank line after copyright header");
|
||||
}
|
||||
if ($ARGV =~ /priv\.h$/) {
|
||||
$state = $STATE_PRIV_START;
|
||||
} else {
|
||||
$state = $STATE_GUARD_START;
|
||||
}
|
||||
} elsif ($state == $STATE_PRIV_START) {
|
||||
if (/^$/) {
|
||||
&mistake("$file: too many blank lines after coyright header");
|
||||
} elsif (/#ifndef $ifdefpriv$/) {
|
||||
$state = $STATE_PRIV_ERROR;
|
||||
} else {
|
||||
&mistake("$file: missing '#ifndef $ifdefpriv'");
|
||||
}
|
||||
} elsif ($state == $STATE_PRIV_ERROR) {
|
||||
if (/# error ".*"$/) {
|
||||
$state = $STATE_PRIV_END;
|
||||
} else {
|
||||
&mistake("$file: missing '#error ...priv allow...'");
|
||||
}
|
||||
} elsif ($state == $STATE_PRIV_END) {
|
||||
if (m,#endif /\* $ifdefpriv \*/,) {
|
||||
$state = $STATE_PRIV_BLANK;
|
||||
} else {
|
||||
&mistake("$file: missing '#endif /* $ifdefpriv */'");
|
||||
}
|
||||
} elsif ($state == $STATE_PRIV_BLANK) {
|
||||
if (! /^$/) {
|
||||
&mistake("$file: missing blank line after priv guard");
|
||||
}
|
||||
$state = $STATE_GUARD_START;
|
||||
} elsif ($state == $STATE_GUARD_START) {
|
||||
if (/^$/) {
|
||||
&mistake("$file: too many blank lines after coyright header");
|
||||
} elsif (/#ifndef $ifdef$/) {
|
||||
$state = $STATE_GUARD_DEFINE;
|
||||
} else {
|
||||
&mistake("$file: missing '#ifndef $ifdef'");
|
||||
}
|
||||
} elsif ($state == $STATE_GUARD_DEFINE) {
|
||||
if (/# define $ifdef$/) {
|
||||
$state = $STATE_GUARD_END;
|
||||
} else {
|
||||
&mistake("$file: missing '# define $ifdef'");
|
||||
}
|
||||
} elsif ($state == $STATE_GUARD_END) {
|
||||
if (m,#endif /\* $ifdef \*/$,) {
|
||||
$state = $STATE_EOF;
|
||||
}
|
||||
} elsif ($state == $STATE_EOF) {
|
||||
die "$file: unexpected content after '#endif /* $ifdef */'";
|
||||
} else {
|
||||
die "$file: unexpected state $state";
|
||||
}
|
||||
}
|
||||
exit $ret;
|
37
build-aux/minimize-po.pl
Executable file
37
build-aux/minimize-po.pl
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
my @block;
|
||||
my $msgstr = 0;
|
||||
my $empty = 0;
|
||||
my $unused = 0;
|
||||
my $fuzzy = 0;
|
||||
while (<>) {
|
||||
if (/^$/) {
|
||||
if (!$empty && !$unused && !$fuzzy) {
|
||||
print @block;
|
||||
}
|
||||
@block = ();
|
||||
$msgstr = 0;
|
||||
$fuzzy = 0;
|
||||
push @block, $_;
|
||||
} else {
|
||||
if (/^msgstr/) {
|
||||
$msgstr = 1;
|
||||
$empty = 1;
|
||||
}
|
||||
if (/^#.*fuzzy/) {
|
||||
$fuzzy = 1;
|
||||
}
|
||||
if (/^#~ msgstr/) {
|
||||
$unused = 1;
|
||||
}
|
||||
if ($msgstr && /".+"/) {
|
||||
$empty = 0;
|
||||
}
|
||||
push @block, $_;
|
||||
}
|
||||
}
|
||||
|
||||
if (@block && !$empty && !$unused) {
|
||||
print @block;
|
||||
}
|
72
build-aux/mock-noinline.pl
Normal file
72
build-aux/mock-noinline.pl
Normal file
@@ -0,0 +1,72 @@
|
||||
#!/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
|
||||
}
|
26
build-aux/prohibit-duplicate-header.pl
Normal file
26
build-aux/prohibit-duplicate-header.pl
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $file = " ";
|
||||
my $ret = 0;
|
||||
my %includes = ( );
|
||||
my $lineno = 0;
|
||||
|
||||
while (<>) {
|
||||
if (not $file eq $ARGV) {
|
||||
%includes = ( );
|
||||
$file = $ARGV;
|
||||
$lineno = 0;
|
||||
}
|
||||
$lineno++;
|
||||
if (/^# *include *[<"]([^>"]*\.h)[">]/) {
|
||||
$includes{$1}++;
|
||||
if ($includes{$1} == 2) {
|
||||
$ret = 1;
|
||||
print STDERR "$ARGV:$lineno: $_";
|
||||
print STDERR "Do not include a header more than once per file\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
exit $ret;
|
File diff suppressed because it is too large
Load Diff
@@ -1,226 +0,0 @@
|
||||
#!/bin/sh
|
||||
#! -*-perl-*-
|
||||
|
||||
# Detect instances of "if (p) free (p);".
|
||||
# Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces.
|
||||
|
||||
# Copyright (C) 2008-2019 Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Written by Jim Meyering
|
||||
|
||||
# This is a prologue that allows to run a perl script as an executable
|
||||
# on systems that are compliant to a POSIX version before POSIX:2017.
|
||||
# On such systems, the usual invocation of an executable through execlp()
|
||||
# or execvp() fails with ENOEXEC if it is a script that does not start
|
||||
# with a #! line. The script interpreter mentioned in the #! line has
|
||||
# to be /bin/sh, because on GuixSD systems that is the only program that
|
||||
# has a fixed file name. The second line is essential for perl and is
|
||||
# also useful for editing this file in Emacs. The next two lines below
|
||||
# are valid code in both sh and perl. When executed by sh, they re-execute
|
||||
# the script through the perl program found in $PATH. The '-x' option
|
||||
# is essential as well; without it, perl would re-execute the script
|
||||
# through /bin/sh. When executed by perl, the next two lines are a no-op.
|
||||
eval 'exec perl -wSx "$0" "$@"'
|
||||
if 0;
|
||||
|
||||
my $VERSION = '2018-03-07 03:47'; # UTC
|
||||
# The definition above must lie within the first 8 lines in order
|
||||
# for the Emacs time-stamp write hook (at end) to update it.
|
||||
# If you change this file with Emacs, please let the write hook
|
||||
# do its job. Otherwise, update this string manually.
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Getopt::Long;
|
||||
|
||||
(my $ME = $0) =~ s|.*/||;
|
||||
|
||||
# use File::Coda; # https://meyering.net/code/Coda/
|
||||
END {
|
||||
defined fileno STDOUT or return;
|
||||
close STDOUT and return;
|
||||
warn "$ME: failed to close standard output: $!\n";
|
||||
$? ||= 1;
|
||||
}
|
||||
|
||||
sub usage ($)
|
||||
{
|
||||
my ($exit_code) = @_;
|
||||
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
||||
if ($exit_code != 0)
|
||||
{
|
||||
print $STREAM "Try '$ME --help' for more information.\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print $STREAM <<EOF;
|
||||
Usage: $ME [OPTIONS] FILE...
|
||||
|
||||
Detect any instance in FILE of a useless "if" test before a free call, e.g.,
|
||||
"if (p) free (p);". Any such test may be safely removed without affecting
|
||||
the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
|
||||
detect free-like functions named FOO and BAR.
|
||||
|
||||
OPTIONS:
|
||||
|
||||
--list print only the name of each matching FILE (\\0-terminated)
|
||||
--name=N add name N to the list of \'free\'-like functions to detect;
|
||||
may be repeated
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
||||
Exit status:
|
||||
|
||||
0 one or more matches
|
||||
1 no match
|
||||
2 an error
|
||||
|
||||
EXAMPLE:
|
||||
|
||||
For example, this command prints all removable "if" tests before "free"
|
||||
and "kfree" calls in the linux kernel sources:
|
||||
|
||||
git ls-files -z |xargs -0 $ME --name=kfree
|
||||
|
||||
EOF
|
||||
}
|
||||
exit $exit_code;
|
||||
}
|
||||
|
||||
sub is_NULL ($)
|
||||
{
|
||||
my ($expr) = @_;
|
||||
return ($expr eq 'NULL' || $expr eq '0');
|
||||
}
|
||||
|
||||
{
|
||||
sub EXIT_MATCH {0}
|
||||
sub EXIT_NO_MATCH {1}
|
||||
sub EXIT_ERROR {2}
|
||||
my $err = EXIT_NO_MATCH;
|
||||
|
||||
my $list;
|
||||
my @name = qw(free);
|
||||
GetOptions
|
||||
(
|
||||
help => sub { usage 0 },
|
||||
version => sub { print "$ME version $VERSION\n"; exit },
|
||||
list => \$list,
|
||||
'name=s@' => \@name,
|
||||
) or usage 1;
|
||||
|
||||
# Make sure we have the right number of non-option arguments.
|
||||
# Always tell the user why we fail.
|
||||
@ARGV < 1
|
||||
and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
|
||||
|
||||
my $or = join '|', @name;
|
||||
my $regexp = qr/(?:$or)/;
|
||||
|
||||
# Set the input record separator.
|
||||
# Note: this makes it impractical to print line numbers.
|
||||
$/ = '"';
|
||||
|
||||
my $found_match = 0;
|
||||
FILE:
|
||||
foreach my $file (@ARGV)
|
||||
{
|
||||
open FH, '<', $file
|
||||
or (warn "$ME: can't open '$file' for reading: $!\n"),
|
||||
$err = EXIT_ERROR, next;
|
||||
while (defined (my $line = <FH>))
|
||||
{
|
||||
# Skip non-matching lines early to save time
|
||||
$line =~ /\bif\b/
|
||||
or next;
|
||||
while ($line =~
|
||||
/\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\)
|
||||
# 1 2 3
|
||||
(?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;|
|
||||
\s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
|
||||
{
|
||||
my $all = $1;
|
||||
my ($lhs, $rhs) = ($2, $3);
|
||||
my ($free_opnd, $braced_free_opnd) = ($4, $5);
|
||||
my $non_NULL;
|
||||
if (!defined $rhs) { $non_NULL = $lhs }
|
||||
elsif (is_NULL $rhs) { $non_NULL = $lhs }
|
||||
elsif (is_NULL $lhs) { $non_NULL = $rhs }
|
||||
else { next }
|
||||
|
||||
# Compare the non-NULL part of the "if" expression and the
|
||||
# free'd expression, without regard to white space.
|
||||
$non_NULL =~ tr/ \t//d;
|
||||
my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd;
|
||||
$e2 =~ tr/ \t//d;
|
||||
if ($non_NULL eq $e2)
|
||||
{
|
||||
$found_match = 1;
|
||||
$list
|
||||
and (print "$file\0"), next FILE;
|
||||
print "$file: $all\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
continue
|
||||
{
|
||||
close FH;
|
||||
}
|
||||
|
||||
$found_match && $err == EXIT_NO_MATCH
|
||||
and $err = EXIT_MATCH;
|
||||
|
||||
exit $err;
|
||||
}
|
||||
|
||||
my $foo = <<'EOF';
|
||||
# The above is to *find* them.
|
||||
# This adjusts them, removing the unnecessary "if (p)" part.
|
||||
|
||||
# FIXME: do something like this as an option (doesn't do braces):
|
||||
free=xfree
|
||||
git grep -l -z "$free *(" \
|
||||
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||
| xargs -0 perl -0x3b -pi -e \
|
||||
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s'
|
||||
|
||||
# Use the following to remove redundant uses of kfree inside braces.
|
||||
# Note that -0777 puts perl in slurp-whole-file mode;
|
||||
# but we have plenty of memory, these days...
|
||||
free=kfree
|
||||
git grep -l -z "$free *(" \
|
||||
| xargs -0 useless-if-before-free -l --name="$free" \
|
||||
| xargs -0 perl -0777 -pi -e \
|
||||
's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms'
|
||||
|
||||
Be careful that the result of the above transformation is valid.
|
||||
If the matched string is followed by "else", then obviously, it won't be.
|
||||
|
||||
When modifying files, refuse to process anything other than a regular file.
|
||||
EOF
|
||||
|
||||
## Local Variables:
|
||||
## mode: perl
|
||||
## indent-tabs-mode: nil
|
||||
## eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
## time-stamp-line-limit: 50
|
||||
## time-stamp-start: "my $VERSION = '"
|
||||
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
||||
## time-stamp-time-zone: "UTC0"
|
||||
## time-stamp-end: "'; # UTC"
|
||||
## End:
|
@@ -1,113 +0,0 @@
|
||||
#!/bin/sh
|
||||
# List version-controlled file names.
|
||||
|
||||
# Print a version string.
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 2006-2019 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program 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 General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# List the specified version-controlled files.
|
||||
# With no argument, list them all. With a single DIRECTORY argument,
|
||||
# list the version-controlled files in that directory.
|
||||
|
||||
# If there's an argument, it must be a single, "."-relative directory name.
|
||||
# cvsu is part of the cvsutils package: http://www.red-bean.com/cvsutils/
|
||||
|
||||
postprocess=
|
||||
case $1 in
|
||||
--help) cat <<EOF
|
||||
Usage: $0 [-C SRCDIR] [DIR...]
|
||||
|
||||
Output a list of version-controlled files in DIR (default .), relative to
|
||||
SRCDIR (default .). SRCDIR must be the top directory of a checkout.
|
||||
|
||||
Options:
|
||||
--help print this help, then exit
|
||||
--version print version number, then exit
|
||||
-C SRCDIR change directory to SRCDIR before generating list
|
||||
|
||||
Report bugs and patches to <bug-gnulib@gnu.org>.
|
||||
EOF
|
||||
exit ;;
|
||||
|
||||
--version)
|
||||
year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
|
||||
cat <<EOF
|
||||
vc-list-files $scriptversion
|
||||
Copyright (C) $year Free Software Foundation, Inc,
|
||||
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
EOF
|
||||
exit ;;
|
||||
|
||||
-C)
|
||||
test "$2" = . || postprocess="| sed 's|^|$2/|'"
|
||||
cd "$2" || exit 1
|
||||
shift; shift ;;
|
||||
esac
|
||||
|
||||
test $# = 0 && set .
|
||||
|
||||
for dir
|
||||
do
|
||||
if test -d .git || test -f .git; then
|
||||
test "x$dir" = x. \
|
||||
&& dir= sed_esc= \
|
||||
|| { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
|
||||
# Ignore git symlinks - either they point into the tree, in which case
|
||||
# we don't need to visit the target twice, or they point somewhere
|
||||
# else (often into a submodule), in which case the content does not
|
||||
# belong to this package.
|
||||
eval exec git ls-tree -r 'HEAD:"$dir"' \
|
||||
\| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess
|
||||
elif test -d .hg; then
|
||||
eval exec hg locate '"$dir/*"' $postprocess
|
||||
elif test -d .bzr; then
|
||||
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||
eval exec bzr ls -R --versioned '"$dir"' $postprocess
|
||||
elif test -d CVS; then
|
||||
test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
|
||||
if test -x build-aux/cvsu; then
|
||||
eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||
elif (cvsu --help) >/dev/null 2>&1; then
|
||||
eval cvsu --find --types=AFGM '"$dir"' $postprocess
|
||||
else
|
||||
eval awk -F/ \''{ \
|
||||
if (!$1 && $3 !~ /^-/) { \
|
||||
f=FILENAME; \
|
||||
if (f ~ /CVS\/Entries$/) \
|
||||
f = substr(f, 1, length(f)-11); \
|
||||
print f $2; \
|
||||
}}'\'' \
|
||||
`find "$dir" -name Entries -print` /dev/null' $postprocess
|
||||
fi
|
||||
elif test -d .svn; then
|
||||
eval exec svn list -R '"$dir"' $postprocess
|
||||
else
|
||||
echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
273
ci/Makefile
273
ci/Makefile
@@ -1,273 +0,0 @@
|
||||
# -*- makefile -*-
|
||||
# vim: filetype=make
|
||||
|
||||
# The root directory of the libvirt.git checkout
|
||||
CI_GIT_ROOT = $(shell git rev-parse --show-toplevel)
|
||||
|
||||
# The root directory for all CI-related contents
|
||||
CI_ROOTDIR = $(CI_GIT_ROOT)/ci
|
||||
|
||||
# The directory holding content on the host that we will
|
||||
# expose to the container.
|
||||
CI_SCRATCHDIR = $(CI_ROOTDIR)/scratch
|
||||
|
||||
# The directory holding the clone of the git repo that
|
||||
# we will expose to the container
|
||||
CI_HOST_SRCDIR = $(CI_SCRATCHDIR)/src
|
||||
|
||||
# The directory holding the source inside the
|
||||
# container, i.e. where we want to expose
|
||||
# the $(CI_HOST_SRCDIR) directory from the host
|
||||
CI_CONT_SRCDIR = $(CI_USER_HOME)/libvirt
|
||||
|
||||
# Relative directory to perform the build in. This
|
||||
# defaults to using a separate build dir, but can be
|
||||
# set to empty string for an in-source tree build.
|
||||
CI_VPATH = build
|
||||
|
||||
# The directory holding the build output inside the
|
||||
# container.
|
||||
CI_CONT_BUILDDIR = $(CI_CONT_SRCDIR)/$(CI_VPATH)
|
||||
|
||||
# Can be overridden with mingw{32,64}-configure if desired
|
||||
CI_CONFIGURE = $(CI_CONT_SRCDIR)/configure
|
||||
|
||||
# Default to using all possible CPUs
|
||||
CI_SMP = $(shell getconf _NPROCESSORS_ONLN)
|
||||
|
||||
# Any extra arguments to pass to make
|
||||
CI_MAKE_ARGS =
|
||||
|
||||
# Any extra arguments to pass to configure
|
||||
CI_CONFIGURE_ARGS =
|
||||
|
||||
# Script containing environment preparation steps
|
||||
CI_PREPARE_SCRIPT = $(CI_ROOTDIR)/prepare.sh
|
||||
|
||||
# Script containing build instructions
|
||||
CI_BUILD_SCRIPT = $(CI_ROOTDIR)/build.sh
|
||||
|
||||
# Location of the container images we're going to pull
|
||||
# Can be useful to overridde to use a locally built
|
||||
# image instead
|
||||
CI_IMAGE_PREFIX = quay.io/libvirt/buildenv-libvirt-
|
||||
|
||||
# The default tag is ':latest' but if the container
|
||||
# repo above uses different conventions this can override it
|
||||
CI_IMAGE_TAG = :latest
|
||||
|
||||
# We delete the virtual root after completion, set
|
||||
# to 0 if you need to keep it around for debugging
|
||||
CI_CLEAN = 1
|
||||
|
||||
# We'll always freshly clone the virtual root each
|
||||
# time in case it was not cleaned up before. Set
|
||||
# to 1 if you want to try restarting a previously
|
||||
# preserved env
|
||||
CI_REUSE = 0
|
||||
|
||||
# We need the container process to run with current host IDs
|
||||
# so that it can access the passed in build directory
|
||||
CI_UID = $(shell id -u)
|
||||
CI_GID = $(shell id -g)
|
||||
|
||||
# We also need the user's login and home directory to prepare the
|
||||
# environment the way some programs expect it
|
||||
CI_USER_LOGIN = $(shell echo "$$USER")
|
||||
CI_USER_HOME = $(shell echo "$$HOME")
|
||||
|
||||
CI_ENGINE = auto
|
||||
# Container engine we are going to use, can be overridden per make
|
||||
# invocation, if it is not we try podman and then default to docker.
|
||||
ifeq ($(CI_ENGINE),auto)
|
||||
override CI_ENGINE = $(shell podman version >/dev/null 2>&1 && echo podman || echo docker)
|
||||
endif
|
||||
|
||||
# IDs you run as do not need to exist in
|
||||
# the container's /etc/passwd & /etc/group files, but
|
||||
# if they do not, then libvirt's 'make check' will fail
|
||||
# many tests.
|
||||
|
||||
# We do not directly mount /etc/{passwd,group} as Docker
|
||||
# is liable to mess with SELinux labelling which will
|
||||
# then prevent the host accessing them. And podman cannot
|
||||
# relabel the files due to it running rootless. So
|
||||
# copying them first is safer and less error-prone.
|
||||
CI_PWDB_MOUNTS = \
|
||||
--volume $(CI_SCRATCHDIR)/group:/etc/group:ro,z \
|
||||
--volume $(CI_SCRATCHDIR)/passwd:/etc/passwd:ro,z \
|
||||
$(NULL)
|
||||
|
||||
CI_HOME_MOUNTS = \
|
||||
--volume $(CI_SCRATCHDIR)/home:$(CI_USER_HOME):z \
|
||||
$(NULL)
|
||||
|
||||
CI_SCRIPT_MOUNTS = \
|
||||
--volume $(CI_SCRATCHDIR)/prepare:$(CI_USER_HOME)/prepare:z \
|
||||
--volume $(CI_SCRATCHDIR)/build:$(CI_USER_HOME)/build:z \
|
||||
$(NULL)
|
||||
|
||||
# Docker containers can have very large ulimits
|
||||
# for nofiles - as much as 1048576. This makes
|
||||
# libvirt very slow at exec'ing programs.
|
||||
CI_ULIMIT_FILES = 1024
|
||||
|
||||
ifeq ($(CI_ENGINE),podman)
|
||||
# Podman cannot reuse host namespace when running non-root
|
||||
# containers. Until support for --keep-uid is added we can
|
||||
# just create another mapping that will do that for us.
|
||||
# Beware, that in {uid,git}map=container_id:host_id:range, the
|
||||
# host_id does actually refer to the uid in the first mapping
|
||||
# where 0 (root) is mapped to the current user and rest is
|
||||
# offset.
|
||||
#
|
||||
# In order to set up this mapping, we need to keep all the
|
||||
# user IDs to prevent possible errors as some images might
|
||||
# expect UIDs up to 90000 (looking at you fedora), so we don't
|
||||
# want the overflowuid to be used for them. For mapping all
|
||||
# the other users properly, some math needs to be done.
|
||||
# Don't worry, it's just addition and subtraction.
|
||||
#
|
||||
# 65536 ought to be enough (tm), but for really rare cases the
|
||||
# maximums might need to be higher, but that only happens when
|
||||
# your /etc/sub{u,g}id allow users to have more IDs. Unless
|
||||
# --keep-uid is supported, let's do this in a way that should
|
||||
# work for everyone.
|
||||
CI_MAX_UID = $(shell sed -n "s/^$(CI_USER_LOGIN):[^:]\+://p" /etc/subuid)
|
||||
CI_MAX_GID = $(shell sed -n "s/^$(CI_USER_LOGIN):[^:]\+://p" /etc/subgid)
|
||||
ifeq ($(CI_MAX_UID),)
|
||||
CI_MAX_UID = 65536
|
||||
endif
|
||||
ifeq ($(CI_MAX_GID),)
|
||||
CI_MAX_GID = 65536
|
||||
endif
|
||||
CI_UID_OTHER = $(shell echo $$(($(CI_UID)+1)))
|
||||
CI_GID_OTHER = $(shell echo $$(($(CI_GID)+1)))
|
||||
CI_UID_OTHER_RANGE = $(shell echo $$(($(CI_MAX_UID)-$(CI_UID))))
|
||||
CI_GID_OTHER_RANGE = $(shell echo $$(($(CI_MAX_GID)-$(CI_GID))))
|
||||
|
||||
CI_PODMAN_ARGS = \
|
||||
--uidmap 0:1:$(CI_UID) \
|
||||
--uidmap $(CI_UID):0:1 \
|
||||
--uidmap $(CI_UID_OTHER):$(CI_UID_OTHER):$(CI_UID_OTHER_RANGE) \
|
||||
--gidmap 0:1:$(CI_GID) \
|
||||
--gidmap $(CI_GID):0:1 \
|
||||
--gidmap $(CI_GID_OTHER):$(CI_GID_OTHER):$(CI_GID_OTHER_RANGE) \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
# Args to use when cloning a git repo.
|
||||
# -c stop it complaining about checking out a random hash
|
||||
# -q stop it displaying progress info for local clone
|
||||
# --local ensure we don't actually copy files
|
||||
CI_GIT_ARGS = \
|
||||
-c advice.detachedHead=false \
|
||||
-q \
|
||||
--local \
|
||||
$(NULL)
|
||||
|
||||
# Args to use when running the container
|
||||
# --rm stop inactive containers getting left behind
|
||||
# --user we execute as the same user & group account
|
||||
# as dev so that file ownership matches host
|
||||
# instead of root:root
|
||||
# --volume to pass in the cloned git repo & config
|
||||
# --ulimit lower files limit for performance reasons
|
||||
# --interactive
|
||||
# --tty Ensure we have ability to Ctrl-C the build
|
||||
CI_ENGINE_ARGS = \
|
||||
--rm \
|
||||
--interactive \
|
||||
--tty \
|
||||
$(CI_PODMAN_ARGS) \
|
||||
$(CI_PWDB_MOUNTS) \
|
||||
$(CI_HOME_MOUNTS) \
|
||||
$(CI_SCRIPT_MOUNTS) \
|
||||
--volume $(CI_HOST_SRCDIR):$(CI_CONT_SRCDIR):z \
|
||||
--ulimit nofile=$(CI_ULIMIT_FILES):$(CI_ULIMIT_FILES) \
|
||||
--cap-add=SYS_PTRACE \
|
||||
$(NULL)
|
||||
|
||||
ci-check-engine:
|
||||
@echo -n "Checking if $(CI_ENGINE) is available..." && \
|
||||
$(CI_ENGINE) version 1>/dev/null && echo "yes"
|
||||
|
||||
ci-prepare-tree: ci-check-engine
|
||||
@test "$(CI_REUSE)" != "1" && rm -rf $(CI_SCRATCHDIR) || :
|
||||
@if ! test -d $(CI_SCRATCHDIR) ; then \
|
||||
mkdir -p $(CI_SCRATCHDIR); \
|
||||
cp /etc/passwd $(CI_SCRATCHDIR); \
|
||||
cp /etc/group $(CI_SCRATCHDIR); \
|
||||
mkdir -p $(CI_SCRATCHDIR)/home; \
|
||||
cp "$(CI_PREPARE_SCRIPT)" $(CI_SCRATCHDIR)/prepare; \
|
||||
cp "$(CI_BUILD_SCRIPT)" $(CI_SCRATCHDIR)/build; \
|
||||
chmod +x "$(CI_SCRATCHDIR)/prepare" "$(CI_SCRATCHDIR)/build"; \
|
||||
echo "Cloning $(CI_GIT_ROOT) to $(CI_HOST_SRCDIR)"; \
|
||||
git clone $(CI_GIT_ARGS) $(CI_GIT_ROOT) $(CI_HOST_SRCDIR) || exit 1; \
|
||||
for mod in $$(git submodule | awk '{ print $$2 }' | sed -E 's,^../,,g') ; \
|
||||
do \
|
||||
test -f $(CI_GIT_ROOT)/$$mod/.git || continue ; \
|
||||
echo "Cloning $(CI_GIT_ROOT)/$$mod to $(CI_HOST_SRCDIR)/$$mod"; \
|
||||
git clone $(CI_GIT_ARGS) $(CI_GIT_ROOT)/$$mod $(CI_HOST_SRCDIR)/$$mod || exit 1; \
|
||||
done ; \
|
||||
fi
|
||||
|
||||
ci-run-command@%: ci-prepare-tree
|
||||
$(CI_ENGINE) run $(CI_ENGINE_ARGS) $(CI_IMAGE_PREFIX)$*$(CI_IMAGE_TAG) \
|
||||
/bin/bash -c ' \
|
||||
$(CI_USER_HOME)/prepare || exit 1; \
|
||||
if test "$$PKG_CONFIG_LIBDIR"; then \
|
||||
pkgconfig_env="PKG_CONFIG_LIBDIR=$$PKG_CONFIG_LIBDIR"; \
|
||||
fi; \
|
||||
sudo \
|
||||
--login \
|
||||
--user="#$(CI_UID)" \
|
||||
--group="#$(CI_GID)" \
|
||||
CONFIGURE_OPTS="$$CONFIGURE_OPTS" \
|
||||
$$pkgconfig_env \
|
||||
CI_CONT_SRCDIR="$(CI_CONT_SRCDIR)" \
|
||||
CI_CONT_BUILDDIR="$(CI_CONT_BUILDDIR)" \
|
||||
CI_SMP="$(CI_SMP)" \
|
||||
CI_CONFIGURE="$(CI_CONFIGURE)" \
|
||||
CI_CONFIGURE_ARGS="$(CI_CONFIGURE_ARGS)" \
|
||||
CI_MAKE_ARGS="$(CI_MAKE_ARGS)" \
|
||||
$(CI_COMMAND) || exit 1'
|
||||
@test "$(CI_CLEAN)" = "1" && rm -rf $(CI_SCRATCHDIR) || :
|
||||
|
||||
ci-shell@%:
|
||||
$(MAKE) -C $(CI_ROOTDIR) ci-run-command@$* CI_COMMAND="/bin/bash"
|
||||
|
||||
ci-build@%:
|
||||
$(MAKE) -C $(CI_ROOTDIR) ci-run-command@$* CI_COMMAND="$(CI_USER_HOME)/build"
|
||||
|
||||
ci-check@%:
|
||||
$(MAKE) -C $(CI_ROOTDIR) ci-build@$* CI_MAKE_ARGS="check"
|
||||
|
||||
ci-list-images:
|
||||
@echo
|
||||
@echo "Available x86 container images:"
|
||||
@echo
|
||||
@sh list-images.sh "$(CI_ENGINE)" "$(CI_IMAGE_PREFIX)" | grep -v cross
|
||||
@echo
|
||||
@echo "Available cross-compiler container images:"
|
||||
@echo
|
||||
@sh list-images.sh "$(CI_ENGINE)" "$(CI_IMAGE_PREFIX)" | grep cross
|
||||
@echo
|
||||
|
||||
ci-help:
|
||||
@echo "Build libvirt inside containers used for CI"
|
||||
@echo
|
||||
@echo "Available targets:"
|
||||
@echo
|
||||
@echo " ci-build@\$$IMAGE - run a default 'make'"
|
||||
@echo " ci-check@\$$IMAGE - run a 'make check'"
|
||||
@echo " ci-shell@\$$IMAGE - run an interactive shell"
|
||||
@echo " ci-list-images - list available images"
|
||||
@echo " ci-help - show this help message"
|
||||
@echo
|
||||
@echo "Available make variables:"
|
||||
@echo
|
||||
@echo " CI_CLEAN=0 - do not delete '$(CI_SCRATCHDIR)' after completion"
|
||||
@echo " CI_REUSE=1 - re-use existing '$(CI_SCRATCHDIR)' content"
|
||||
@echo " CI_ENGINE=auto - container engine to use (podman, docker)"
|
||||
@echo
|
38
ci/build.sh
38
ci/build.sh
@@ -1,38 +0,0 @@
|
||||
# This script is used to build libvirt inside the container.
|
||||
#
|
||||
# You can customize it to your liking, or alternatively use a
|
||||
# completely different script by passing
|
||||
#
|
||||
# CI_BUILD_SCRIPT=/path/to/your/build/script
|
||||
#
|
||||
# to make.
|
||||
|
||||
mkdir -p "$CI_CONT_BUILDDIR" || exit 1
|
||||
cd "$CI_CONT_BUILDDIR"
|
||||
|
||||
export VIR_TEST_DEBUG=1
|
||||
NOCONFIGURE=1 "$CI_CONT_SRCDIR/autogen.sh" || exit 1
|
||||
|
||||
# $CONFIGURE_OPTS is a env that can optionally be set in the container,
|
||||
# populated at build time from the Dockerfile. A typical use case would
|
||||
# be to pass --host/--target args to trigger cross-compilation
|
||||
#
|
||||
# This can be augmented by make local args in $CI_CONFIGURE_ARGS
|
||||
"$CI_CONFIGURE" $CONFIGURE_OPTS $CI_CONFIGURE_ARGS
|
||||
if test $? != 0; then
|
||||
test -f config.log && cat config.log
|
||||
exit 1
|
||||
fi
|
||||
find -name test-suite.log -delete
|
||||
|
||||
make -j"$CI_SMP" $CI_MAKE_ARGS
|
||||
|
||||
if test $? != 0; then \
|
||||
LOGS=$(find -name test-suite.log)
|
||||
if test "$LOGS"; then
|
||||
echo "=== LOG FILE(S) START ==="
|
||||
cat $LOGS
|
||||
echo "=== LOG FILE(S) END ==="
|
||||
fi
|
||||
exit 1
|
||||
fi
|
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
engine="$1"
|
||||
prefix="$2"
|
||||
|
||||
do_podman() {
|
||||
# Podman freaks out if the search term ends with a dash, which ours
|
||||
# by default does, so let's strip it. The repository name is the
|
||||
# second field in the output, and it already starts with the registry
|
||||
podman search --limit 100 "${prefix%-}" | while read _ repo _; do
|
||||
echo "$repo"
|
||||
done
|
||||
}
|
||||
|
||||
do_docker() {
|
||||
# Docker doesn't include the registry name in the output, so we have
|
||||
# to add it. The repository name is the first field in the output
|
||||
registry="${prefix%%/*}"
|
||||
docker search --limit 100 "$prefix" | while read repo _; do
|
||||
echo "$registry/$repo"
|
||||
done
|
||||
}
|
||||
|
||||
"do_$engine" | grep "^$prefix" | sed "s,^$prefix,,g" | while read repo; do
|
||||
echo " $repo"
|
||||
done | sort -u
|
@@ -1,13 +0,0 @@
|
||||
# This script is used to prepare the environment that will be used
|
||||
# to build libvirt inside the container.
|
||||
#
|
||||
# You can customize it to your liking, or alternatively use a
|
||||
# completely different script by passing
|
||||
#
|
||||
# CI_PREPARE_SCRIPT=/path/to/your/prepare/script
|
||||
#
|
||||
# to make.
|
||||
#
|
||||
# Note that this script will have root privileges inside the
|
||||
# container, so it can be used for things like installing additional
|
||||
# packages.
|
@@ -16,43 +16,77 @@
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Since virt-login-shell will be setuid, we must do everything
|
||||
* we can to avoid linking to other libraries. Many of them do
|
||||
* unsafe things in functions marked __attribute__((constructor)).
|
||||
* The only way to avoid such deps is to re-compile the
|
||||
* functions with the code in question disabled, and for that we
|
||||
* must override the main config.h rules. Hence this file :-(
|
||||
*/
|
||||
|
||||
#ifdef LIBVIRT_SETUID_RPC_CLIENT
|
||||
# undef HAVE_LIBNL
|
||||
# undef HAVE_LIBNL3
|
||||
# undef HAVE_LIBSASL2
|
||||
# undef HAVE_SYS_ACL_H
|
||||
# undef WITH_CAPNG
|
||||
# undef WITH_CURL
|
||||
# undef WITH_DBUS
|
||||
# undef WITH_DEVMAPPER
|
||||
# undef WITH_DTRACE_PROBES
|
||||
# undef WITH_GNUTLS
|
||||
# undef WITH_LIBSSH
|
||||
# undef WITH_MACVTAP
|
||||
# undef WITH_NUMACTL
|
||||
# undef WITH_SASL
|
||||
# undef WITH_SSH2
|
||||
# undef WITH_SYSTEMD_DAEMON
|
||||
# undef WITH_VIRTUALPORT
|
||||
# undef WITH_YAJL
|
||||
# undef WITH_YAJL2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* With the NSS module it's the same story as virt-login-shell. See the
|
||||
* explanation above.
|
||||
*/
|
||||
#ifdef LIBVIRT_NSS
|
||||
# undef HAVE_LIBNL
|
||||
# undef HAVE_LIBNL3
|
||||
# undef HAVE_LIBSASL2
|
||||
# undef HAVE_SYS_ACL_H
|
||||
# undef WITH_CAPNG
|
||||
# undef WITH_CURL
|
||||
# undef WITH_DEVMAPPER
|
||||
# undef WITH_DTRACE_PROBES
|
||||
# undef WITH_GNUTLS
|
||||
# undef WITH_LIBSSH
|
||||
# undef WITH_MACVTAP
|
||||
# undef WITH_NUMACTL
|
||||
# undef WITH_SASL
|
||||
# undef WITH_SSH2
|
||||
# undef WITH_VIRTUALPORT
|
||||
# undef WITH_SECDRIVER_SELINUX
|
||||
# undef WITH_SECDRIVER_APPARMOR
|
||||
#endif /* LIBVIRT_NSS */
|
||||
|
||||
#ifndef __GNUC__
|
||||
# error "Libvirt requires GCC >= 4.8, or CLang"
|
||||
# error "Libvirt requires GCC >= 4.4, or CLang"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define __GNUC_PREREQ to a sane default if it isn't yet defined.
|
||||
* This is done here so that it's included as early as possible;
|
||||
* 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.
|
||||
* This doesn't happen on many non-glibc systems.
|
||||
* When __GNUC_PREREQ is not defined, gnulib defines it to 0, which breaks things.
|
||||
*/
|
||||
#ifndef __GNUC_PREREQ
|
||||
# define __GNUC_PREREQ(maj, min) \
|
||||
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||
#endif
|
||||
|
||||
#if defined(__clang_major__) && defined(__clang_minor__)
|
||||
# ifdef __apple_build_version__
|
||||
# if __clang_major__ < 5 || (__clang_major__ == 5 && __clang_minor__ < 1)
|
||||
# error You need at least XCode Clang v5.1 to compile QEMU
|
||||
# endif
|
||||
# else
|
||||
# if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 4)
|
||||
# error You need at least Clang v3.4 to compile QEMU
|
||||
# endif
|
||||
# endif
|
||||
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
|
||||
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
|
||||
# error You need at least GCC v4.8 to compile QEMU
|
||||
# endif
|
||||
#else
|
||||
# error You either need at least GCC 4.8 or Clang 3.4 or XCode Clang 5.1 to compile libvirt
|
||||
#if !(__GNUC_PREREQ(4, 4) || defined(__clang__))
|
||||
# error "Libvirt requires GCC >= 4.4, or CLang"
|
||||
#endif
|
||||
|
||||
/* Ask for warnings for anything that was marked deprecated in
|
||||
* the defined version, or before. It is a candidate for rewrite.
|
||||
*/
|
||||
#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_48
|
||||
|
||||
/* Ask for warnings if code tries to use function that did not
|
||||
* exist in the defined version. These risk breaking builds
|
||||
*/
|
||||
#define GLIB_VERSION_MAX_ALLOWED GLIB_VERSION_2_48
|
||||
|
201
configure.ac
201
configure.ac
@@ -16,32 +16,25 @@ dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
|
||||
AC_INIT([libvirt], [6.1.0], [libvir-list@redhat.com], [], [https://libvirt.org])
|
||||
|
||||
if test $srcdir = "."
|
||||
then
|
||||
AC_MSG_ERROR([Build directory must be different from source directory])
|
||||
fi
|
||||
|
||||
AC_INIT([libvirt], [5.2.0], [libvir-list@redhat.com], [], [https://libvirt.org])
|
||||
AC_CONFIG_SRCDIR([src/libvirt.c])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AH_BOTTOM([#include <config-post.h>])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
dnl Make automake keep quiet about wildcards & other GNUmake-isms
|
||||
AM_INIT_AUTOMAKE([
|
||||
foreign
|
||||
-Wno-portability
|
||||
tar-pax
|
||||
no-dist-gzip
|
||||
dist-xz
|
||||
subdir-objects
|
||||
])
|
||||
dnl Make automake keep quiet about wildcards & other GNUmake-isms; also keep
|
||||
dnl quiet about the fact that we intentionally cater to automake 1.9
|
||||
AM_INIT_AUTOMAKE([-Wno-portability -Wno-obsolete tar-pax no-dist-gzip dist-xz subdir-objects])
|
||||
dnl older automake's default of ARFLAGS=cru is noisy on newer binutils;
|
||||
dnl we don't really need the 'u' even in older toolchains. Then there is
|
||||
dnl older libtool, which spelled it AR_FLAGS
|
||||
m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"])
|
||||
|
||||
# Maintainer note - comment this line out if you plan to rerun
|
||||
# GNULIB_POSIXCHECK testing to see if libvirt should be using more modules.
|
||||
# Leave it uncommented for normal releases, for faster ./configure.
|
||||
gl_ASSERT_NO_GNULIB_POSIXCHECK
|
||||
|
||||
# Default to using the silent-rules feature when possible. Formatting
|
||||
# chosen to bypass 'grep' checks that cause older automake to warn.
|
||||
# Users (include rpm) can still change the default at configure time.
|
||||
@@ -50,8 +43,6 @@ m4_ifndef([AM_SILENT_RULES],
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
AC_USE_SYSTEM_EXTENSIONS
|
||||
|
||||
# First extract pieces from the version number string
|
||||
LIBVIRT_MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
|
||||
LIBVIRT_MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
|
||||
@@ -126,29 +117,14 @@ AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_CPP
|
||||
|
||||
dnl autoconf 2.70 adds a --runstatedir option so that downstreams
|
||||
dnl can point to /run instead of the historic /var/run, but
|
||||
dnl autoconf hasn't had a release since 2012.
|
||||
if test "x$runstatedir" = x; then
|
||||
AC_SUBST([runstatedir], ['${localstatedir}/run'])
|
||||
dnl Setting AB_VERSION makes the 'autobuild' lines of configure output
|
||||
dnl slightly more useful
|
||||
if test -d $srcdir/.git && git --version >/dev/null 2>&1 ; then
|
||||
AB_VERSION=`cd $srcdir && git describe --match 'v[[0-9]]*' 2>/dev/null`
|
||||
fi
|
||||
|
||||
dnl we introduce --with-runstatedir and then overwrite the
|
||||
dnl value of $runstatedir so configmake.h is more useful
|
||||
AC_ARG_WITH(
|
||||
[runstatedir],
|
||||
[AS_HELP_STRING(
|
||||
[--with-runstatedir],
|
||||
[State directory for temporary sockets, pid files, etc])])
|
||||
|
||||
if test -n "$with_runstatedir"
|
||||
then
|
||||
runstatedir=$with_runstatedir
|
||||
fi
|
||||
|
||||
|
||||
dnl get 64-int interfaces on 32-bit platforms
|
||||
AC_SYS_LARGEFILE
|
||||
gl_EARLY
|
||||
gl_INIT
|
||||
|
||||
AC_TYPE_UID_T
|
||||
|
||||
@@ -178,6 +154,8 @@ case "$host" in
|
||||
# mingw's ld has the --version-script parameter, but it requires a .def file
|
||||
# instead to work properly, therefore clear --version-script here and use
|
||||
# -Wl, to pass the .def file to the linker
|
||||
# cygwin's ld has the --version-script parameter too, but for some reason
|
||||
# it's working there as expected
|
||||
VERSION_SCRIPT_FLAGS="-Wl,"
|
||||
;;
|
||||
* )
|
||||
@@ -196,15 +174,16 @@ want_ifconfig=no
|
||||
dnl Make some notes about which OS we're compiling for, as the lxc and qemu
|
||||
dnl drivers require linux headers, and storage_mpath, dtrace, and nwfilter
|
||||
dnl are also linux specific. The "network" and storage_fs drivers are known
|
||||
dnl to not work on macOS presently, so we also make a note if compiling
|
||||
dnl to not work on MacOS X presently, so we also make a note if compiling
|
||||
dnl for that
|
||||
|
||||
with_linux=no with_macos=no with_freebsd=no with_win=no
|
||||
with_linux=no with_osx=no with_freebsd=no with_win=no with_cygwin=no
|
||||
case $host in
|
||||
*-*-linux*) with_linux=yes ;;
|
||||
*-*-darwin*) with_macos=yes ;;
|
||||
*-*-darwin*) with_osx=yes ;;
|
||||
*-*-freebsd*) with_freebsd=yes ;;
|
||||
*-*-mingw* | *-*-msvc* ) with_win=yes ;;
|
||||
*-*-cygwin*) with_cygwin=yes ;;
|
||||
esac
|
||||
|
||||
if test $with_linux = no; then
|
||||
@@ -221,18 +200,16 @@ if test $with_freebsd = yes; then
|
||||
with_firewalld=no
|
||||
fi
|
||||
|
||||
if test $with_cygwin = yes; then
|
||||
with_vbox=no
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL([WITH_LINUX], [test "$with_linux" = "yes"])
|
||||
AM_CONDITIONAL([WITH_FREEBSD], [test "$with_freebsd" = "yes"])
|
||||
AM_CONDITIONAL([WITH_MACOS], [test "$with_macos" = "yes"])
|
||||
|
||||
# We don't support the daemon yet
|
||||
if test "$with_win" = "yes" ; then
|
||||
# We don't support the daemon yet
|
||||
with_libvirtd=no
|
||||
|
||||
# For AI_ADDRCONFIG
|
||||
AC_DEFINE([_WIN32_WINNT], [0x0600], [Win Vista / Server 2008])
|
||||
AC_DEFINE([WINVER], [0x0600], [Win Vista / Server 2008])
|
||||
fi
|
||||
|
||||
# The daemon requires remote support. Likewise, if we are not using
|
||||
@@ -262,6 +239,7 @@ LIBVIRT_LINKER_NO_UNDEFINED
|
||||
LIBVIRT_ARG_APPARMOR
|
||||
LIBVIRT_ARG_ATTR
|
||||
LIBVIRT_ARG_AUDIT
|
||||
LIBVIRT_ARG_AVAHI
|
||||
LIBVIRT_ARG_BASH_COMPLETION
|
||||
LIBVIRT_ARG_BLKID
|
||||
LIBVIRT_ARG_CAPNG
|
||||
@@ -297,8 +275,10 @@ LIBVIRT_ARG_YAJL
|
||||
|
||||
LIBVIRT_CHECK_ACL
|
||||
LIBVIRT_CHECK_APPARMOR
|
||||
LIBVIRT_CHECK_ATOMIC
|
||||
LIBVIRT_CHECK_ATTR
|
||||
LIBVIRT_CHECK_AUDIT
|
||||
LIBVIRT_CHECK_AVAHI
|
||||
LIBVIRT_CHECK_BASH_COMPLETION
|
||||
LIBVIRT_CHECK_BLKID
|
||||
LIBVIRT_CHECK_CAPNG
|
||||
@@ -309,7 +289,6 @@ LIBVIRT_CHECK_DLOPEN
|
||||
LIBVIRT_CHECK_FIREWALLD
|
||||
LIBVIRT_CHECK_FIREWALLD_ZONE
|
||||
LIBVIRT_CHECK_FUSE
|
||||
LIBVIRT_CHECK_GLIB
|
||||
LIBVIRT_CHECK_GLUSTER
|
||||
LIBVIRT_CHECK_GNUTLS
|
||||
LIBVIRT_CHECK_HAL
|
||||
@@ -345,8 +324,8 @@ AC_CHECK_SIZEOF([long])
|
||||
dnl Availability of various common functions (non-fatal if missing),
|
||||
dnl and various less common threadsafe functions
|
||||
AC_CHECK_FUNCS_ONCE([\
|
||||
cfmakeraw \
|
||||
fallocate \
|
||||
getegid \
|
||||
geteuid \
|
||||
getgid \
|
||||
getifaddrs \
|
||||
@@ -354,13 +333,11 @@ AC_CHECK_FUNCS_ONCE([\
|
||||
getpwuid_r \
|
||||
getrlimit \
|
||||
getuid \
|
||||
getutxid \
|
||||
if_indextoname \
|
||||
mmap \
|
||||
newlocale \
|
||||
posix_fallocate \
|
||||
posix_memalign \
|
||||
pipe2 \
|
||||
prlimit \
|
||||
sched_getaffinity \
|
||||
sched_setscheduler \
|
||||
@@ -376,22 +353,18 @@ dnl Availability of various common headers (non-fatal if missing).
|
||||
AC_CHECK_HEADERS([\
|
||||
ifaddrs.h \
|
||||
libtasn1.h \
|
||||
util.h \
|
||||
libutil.h \
|
||||
linux/magic.h \
|
||||
mntent.h \
|
||||
net/ethernet.h \
|
||||
net/if.h \
|
||||
pty.h \
|
||||
netinet/tcp.h \
|
||||
pwd.h \
|
||||
stdarg.h \
|
||||
syslog.h \
|
||||
sys/ioctl.h \
|
||||
sys/mount.h \
|
||||
sys/syscall.h \
|
||||
sys/sysctl.h \
|
||||
sys/ucred.h \
|
||||
xlocale.h \
|
||||
sys/un.h \
|
||||
])
|
||||
dnl Check whether endian provides handy macros.
|
||||
AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]])
|
||||
@@ -427,7 +400,6 @@ dnl header could be found.
|
||||
AM_CONDITIONAL([HAVE_LIBTASN1], [test "x$ac_cv_header_libtasn1_h" = "xyes"])
|
||||
|
||||
AC_CHECK_LIB([intl],[gettext],[])
|
||||
AC_CHECK_LIB([util],[openpty],[])
|
||||
|
||||
|
||||
dnl
|
||||
@@ -436,6 +408,19 @@ dnl
|
||||
|
||||
LIBVIRT_CHECK_EXTERNAL_PROGRAMS
|
||||
|
||||
|
||||
dnl Specific dir for HTML output ?
|
||||
LIBVIRT_ARG_WITH([HTML_DIR], [path to base html directory],
|
||||
['$(datadir)/doc'])
|
||||
LIBVIRT_ARG_WITH([HTML_SUBDIR], [directory used under html-dir],
|
||||
['$(PACKAGE)-$(VERSION)/html'])
|
||||
if test "x$with_html_subdir" != "x" ; then
|
||||
HTML_DIR="$with_html_dir/$with_html_subdir"
|
||||
else
|
||||
HTML_DIR="$with_html_dir"
|
||||
fi
|
||||
AC_SUBST([HTML_DIR])
|
||||
|
||||
dnl if --prefix is /usr, don't use /usr/var for localstatedir
|
||||
dnl or /usr/etc for sysconfdir
|
||||
dnl as this makes a lot of things break in testing situations
|
||||
@@ -454,6 +439,8 @@ dnl
|
||||
LIBVIRT_DRIVER_ARG_QEMU
|
||||
LIBVIRT_DRIVER_ARG_OPENVZ
|
||||
LIBVIRT_DRIVER_ARG_VMWARE
|
||||
LIBVIRT_DRIVER_ARG_PHYP
|
||||
LIBVIRT_DRIVER_ARG_XENAPI
|
||||
LIBVIRT_DRIVER_ARG_LIBXL
|
||||
LIBVIRT_DRIVER_ARG_VBOX
|
||||
LIBVIRT_DRIVER_ARG_LXC
|
||||
@@ -470,6 +457,8 @@ LIBVIRT_DRIVER_ARG_INTERFACE
|
||||
LIBVIRT_DRIVER_CHECK_QEMU
|
||||
LIBVIRT_DRIVER_CHECK_OPENVZ
|
||||
LIBVIRT_DRIVER_CHECK_VMWARE
|
||||
LIBVIRT_DRIVER_CHECK_PHYP
|
||||
LIBVIRT_DRIVER_CHECK_XENAPI
|
||||
LIBVIRT_DRIVER_CHECK_LIBXL
|
||||
LIBVIRT_DRIVER_CHECK_VBOX
|
||||
LIBVIRT_DRIVER_CHECK_LXC
|
||||
@@ -483,6 +472,8 @@ LIBVIRT_DRIVER_CHECK_LIBVIRTD
|
||||
LIBVIRT_DRIVER_CHECK_NETWORK
|
||||
LIBVIRT_DRIVER_CHECK_INTERFACE
|
||||
|
||||
AM_CONDITIONAL([WITH_XENCONFIG], [test "$with_libxl" = "yes"])
|
||||
|
||||
|
||||
dnl
|
||||
dnl in case someone want to build static binaries
|
||||
@@ -530,6 +521,9 @@ dnl
|
||||
AC_CHECK_HEADERS([linux/kvm.h])
|
||||
|
||||
|
||||
AM_CONDITIONAL([WITH_SETUID_RPC_CLIENT], [test "$with_lxc$with_login_shell" != "nono"])
|
||||
|
||||
|
||||
dnl
|
||||
dnl check for kernel headers required by src/bridge.c
|
||||
dnl
|
||||
@@ -627,9 +621,9 @@ if test "$with_libvirtd" = "no"; then
|
||||
with_storage_vstorage=no
|
||||
fi
|
||||
|
||||
dnl storage-fs does not work on macOS
|
||||
dnl storage-fs does not work on MacOS X
|
||||
|
||||
if test "$with_macos" = "yes"; then
|
||||
if test "$with_osx" = "yes"; then
|
||||
with_storage_fs=no
|
||||
fi
|
||||
|
||||
@@ -697,23 +691,10 @@ if test "$with_linux" = "yes"; then
|
||||
fi
|
||||
|
||||
dnl Allow perl/python overrides
|
||||
AC_PATH_PROGS([PYTHON], [python3])
|
||||
AC_PATH_PROGS([PYTHON], [python3 python2 python])
|
||||
if test -z "$PYTHON"; then
|
||||
AC_MSG_ERROR(['python3' binary is required to build libvirt])
|
||||
AC_MSG_ERROR(['python3', 'python2' or 'python' binary is required to build libvirt])
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED([PYTHON], "$PYTHON", [path to python binary])
|
||||
AC_PATH_PROG([FLAKE8], [flake8])
|
||||
if test -z "$FLAKE8"; then
|
||||
AC_MSG_WARN(['flake8' binary is required to check python code style])
|
||||
fi
|
||||
|
||||
dnl Python3 < 3.7 treats the C locale as 7-bit only.
|
||||
dnl We must force env vars so it treats it as UTF-8
|
||||
dnl regardless of the user's locale.
|
||||
RUNUTF8="LC_ALL= LANG=C LC_CTYPE=en_US.UTF-8"
|
||||
AC_SUBST(RUNUTF8)
|
||||
|
||||
|
||||
AC_PATH_PROG([PERL], [perl])
|
||||
if test -z "$PERL"; then
|
||||
AC_MSG_ERROR(['perl' binary is required to build libvirt])
|
||||
@@ -738,7 +719,7 @@ AM_CONDITIONAL([WITH_TESTS], [test "$with_test_suite" = "yes"])
|
||||
|
||||
LIBVIRT_ARG_ENABLE([EXPENSIVE_TESTS],
|
||||
[set the default for enabling expensive tests ]
|
||||
[(long timeouts), use VIR_TEST_EXPENSIVE to ]
|
||||
[(gnulib and long timeouts), use VIR_TEST_EXPENSIVE to ]
|
||||
[override during make],
|
||||
[check])
|
||||
case "$enable_expensive_tests" in
|
||||
@@ -757,25 +738,37 @@ fi
|
||||
AC_SUBST([VIR_TEST_EXPENSIVE_DEFAULT])
|
||||
AM_CONDITIONAL([WITH_EXPENSIVE_TESTS], [test $VIR_TEST_EXPENSIVE_DEFAULT = 1])
|
||||
|
||||
LIBVIRT_ARG_ENABLE([TEST_COVERAGE], [turn on code coverage instrumentation], [no])
|
||||
case "$enable_test_coverage" in
|
||||
LIBVIRT_ARG_ENABLE([TEST_OOM], [memory allocation failure checking], [no])
|
||||
case "$enable_test_oom" in
|
||||
yes|no) ;;
|
||||
*) AC_MSG_ERROR([bad value ${enable_test_coverga} for test-coverage option]) ;;
|
||||
*) AC_MSG_ERROR([bad value ${enable_test_oom} for test-oom option]) ;;
|
||||
esac
|
||||
|
||||
if test "$enable_test_coverage" = yes; then
|
||||
save_WARN_CFLAGS=$WARN_CFLAGS
|
||||
WARN_CFLAGS=
|
||||
gl_WARN_ADD([-fprofile-arcs])
|
||||
gl_WARN_ADD([-ftest-coverage])
|
||||
COVERAGE_FLAGS=$WARN_CFLAGS
|
||||
AC_SUBST([COVERAGE_CFLAGS], [$COVERAGE_FLAGS])
|
||||
AC_SUBST([COVERAGE_LDFLAGS], [$COVERAGE_FLAGS])
|
||||
WARN_CFLAGS=$save_WARN_CFLAGS
|
||||
if test "$enable_test_oom" = yes; then
|
||||
have_trace=yes
|
||||
AC_CHECK_HEADER([execinfo.h],[],[have_trace=no])
|
||||
AC_CHECK_FUNC([backtrace],[],[have_trace=no])
|
||||
if test "$have_trace" = "yes"; then
|
||||
AC_DEFINE([TEST_OOM_TRACE], 1, [Whether backtrace() is available])
|
||||
fi
|
||||
AC_DEFINE([TEST_OOM], 1, [Whether malloc OOM checking is enabled])
|
||||
fi
|
||||
|
||||
dnl MinGW checks
|
||||
LIBVIRT_ARG_ENABLE([TEST_LOCKING], [thread locking tests using CIL], [no])
|
||||
case "$enable_test_locking" in
|
||||
yes|no) ;;
|
||||
*) AC_MSG_ERROR([bad value ${enable_test_locking} for test-locking option]) ;;
|
||||
esac
|
||||
|
||||
if test "$enable_test_locking" = "yes"; then
|
||||
LOCK_CHECKING_CFLAGS="-save-temps"
|
||||
AC_SUBST([LOCK_CHECKING_CFLAGS])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_CIL],[test "$enable_test_locking" = "yes"])
|
||||
|
||||
dnl Cygwin, MinGW and MSVC checks
|
||||
LIBVIRT_WIN_CHECK_COMMON
|
||||
LIBVIRT_WIN_CHECK_CYGWIN
|
||||
LIBVIRT_WIN_CHECK_MINGW
|
||||
LIBVIRT_WIN_CHECK_SYMBOLS
|
||||
LIBVIRT_WIN_CHECK_WINDRES
|
||||
@@ -877,12 +870,6 @@ AC_CHECK_DECLS([clock_serv_t, host_get_clock_service, clock_get_time],
|
||||
#include <mach/mach.h>
|
||||
])
|
||||
|
||||
# Check if we have new enough kernel to support BPF devices for cgroups v2
|
||||
if test "$with_linux" = "yes"; then
|
||||
AC_CHECK_DECLS([BPF_PROG_QUERY, BPF_CGROUP_DEVICE],
|
||||
[], [], [#include <linux/bpf.h>])
|
||||
fi
|
||||
|
||||
# Check if we need to look for ifconfig
|
||||
if test "$want_ifconfig" = "yes"; then
|
||||
AC_PATH_PROG([IFCONFIG_PATH], [ifconfig])
|
||||
@@ -907,16 +894,17 @@ test "x$lv_cv_static_analysis" = xyes && t=1
|
||||
AC_DEFINE_UNQUOTED([STATIC_ANALYSIS], [$t],
|
||||
[Define to 1 when performing static analysis.])
|
||||
|
||||
GNUmakefile=GNUmakefile
|
||||
m4_if(m4_version_compare([2.61a.100],
|
||||
m4_defn([m4_PACKAGE_VERSION])), [1], [],
|
||||
[AC_CONFIG_LINKS([$GNUmakefile:$GNUmakefile], [],
|
||||
[GNUmakefile=$GNUmakefile])])
|
||||
# Some GNULIB base64 symbols clash with a kerberos library
|
||||
AC_DEFINE_UNQUOTED([isbase64],[libvirt_gl_isbase64],[Hack to avoid symbol clash])
|
||||
AC_DEFINE_UNQUOTED([base64_encode],[libvirt_gl_base64_encode],[Hack to avoid symbol clash])
|
||||
AC_DEFINE_UNQUOTED([base64_encode_alloc],[libvirt_gl_base64_encode_alloc],[Hack to avoid symbol clash])
|
||||
|
||||
AC_CONFIG_FILES([run],
|
||||
[chmod +x,-w run])
|
||||
AC_CONFIG_FILES([\
|
||||
Makefile src/Makefile include/libvirt/Makefile docs/Makefile \
|
||||
gnulib/lib/Makefile \
|
||||
gnulib/tests/Makefile \
|
||||
.color_coded \
|
||||
.ycm_extra_conf.py \
|
||||
libvirt.pc \
|
||||
@@ -944,8 +932,10 @@ LIBVIRT_DRIVER_RESULT_QEMU
|
||||
LIBVIRT_DRIVER_RESULT_OPENVZ
|
||||
LIBVIRT_DRIVER_RESULT_VMWARE
|
||||
LIBVIRT_DRIVER_RESULT_VBOX
|
||||
LIBVIRT_DRIVER_RESULT_XENAPI
|
||||
LIBVIRT_DRIVER_RESULT_LIBXL
|
||||
LIBVIRT_DRIVER_RESULT_LXC
|
||||
LIBVIRT_DRIVER_RESULT_PHYP
|
||||
LIBVIRT_DRIVER_RESULT_ESX
|
||||
LIBVIRT_DRIVER_RESULT_HYPERV
|
||||
LIBVIRT_DRIVER_RESULT_VZ
|
||||
@@ -987,6 +977,7 @@ LIBVIRT_RESULT_ACL
|
||||
LIBVIRT_RESULT_APPARMOR
|
||||
LIBVIRT_RESULT_ATTR
|
||||
LIBVIRT_RESULT_AUDIT
|
||||
LIBVIRT_RESULT_AVAHI
|
||||
LIBVIRT_RESULT_BASH_COMPLETION
|
||||
LIBVIRT_RESULT_BLKID
|
||||
LIBVIRT_RESULT_CAPNG
|
||||
@@ -996,7 +987,6 @@ LIBVIRT_RESULT_DLOPEN
|
||||
LIBVIRT_RESULT_FIREWALLD
|
||||
LIBVIRT_RESULT_FIREWALLD_ZONE
|
||||
LIBVIRT_RESULT_FUSE
|
||||
LIBVIRT_RESULT_GLIB
|
||||
LIBVIRT_RESULT_GLUSTER
|
||||
LIBVIRT_RESULT_GNUTLS
|
||||
LIBVIRT_RESULT_HAL
|
||||
@@ -1024,6 +1014,7 @@ LIBVIRT_RESULT_SSH2
|
||||
LIBVIRT_RESULT_UDEV
|
||||
LIBVIRT_RESULT_VIRTUALPORT
|
||||
LIBVIRT_RESULT_XDR
|
||||
LIBVIRT_RESULT_XENAPI
|
||||
LIBVIRT_RESULT_YAJL
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Windows])
|
||||
@@ -1033,13 +1024,13 @@ LIBVIRT_WIN_RESULT_WINDRES
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Test suite])
|
||||
AC_MSG_NOTICE([])
|
||||
LIBVIRT_RESULT([Coverage], [$enable_test_coverage])
|
||||
AC_MSG_NOTICE([ Alloc OOM: $enable_test_oom])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Miscellaneous])
|
||||
AC_MSG_NOTICE([])
|
||||
LIBVIRT_RESULT_DEBUG
|
||||
LIBVIRT_RESULT([Use -Werror], [$enable_werror])
|
||||
LIBVIRT_RESULT([Warning Flags], [$WARN_CFLAGS])
|
||||
AC_MSG_NOTICE([ Use -Werror: $enable_werror])
|
||||
AC_MSG_NOTICE([ Warning Flags: $WARN_CFLAGS])
|
||||
LIBVIRT_RESULT_DTRACE
|
||||
LIBVIRT_RESULT_NUMAD
|
||||
LIBVIRT_RESULT_INIT_SCRIPT
|
||||
|
502
docs/Makefile.am
502
docs/Makefile.am
@@ -16,84 +16,26 @@
|
||||
## License along with this library. If not, see
|
||||
## <http://www.gnu.org/licenses/>.
|
||||
|
||||
HTML_DIR = $(docdir)/html
|
||||
|
||||
modules = \
|
||||
libvirt-common \
|
||||
libvirt-domain \
|
||||
libvirt-domain-checkpoint \
|
||||
libvirt-domain-snapshot \
|
||||
libvirt-event \
|
||||
libvirt-host \
|
||||
libvirt-interface \
|
||||
libvirt-network \
|
||||
libvirt-nodedev \
|
||||
libvirt-nwfilter \
|
||||
libvirt-secret \
|
||||
libvirt-storage \
|
||||
libvirt-stream \
|
||||
virterror \
|
||||
$(NULL)
|
||||
|
||||
modules_admin = libvirt-admin
|
||||
modules_qemu = libvirt-qemu
|
||||
modules_lxc = libvirt-lxc
|
||||
|
||||
all: vpathhack
|
||||
|
||||
# This hack enables us to view the web pages
|
||||
# from within the uninstalled build tree
|
||||
vpathhack:
|
||||
@for dir in fonts js logos; \
|
||||
do \
|
||||
test -e $$dir || ln -s $(srcdir)/$$dir $$dir ; \
|
||||
done
|
||||
@for file in $(css); \
|
||||
do \
|
||||
test -e $$file || ln -s $(srcdir)/$$file $$file ; \
|
||||
done
|
||||
|
||||
clean-local:
|
||||
for dir in fonts js logos; \
|
||||
do \
|
||||
rm -f $$dir ; \
|
||||
done
|
||||
for file in $(css); \
|
||||
do \
|
||||
rm -f $$file ; \
|
||||
done
|
||||
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
|
||||
|
||||
apihtml = \
|
||||
html/index.html \
|
||||
$(apihtml_generated)
|
||||
|
||||
apihtml_generated = \
|
||||
$(addprefix html/libvirt-,$(addsuffix .html,$(modules))) \
|
||||
$(NULL)
|
||||
|
||||
apiadminhtml = \
|
||||
html/index-admin.html \
|
||||
$(apiadminhtml_generated)
|
||||
|
||||
apiadminhtml_generated = \
|
||||
$(addprefix html/libvirt-,$(addsuffix .html,$(modules_admin))) \
|
||||
$(NULL)
|
||||
|
||||
apiqemuhtml = \
|
||||
html/index-qemu.html \
|
||||
$(apiqemuhtml_generated)
|
||||
|
||||
apiqemuhtml_generated = \
|
||||
$(addprefix html/libvirt-,$(addsuffix .html,$(modules_qemu))) \
|
||||
$(NULL)
|
||||
|
||||
apilxchtml = \
|
||||
html/index-lxc.html \
|
||||
$(apilxchtml_generated)
|
||||
|
||||
apilxchtml_generated = \
|
||||
$(addprefix html/libvirt-,$(addsuffix .html,$(modules_lxc))) \
|
||||
$(NULL)
|
||||
html/libvirt-libvirt-common.html \
|
||||
html/libvirt-libvirt-domain.html \
|
||||
html/libvirt-libvirt-domain-snapshot.html \
|
||||
html/libvirt-libvirt-event.html \
|
||||
html/libvirt-libvirt-host.html \
|
||||
html/libvirt-libvirt-interface.html \
|
||||
html/libvirt-libvirt-network.html \
|
||||
html/libvirt-libvirt-nodedev.html \
|
||||
html/libvirt-libvirt-nwfilter.html \
|
||||
html/libvirt-libvirt-secret.html \
|
||||
html/libvirt-libvirt-storage.html \
|
||||
html/libvirt-libvirt-stream.html \
|
||||
html/libvirt-virterror.html
|
||||
|
||||
apipng = \
|
||||
html/left.png \
|
||||
@@ -101,8 +43,11 @@ apipng = \
|
||||
html/home.png \
|
||||
html/right.png
|
||||
|
||||
apirefdir = $(HTML_DIR)/html
|
||||
apiref_DATA = $(apihtml) $(apiadminhtml) $(apiqemuhtml) $(apilxchtml) $(apipng)
|
||||
devhelphtml = \
|
||||
devhelp/libvirt.devhelp \
|
||||
devhelp/index.html \
|
||||
devhelp/general.html \
|
||||
devhelp/libvirt-virterror.html
|
||||
|
||||
css = \
|
||||
generic.css \
|
||||
@@ -110,13 +55,6 @@ css = \
|
||||
mobile.css \
|
||||
main.css
|
||||
|
||||
javascript = \
|
||||
js/main.js \
|
||||
$(NULL)
|
||||
|
||||
javascriptdir = $(HTML_DIR)/js
|
||||
javascript_DATA = $(javascript)
|
||||
|
||||
fonts = \
|
||||
fonts/LICENSE.md \
|
||||
fonts/stylesheet.css \
|
||||
@@ -131,8 +69,15 @@ fonts = \
|
||||
fonts/overpass-mono-semibold.woff \
|
||||
fonts/overpass-regular.woff
|
||||
|
||||
fontsdir = $(HTML_DIR)/fonts
|
||||
fonts_DATA = $(fonts)
|
||||
devhelppng = \
|
||||
devhelp/home.png \
|
||||
devhelp/left.png \
|
||||
devhelp/right.png \
|
||||
devhelp/up.png
|
||||
|
||||
devhelpcss = devhelp/style.css
|
||||
|
||||
devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
|
||||
|
||||
logofiles = \
|
||||
logos/logo-base.svg \
|
||||
@@ -153,9 +98,6 @@ logofiles = \
|
||||
logos/logo-banner-light-256.png \
|
||||
logos/logo-banner-light-800.png
|
||||
|
||||
logofilesdir = $(HTML_DIR)/logos
|
||||
logofiles_DATA = $(logofiles)
|
||||
|
||||
png = \
|
||||
32favicon.png \
|
||||
libvirt-daemon-arch.png \
|
||||
@@ -171,162 +113,40 @@ gif = \
|
||||
architecture.gif \
|
||||
node.gif
|
||||
|
||||
|
||||
internals_html_in = \
|
||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
|
||||
internals_rst = \
|
||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.rst))
|
||||
internals_rst_html_in = \
|
||||
$(internals_rst:%.rst=%.html.in)
|
||||
internals_html = \
|
||||
$(internals_html_in:%.html.in=%.html) \
|
||||
$(internals_rst_html_in:%.html.in=%.html)
|
||||
|
||||
internalsdir = $(HTML_DIR)/internals
|
||||
internals_DATA = $(internals_html)
|
||||
|
||||
kbase_html_in = \
|
||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/kbase/*.html.in))
|
||||
kbase_rst = \
|
||||
$(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/kbase/*.rst))
|
||||
kbase_rst_html_in = \
|
||||
$(kbase_rst:%.rst=%.html.in)
|
||||
kbase_html = \
|
||||
$(kbase_html_in:%.html.in=%.html) \
|
||||
$(kbase_rst_html_in:%.html.in=%.html)
|
||||
|
||||
kbasedir = $(HTML_DIR)/kbase
|
||||
kbase_DATA = $(kbase_html)
|
||||
|
||||
# Sync with src/util/
|
||||
KEYCODES = linux osx atset1 atset2 atset3 xtkbd usb win32 qnum
|
||||
KEYNAMES = linux osx win32
|
||||
|
||||
manpages_rst = \
|
||||
manpages/index.rst \
|
||||
$(NULL)
|
||||
manpages1_rst = \
|
||||
manpages/virt-pki-validate.rst \
|
||||
manpages/virt-xml-validate.rst \
|
||||
manpages/virt-admin.rst \
|
||||
manpages/virsh.rst \
|
||||
$(NULL)
|
||||
manpages7_rst = \
|
||||
$(KEYCODES:%=manpages/virkeycode-%.rst) \
|
||||
$(KEYNAMES:%=manpages/virkeyname-%.rst) \
|
||||
$(NULL)
|
||||
manpages8_rst = $(NULL)
|
||||
manpages_rst += \
|
||||
$(manpages1_rst) \
|
||||
$(manpages7_rst) \
|
||||
$(manpages8_rst) \
|
||||
$(NULL)
|
||||
if WITH_LIBVIRTD
|
||||
manpages8_rst += \
|
||||
manpages/libvirtd.rst \
|
||||
manpages/virtlockd.rst \
|
||||
manpages/virtlogd.rst \
|
||||
$(NULL)
|
||||
else ! WITH_LIBVIRTD
|
||||
manpages_rst += \
|
||||
manpages/libvirtd.rst \
|
||||
manpages/virtlockd.rst \
|
||||
manpages/virtlogd.rst \
|
||||
$(NULL)
|
||||
endif ! WITH_LIBVIRTD
|
||||
if WITH_HOST_VALIDATE
|
||||
manpages1_rst += manpages/virt-host-validate.rst
|
||||
else ! WITH_HOST_VALIDATE
|
||||
manpages_rst += manpages/virt-host-validate.rst
|
||||
endif ! WITH_HOST_VALIDATE
|
||||
if WITH_LOGIN_SHELL
|
||||
manpages1_rst += manpages/virt-login-shell.rst
|
||||
else ! WITH_LOGIN_SHELL
|
||||
manpages_rst += manpages/virt-login-shell.rst
|
||||
endif ! WITH_LOGIN_SHELL
|
||||
if WITH_SANLOCK
|
||||
manpages8_rst += manpages/virt-sanlock-cleanup.rst
|
||||
else ! WITH_SANLOCK
|
||||
manpages_rst += manpages/virt-sanlock-cleanup.rst
|
||||
endif ! WITH_SANLOCK
|
||||
if WITH_QEMU
|
||||
manpages1_rst += manpages/virt-qemu-run.rst
|
||||
else ! WITH_QEMU
|
||||
manpages_rst += manpages/virt-qemu-run.rst
|
||||
endif ! WITH_QEMU
|
||||
manpages_rst_html_in = \
|
||||
$(manpages_rst:%.rst=%.html.in)
|
||||
manpages_html = \
|
||||
$(manpages_rst_html_in:%.html.in=%.html)
|
||||
|
||||
man1_MANS = $(manpages1_rst:%.rst=%.1)
|
||||
man7_MANS = $(manpages7_rst:%.rst=%.7)
|
||||
man8_MANS = $(manpages8_rst:%.rst=%.8)
|
||||
|
||||
%.1: %.rst
|
||||
$(AM_V_GEN)$(MKDIR_P) `dirname $@` && \
|
||||
grep -v '^\.\. contents::' < $< | \
|
||||
sed -e 's|SYSCONFDIR|$(sysconfdir)|g' \
|
||||
-e 's|RUNSTATEDIR|$(runstatedir)|g' | \
|
||||
$(RST2MAN) --strict > $@ || { rm $@ && exit 1; }
|
||||
|
||||
%.7: %.rst
|
||||
$(AM_V_GEN)$(MKDIR_P) `dirname $@` && \
|
||||
grep -v '^\.\. contents::' < $< | \
|
||||
sed -e 's|SYSCONFDIR|$(sysconfdir)|g' \
|
||||
-e 's|RUNSTATEDIR|$(runstatedir)|g' | \
|
||||
$(RST2MAN) --strict > $@ || { rm $@ && exit 1; }
|
||||
|
||||
%.8: %.rst
|
||||
$(AM_V_GEN)$(MKDIR_P) `dirname $@` && \
|
||||
grep -v '^\.\. contents::' < $< | \
|
||||
sed -e 's|SYSCONFDIR|$(sysconfdir)|g' \
|
||||
-e 's|RUNSTATEDIR|$(runstatedir)|g' | \
|
||||
$(RST2MAN) --strict > $@ || { rm $@ && exit 1; }
|
||||
|
||||
manpages/virkeycode-%.rst: $(top_srcdir)/src/keycodemapdb/data/keymaps.csv \
|
||||
$(top_srcdir)/src/keycodemapdb/tools/keymap-gen Makefile.am
|
||||
$(AM_V_GEN)export NAME=`echo $@ | \
|
||||
sed -e 's,manpages/virkeycode-,,' -e 's,\.rst,,'` && \
|
||||
$(MKDIR_P) manpages/ && \
|
||||
$(RUNUTF8) $(PYTHON) $(top_srcdir)/src/keycodemapdb/tools/keymap-gen \
|
||||
code-docs \
|
||||
--lang rst \
|
||||
--title "virkeycode-$$NAME" \
|
||||
--subtitle "Key code values for $$NAME" \
|
||||
$(top_srcdir)/src/keycodemapdb/data/keymaps.csv $$NAME > $@
|
||||
|
||||
manpages/virkeyname-%.rst: $(top_srcdir)/src/keycodemapdb/data/keymaps.csv \
|
||||
$(top_srcdir)/src/keycodemapdb/tools/keymap-gen Makefile.am
|
||||
$(AM_V_GEN)export NAME=`echo $@ | \
|
||||
sed -e 's,manpages/virkeyname-,,' -e 's,\.rst,,'` && \
|
||||
$(MKDIR_P) manpages/ && \
|
||||
$(RUNUTF8) $(PYTHON) $(top_srcdir)/src/keycodemapdb/tools/keymap-gen \
|
||||
name-docs \
|
||||
--lang rst \
|
||||
--title "virkeyname-$$NAME" \
|
||||
--subtitle "Key name values for $$NAME" \
|
||||
$(top_srcdir)/src/keycodemapdb/data/keymaps.csv $$NAME > $@
|
||||
|
||||
manpagesdir = $(HTML_DIR)/manpages
|
||||
manpages_DATA = $(manpages_html)
|
||||
internals_html = $(internals_html_in:%.html.in=%.html)
|
||||
|
||||
# Since we ship pre-built html in the tarball, we must also
|
||||
# ship the sources, even when those sources are themselves
|
||||
# generated.
|
||||
# Generate hvsupport.html and news.html first, since they take one extra step.
|
||||
dot_html_generated_in = \
|
||||
hvsupport.html.in \
|
||||
news.html.in
|
||||
dot_html_in = \
|
||||
hvsupport.html.in \
|
||||
news.html.in \
|
||||
$(notdir $(wildcard $(srcdir)/*.html.in))
|
||||
dot_rst = \
|
||||
$(notdir $(wildcard $(srcdir)/*.rst))
|
||||
dot_rst_html_in = \
|
||||
$(dot_rst:%.rst=%.html)
|
||||
dot_html = \
|
||||
$(dot_html_generated_in:%.html.in=%.html) \
|
||||
$(dot_html_in:%.html.in=%.html) \
|
||||
$(dot_rst_html_in:%.html.in=%.html)
|
||||
dot_html = $(dot_html_in:%.html.in=%.html)
|
||||
|
||||
htmldir = $(HTML_DIR)
|
||||
html_DATA = $(css) $(png) $(gif) $(dot_html)
|
||||
dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
|
||||
dot_php_code_in = $(dot_php_in:%.php.in=%.php.code.in)
|
||||
dot_php = $(dot_php_in:%.php.in=%.php)
|
||||
|
||||
xml = \
|
||||
libvirt-api.xml \
|
||||
libvirt-refs.xml
|
||||
|
||||
qemu_xml = \
|
||||
libvirt-qemu-api.xml \
|
||||
libvirt-qemu-refs.xml
|
||||
|
||||
lxc_xml = \
|
||||
libvirt-lxc-api.xml \
|
||||
libvirt-lxc-refs.xml
|
||||
|
||||
admin_xml = \
|
||||
libvirt-admin-api.xml \
|
||||
libvirt-admin-refs.xml
|
||||
|
||||
apidir = $(pkgdatadir)/api
|
||||
api_DATA = \
|
||||
@@ -349,39 +169,31 @@ schemadir = $(pkgdatadir)/schemas
|
||||
schema_DATA = $(wildcard $(srcdir)/schemas/*.rng)
|
||||
|
||||
EXTRA_DIST= \
|
||||
apibuild.py genaclperms.pl \
|
||||
site.xsl subsite.xsl newapi.xsl page.xsl \
|
||||
wrapstring.xsl \
|
||||
$(dot_html_in) $(dot_rst) $(gif) $(apipng) \
|
||||
$(fig) $(png) $(css) \
|
||||
$(javascript) $(logofiles) \
|
||||
$(internals_html_in) $(internals_rst) $(fonts) \
|
||||
$(kbase_html_in) $(kbase_rst) \
|
||||
$(manpages_rst) \
|
||||
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
|
||||
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
|
||||
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
|
||||
$(logofiles) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
|
||||
$(internals_html_in) $(internals_html) $(fonts) \
|
||||
aclperms.htmlinc \
|
||||
hvsupport.pl \
|
||||
$(schema_DATA)
|
||||
|
||||
acl_generated = aclperms.htmlinc
|
||||
|
||||
aclperms.htmlinc: $(top_srcdir)/src/access/viraccessperm.h \
|
||||
$(top_srcdir)/scripts/genaclperms.py Makefile.am
|
||||
$(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/genaclperms.py $< > $@
|
||||
$(srcdir)/aclperms.htmlinc: $(top_srcdir)/src/access/viraccessperm.h \
|
||||
$(srcdir)/genaclperms.pl Makefile.am
|
||||
$(AM_V_GEN)$(PERL) $(srcdir)/genaclperms.pl $< > $@
|
||||
|
||||
CLEANFILES = \
|
||||
$(dot_html) \
|
||||
$(apihtml) \
|
||||
$(apiadminhtml) \
|
||||
$(apiqemuhtml) \
|
||||
$(apilxchtml) \
|
||||
$(internals_html) \
|
||||
$(kbase_html) \
|
||||
$(manpages_html) \
|
||||
$(man1_MANS) \
|
||||
$(man7_MANS) \
|
||||
$(manpages7_rst) \
|
||||
$(man8_MANS) \
|
||||
$(api_DATA) \
|
||||
$(dot_html_generated_in) \
|
||||
aclperms.htmlinc
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(addprefix $(srcdir)/,$(dot_html)) \
|
||||
$(addprefix $(srcdir)/,$(apihtml)) \
|
||||
$(addprefix $(srcdir)/,$(devhelphtml)) \
|
||||
$(addprefix $(srcdir)/,$(internals_html)) \
|
||||
$(addprefix $(srcdir)/,$(dot_php)) \
|
||||
$(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc
|
||||
|
||||
timestamp="$(shell if test -n "$$SOURCE_DATE_EPOCH"; \
|
||||
then \
|
||||
@@ -390,42 +202,49 @@ timestamp="$(shell if test -n "$$SOURCE_DATE_EPOCH"; \
|
||||
date -u; \
|
||||
fi)"
|
||||
|
||||
hvsupport.html: hvsupport.html.in
|
||||
all-am: web
|
||||
|
||||
hvsupport.html.in: $(top_srcdir)/scripts/hvsupport.py $(api_DATA) \
|
||||
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
|
||||
qemu_api: $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
|
||||
lxc_api: $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
|
||||
admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
||||
|
||||
web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \
|
||||
$(dot_php)
|
||||
|
||||
hvsupport.html: $(srcdir)/hvsupport.html.in
|
||||
|
||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
||||
$(top_srcdir)/src/libvirt_public.syms \
|
||||
$(top_srcdir)/src/libvirt_qemu.syms $(top_srcdir)/src/libvirt_lxc.syms \
|
||||
$(top_srcdir)/src/driver.h
|
||||
$(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/hvsupport.py \
|
||||
$(top_srcdir) $(top_builddir) > $@ || { rm $@ && exit 1; }
|
||||
$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \
|
||||
|| { rm $@ && exit 1; }
|
||||
|
||||
# xsltproc seems to add the xmlns="" attribute to random output elements:
|
||||
# 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 \
|
||||
>$@ \
|
||||
|| { rm -f $@; exit 1; };
|
||||
>$@-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
|
||||
convert -rotate 90 $< $@
|
||||
|
||||
manpages/%.html.in: manpages/%.rst
|
||||
$(AM_V_GEN)$(MKDIR_P) `dirname $@` && \
|
||||
grep -v '^:Manual ' < $< | \
|
||||
sed -e 's|SYSCONFDIR|$(sysconfdir)|g' \
|
||||
-e 's|RUNSTATEDIR|$(runstatedir)|g' | \
|
||||
$(RST2HTML) --strict > $@ || { rm $@ && exit 1; }
|
||||
|
||||
%.html.in: %.rst
|
||||
$(AM_V_GEN)$(MKDIR_P) `dirname $@` && \
|
||||
$(RST2HTML) --strict $< > $@ || { rm $@ && exit 1; }
|
||||
|
||||
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
|
||||
$(acl_generated)
|
||||
$(AM_V_GEN)name=`echo $@ | sed -e 's/.tmp//'`; \
|
||||
@@ -438,56 +257,65 @@ manpages/%.html.in: manpages/%.rst
|
||||
style=subsite.xsl; \
|
||||
fi; \
|
||||
$(XSLTPROC) --stringparam pagename $$name \
|
||||
--stringparam builddir '$(abs_top_builddir)' \
|
||||
--stringparam timestamp $(timestamp) --nonet \
|
||||
$(top_srcdir)/docs/$$style $< > $@ \
|
||||
|| { rm $@ && exit 1; }
|
||||
|
||||
%.html: %.html.tmp
|
||||
$(AM_V_GEN)$(XMLLINT) --nonet --format $< > $@ \
|
||||
|| { rm $@ && exit 1; }
|
||||
$(AM_V_GEN)$(XMLLINT) --nonet --format $< > $(srcdir)/$@ \
|
||||
|| { rm $(srcdir)/$@ && exit 1; }
|
||||
|
||||
%.php.tmp: %.php.in site.xsl page.xsl
|
||||
$(AM_V_GEN)$(XSLTPROC) --stringparam pagename $(@:.tmp=) \
|
||||
--stringparam timestamp $(timestamp) --nonet \
|
||||
$(top_srcdir)/docs/site.xsl $< > $@ \
|
||||
|| { rm $@ && exit 1; }
|
||||
|
||||
%.php: %.php.tmp %.php.code.in
|
||||
$(AM_V_GEN)sed \
|
||||
-e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
|
||||
-e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
|
||||
|| { rm $(srcdir)/$@ && exit 1; }
|
||||
|
||||
$(apihtml_generated): html/index.html
|
||||
$(apiadminhtml_generated): html/index-admin.html
|
||||
$(apiqemuhtml_generated): html/index-qemu.html
|
||||
$(apilxchtml_generated): html/index-lxc.html
|
||||
|
||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl $(APIBUILD_STAMP)
|
||||
$(AM_V_GEN)$(XSLTPROC) --nonet -o ./ \
|
||||
$(AM_V_GEN)$(XSLTPROC) --nonet -o $(srcdir)/ \
|
||||
--stringparam builddir '$(abs_top_builddir)' \
|
||||
--stringparam timestamp $(timestamp) \
|
||||
$(srcdir)/newapi.xsl libvirt-api.xml
|
||||
$(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml && \
|
||||
$(XMLLINT) --nonet --noout $(srcdir)/html/*.html
|
||||
|
||||
html/index-%.html: libvirt-%-api.xml newapi.xsl page.xsl $(APIBUILD_STAMP)
|
||||
$(AM_V_GEN)$(XSLTPROC) --nonet -o ./ \
|
||||
--stringparam builddir '$(abs_top_builddir)' \
|
||||
--stringparam timestamp $(timestamp) \
|
||||
--stringparam indexfile $(@:html/%=%) \
|
||||
$(srcdir)/newapi.xsl $<
|
||||
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
|
||||
$(AM_V_GEN)$(XSLTPROC) --stringparam timestamp $(timestamp) \
|
||||
--nonet -o $(srcdir)/devhelp/ \
|
||||
$(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml
|
||||
|
||||
check-html:
|
||||
$(XMLLINT) --nonet --noout html/*.html
|
||||
|
||||
check-local: check-html
|
||||
|
||||
python_generated_files = \
|
||||
html/libvirt-libvirt-lxc.html \
|
||||
html/libvirt-libvirt-qemu.html \
|
||||
html/libvirt-libvirt-admin.html \
|
||||
html/libvirt-virterror.html \
|
||||
$(api_DATA) \
|
||||
$(srcdir)/html/libvirt-libvirt-lxc.html \
|
||||
$(srcdir)/html/libvirt-libvirt-qemu.html \
|
||||
$(srcdir)/html/libvirt-libvirt-admin.html \
|
||||
$(srcdir)/html/libvirt-virterror.html \
|
||||
$(srcdir)/libvirt-api.xml \
|
||||
$(srcdir)/libvirt-refs.xml \
|
||||
$(srcdir)/libvirt-lxc-api.xml \
|
||||
$(srcdir)/libvirt-lxc-refs.xml \
|
||||
$(srcdir)/libvirt-qemu-api.xml \
|
||||
$(srcdir)/libvirt-qemu-refs.xml \
|
||||
$(srcdir)/libvirt-admin-api.xml \
|
||||
$(srcdir)/libvirt-admin-refs.xml \
|
||||
$(NULL)
|
||||
|
||||
APIBUILD=$(top_srcdir)/scripts/apibuild.py
|
||||
APIBUILD_STAMP=apibuild.py.stamp
|
||||
CLEANFILES += $(APIBUILD_STAMP)
|
||||
APIBUILD=$(srcdir)/apibuild.py
|
||||
APIBUILD_STAMP=$(APIBUILD).stamp
|
||||
EXTRA_DIST += $(APIBUILD_STAMP)
|
||||
|
||||
$(python_generated_files): $(APIBUILD_STAMP)
|
||||
|
||||
$(APIBUILD_STAMP): $(top_srcdir)/scripts/apibuild.py \
|
||||
$(APIBUILD_STAMP): $(srcdir)/apibuild.py \
|
||||
$(top_srcdir)/include/libvirt/libvirt.h \
|
||||
$(top_srcdir)/include/libvirt/libvirt-common.h.in \
|
||||
$(top_srcdir)/include/libvirt/libvirt-domain-checkpoint.h \
|
||||
$(top_srcdir)/include/libvirt/libvirt-domain-snapshot.h \
|
||||
$(top_srcdir)/include/libvirt/libvirt-domain.h \
|
||||
$(top_srcdir)/include/libvirt/libvirt-event.h \
|
||||
@@ -504,7 +332,6 @@ $(APIBUILD_STAMP): $(top_srcdir)/scripts/apibuild.py \
|
||||
$(top_srcdir)/include/libvirt/libvirt-admin.h \
|
||||
$(top_srcdir)/include/libvirt/virterror.h \
|
||||
$(top_srcdir)/src/libvirt.c \
|
||||
$(top_srcdir)/src/libvirt-domain-checkpoint.c \
|
||||
$(top_srcdir)/src/libvirt-domain-snapshot.c \
|
||||
$(top_srcdir)/src/libvirt-domain.c \
|
||||
$(top_srcdir)/src/libvirt-host.c \
|
||||
@@ -517,10 +344,65 @@ $(APIBUILD_STAMP): $(top_srcdir)/scripts/apibuild.py \
|
||||
$(top_srcdir)/src/libvirt-stream.c \
|
||||
$(top_srcdir)/src/libvirt-lxc.c \
|
||||
$(top_srcdir)/src/libvirt-qemu.c \
|
||||
$(top_srcdir)/src/admin/libvirt-admin.c \
|
||||
$(top_srcdir)/src/libvirt-admin.c \
|
||||
$(top_srcdir)/src/util/virerror.c \
|
||||
$(top_srcdir)/src/util/virevent.c \
|
||||
$(top_srcdir)/src/util/virtypedparam-public.c
|
||||
$(AM_V_GEN)srcdir=$(srcdir) builddir=$(builddir) \
|
||||
$(RUNUTF8) $(PYTHON) $(APIBUILD)
|
||||
$(top_srcdir)/src/util/virtypedparam.c
|
||||
$(AM_V_GEN)srcdir=$(srcdir) builddir=$(builddir) $(PYTHON) $(APIBUILD)
|
||||
touch $@
|
||||
|
||||
|
||||
check-local: all
|
||||
dist-local: all
|
||||
|
||||
clean-local:
|
||||
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html html/*.html
|
||||
|
||||
maintainer-clean-local: clean-local
|
||||
rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-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-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
|
||||
rm -rf $(APIBUILD_STAMP)
|
||||
|
||||
rebuild: api qemu_api lxc_api admin_api all
|
||||
|
||||
install-data-local:
|
||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
|
||||
for f in $(css) $(dot_html) $(gif) $(png); do \
|
||||
$(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
|
||||
for h in $(apihtml); do \
|
||||
$(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done
|
||||
for p in $(apipng); do \
|
||||
$(INSTALL) -m 0644 $(srcdir)/$$p $(DESTDIR)$(HTML_DIR)/html; done
|
||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/internals
|
||||
for f in $(internals_html); do \
|
||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/internals; done
|
||||
$(mkinstalldirs) $(DESTDIR)$(DEVHELP_DIR)
|
||||
for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
||||
$(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
|
||||
done
|
||||
$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/fonts
|
||||
for f in $(fonts); do \
|
||||
$(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/fonts; \
|
||||
done
|
||||
|
||||
uninstall-local:
|
||||
for f in $(css) $(dot_html) $(gif) $(png) $(fonts); do \
|
||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||
done
|
||||
for f in $(logofiles); do \
|
||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||
done
|
||||
for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done
|
||||
for p in $(apipng); do rm -f $(DESTDIR)$(HTML_DIR)/$$p; done
|
||||
for f in $(internals_html); do \
|
||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||
done
|
||||
for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
||||
rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
||||
done
|
||||
|
@@ -64,7 +64,7 @@
|
||||
</p>
|
||||
|
||||
<h3><a id="object_connect">virConnectPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -80,7 +80,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_domain">virDomainPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -104,7 +104,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_interface">virInterfacePtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -128,7 +128,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_network">virNetworkPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -152,7 +152,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_node_device">virNodeDevicePtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -172,7 +172,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_nwfilter">virNWFilterPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -196,7 +196,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_secret">virSecretPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -232,7 +232,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_storage_pool">virStoragePoolPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -256,7 +256,7 @@
|
||||
</table>
|
||||
|
||||
<h3><a id="object_storage_vol">virStorageVolPtr</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Attribute</th>
|
||||
@@ -317,7 +317,7 @@
|
||||
</p>
|
||||
|
||||
<h3><a id="object_connect_driver">Connection Driver Name</a></h3>
|
||||
<table>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Connection Driver</th>
|
||||
@@ -365,6 +365,10 @@
|
||||
<td>openvz</td>
|
||||
<td>OPENVZ</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>phyp</td>
|
||||
<td>PHYP</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>qemu</td>
|
||||
<td>QEMU</td>
|
||||
@@ -389,6 +393,10 @@
|
||||
<td>vz</td>
|
||||
<td>vz</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>xenapi</td>
|
||||
<td>XenAPI</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
@@ -330,7 +330,7 @@
|
||||
daemon through the <a href="remote.html">remote</a> driver via an
|
||||
<a href="internals/rpc.html">RPC</a>. Some hypervisors do support
|
||||
client-side connections and responses, such as Test, OpenVZ, VMware,
|
||||
VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo.
|
||||
Power VM (phyp), VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo.
|
||||
The libvirtd daemon service is started on the host at system boot
|
||||
time and can also be restarted at any time by a properly privileged
|
||||
user, such as root. The libvirtd daemon uses the same libvirt API
|
||||
|
@@ -89,7 +89,7 @@
|
||||
separately.
|
||||
</p>
|
||||
|
||||
<h2><a id='publicapi'>Defining the public API</a></h2>
|
||||
<h2><a name='publicapi'>Defining the public API</a></h2>
|
||||
|
||||
<p>The first task is to define the public API. If the new API
|
||||
involves an XML extension, you have to enhance the RelaxNG
|
||||
@@ -119,7 +119,7 @@
|
||||
rework it as you go through the process of implementing it.
|
||||
</p>
|
||||
|
||||
<h2><a id='internalapi'>Defining the internal API</a></h2>
|
||||
<h2><a name='internalapi'>Defining the internal API</a></h2>
|
||||
|
||||
<p>
|
||||
Each public API call is associated with a driver, such as a host
|
||||
@@ -146,7 +146,7 @@
|
||||
provide a <code>NULL</code> stub for the new function.
|
||||
</p>
|
||||
|
||||
<h2><a id='implpublic'>Implementing the public API</a></h2>
|
||||
<h2><a name='implpublic'>Implementing the public API</a></h2>
|
||||
|
||||
<p>
|
||||
Implementing the public API is largely a formality in which we wire up
|
||||
@@ -179,7 +179,7 @@
|
||||
|
||||
<p><code>src/libvirt-$MODULE.c</code></p>
|
||||
|
||||
<h2><a id='remoteproto'>Implementing the remote protocol</a></h2>
|
||||
<h2><a name='remoteproto'>Implementing the remote protocol</a></h2>
|
||||
|
||||
<p>
|
||||
Implementing the remote protocol is essentially a
|
||||
@@ -187,7 +187,7 @@
|
||||
understood by referring to the existing code.
|
||||
</p>
|
||||
|
||||
<h3><a id='wireproto'>Defining the wire protocol format</a></h3>
|
||||
<h3><a name='wireproto'>Defining the wire protocol format</a></h3>
|
||||
|
||||
<p>
|
||||
Defining the wire protocol involves making additions to:
|
||||
@@ -226,11 +226,11 @@
|
||||
src/remote/remote_protocol.h
|
||||
</code></p>
|
||||
|
||||
<h3><a id='rpcclient'>Implement the RPC client</a></h3>
|
||||
<h3><a name='rpcclient'>Implement the RPC client</a></h3>
|
||||
|
||||
<p>
|
||||
Implementing the RPC client uses the rpcgen generated .h files.
|
||||
The remote method calls go in:
|
||||
Implementing the uses the rpcgen generated .h files. The remote
|
||||
method calls go in:
|
||||
</p>
|
||||
|
||||
<p><code>src/remote/remote_driver.c</code></p>
|
||||
@@ -256,7 +256,7 @@
|
||||
The server side dispatchers are implemented in:
|
||||
</p>
|
||||
|
||||
<p><code>src/remote/remote_daemon_dispatch.c</code></p>
|
||||
<p><code>src/remote/daemon_dispatch.c</code></p>
|
||||
|
||||
<p>Again, this step uses the .h files generated by make rpcgen.</p>
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -99,12 +99,6 @@
|
||||
machines. It is a command line tool for developers that makes it very
|
||||
fast and easy to deploy and re-deploy an environment of vm's.
|
||||
</dd>
|
||||
<dt><a href="https://github.com/virt-lightning/virt-lightning">virt-lightning</a></dt>
|
||||
<dd>
|
||||
Virt-Lightning uses libvirt, cloud-init and libguestfs to allow anyone
|
||||
to quickly start a new VM. Very much like a container CLI, but with a
|
||||
virtual machine.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2><a id="configmgmt">Configuration Management</a></h2>
|
||||
@@ -224,7 +218,7 @@
|
||||
<dd>
|
||||
Eucalyptus is an on-premise Infrastructure as a Service cloud
|
||||
software platform that is open source and
|
||||
AWS-compatible. Eucalyptus uses libvirt virtualization API to
|
||||
AWS-compatible. Eucalyptus uses libivrt virtualization API to
|
||||
directly interact with Xen and KVM hypervisors.
|
||||
</dd>
|
||||
|
||||
|
@@ -42,7 +42,7 @@
|
||||
In addition to have formal messages sent to the audit subsystem it is
|
||||
possible to tell libvirt to inject messages into its own logging
|
||||
layer. This will result in messages ending up in the systemd journal
|
||||
or <code>/var/log/libvirt/libvirtd.log</code> on non-systemd hosts.
|
||||
or <code>/var/log/libvirt/libivrtd.log</code> on non-systemd hosts.
|
||||
This is disabled by default, but can be requested by setting the
|
||||
<code>audit_logging=1</code> configuration parameter in the same file
|
||||
mentioned above.
|
||||
|
@@ -129,9 +129,11 @@ credentials=defgrp</pre>
|
||||
<li><code>libvirt</code> - used for connections to a libvirtd
|
||||
server, which is configured with SASL auth</li>
|
||||
<li><code>ssh</code> - used for connections to a Phyp server
|
||||
over SSH, but the Phyp driver has been removed</li>
|
||||
over SSH</li>
|
||||
<li><code>esx</code> - used for connections to an ESX or
|
||||
VirtualCenter server</li>
|
||||
<li><code>xen</code> - used for connections to a Xen Enterprise
|
||||
sever using XenAPI</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
@@ -274,7 +276,7 @@ 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 required to enable plain password auth. This is done by
|
||||
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>
|
||||
@@ -317,7 +319,7 @@ in these scenarios - only the plain TCP listener needs encryption
|
||||
Some operating systems do not install the SASL kerberos plugin by default. It
|
||||
may be necessary to install a sub-package such as <code>cyrus-sasl-gssapi</code>.
|
||||
To check whether the Kerberos plugin is installed run the <code>pluginviewer</code>
|
||||
program and verify that <code>gssapi</code> is listed, e.g.:
|
||||
program and verify that <code>gssapi</code> is listed,eg:
|
||||
</p>
|
||||
<pre>
|
||||
# pluginviewer
|
||||
@@ -359,7 +361,7 @@ kadmin.local: quit
|
||||
<p>
|
||||
Any client application wishing to connect to a Kerberos enabled libvirt server
|
||||
merely needs to run <code>kinit</code> to gain a user principal. This may well
|
||||
be done automatically when a user logs into a desktop session, if PAM is set up
|
||||
be done automatically when a user logs into a desktop session, if PAM is setup
|
||||
to authenticate against Kerberos.
|
||||
</p>
|
||||
</body>
|
||||
|
@@ -155,17 +155,24 @@ $ROOT
|
||||
named <code>$VMNAME.libvirt-{qemu,lxc}</code>. Each consumer is associated
|
||||
with exactly one partition, which also have a corresponding cgroup usually
|
||||
named <code>$PARTNAME.partition</code>. The exceptions to this naming rule
|
||||
is the top level default partition for virtual machines and containers
|
||||
<code>/machine</code>.
|
||||
are the three top level default partitions, named <code>/system</code> (for
|
||||
system services), <code>/user</code> (for user login sessions) and
|
||||
<code>/machine</code> (for virtual machines and containers). By default
|
||||
every consumer will of course be associated with the <code>/machine</code>
|
||||
partition.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Given this, a possible non-systemd cgroups layout involving 3 qemu guests,
|
||||
Given this, a possible systemd cgroups layout involving 3 qemu guests,
|
||||
3 lxc containers and 2 custom child slices, would be:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ROOT
|
||||
|
|
||||
+- system
|
||||
| |
|
||||
| +- libvirtd.service
|
||||
|
|
||||
+- machine
|
||||
|
|
||||
|
@@ -9,15 +9,13 @@
|
||||
<h2><a id="compiling">Compiling a release tarball</a></h2>
|
||||
|
||||
<p>
|
||||
libvirt uses the standard configure/make/install steps and mandates
|
||||
that the build directory is different that the source directory:
|
||||
libvirt uses the standard configure/make/install steps:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
|
||||
$ cd libvirt-x.x.x
|
||||
$ mkdir build && cd build
|
||||
$ ../configure</pre>
|
||||
$ ./configure</pre>
|
||||
|
||||
<p>
|
||||
The <i>configure</i> script can be given options to change its default
|
||||
@@ -30,7 +28,7 @@ $ ../configure</pre>
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ ../configure <i>--help</i></pre>
|
||||
$ ./configure <i>--help</i></pre>
|
||||
|
||||
<p>
|
||||
When you have determined which options you want to use (if any),
|
||||
@@ -51,7 +49,7 @@ $ ../configure <i>--help</i></pre>
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ ../configure <i>[possible options]</i>
|
||||
$ ./configure <i>[possible options]</i>
|
||||
$ make
|
||||
$ <b>sudo</b> <i>make install</i></pre>
|
||||
|
||||
@@ -70,6 +68,31 @@ $ <b>sudo</b> <i>make install</i></pre>
|
||||
will turn on -Werror for builds. This can be disabled with
|
||||
--disable-werror, but this is not recommended.
|
||||
</p>
|
||||
<p>
|
||||
Libvirt takes advantage of
|
||||
the <a href="http://www.gnu.org/software/gnulib/">gnulib</a>
|
||||
project to provide portability to a number of platforms. This
|
||||
is normally done dynamically via a git submodule in
|
||||
the <code>.gnulib</code> subdirectory, which is auto-updated as
|
||||
needed when you do incremental builds. Setting the environment
|
||||
variable <code>GNULIB_SRCDIR</code> to a local directory
|
||||
containing a git checkout of gnulib will let you reduce local
|
||||
disk space requirements and network download time, regardless of
|
||||
which actual commit you have in that reference directory.
|
||||
</p>
|
||||
<p>
|
||||
However, if you are developing on a platform where git is not
|
||||
available, or are behind a firewall that does not allow for git
|
||||
to easily obtain the gnulib submodule, it is possible to instead
|
||||
use a static mode of operation where you are then responsible
|
||||
for updating the git submodule yourself. In this mode, you must
|
||||
track the exact gnulib commit needed by libvirt (usually not the
|
||||
latest gnulib.git) via alternative means, such as a shared NFS
|
||||
drive or manual download, and run this any time libvirt.git
|
||||
updates the commit stored in the .gnulib submodule:</p>
|
||||
<pre>
|
||||
$ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
|
||||
</pre>
|
||||
|
||||
<p>To build & install libvirt to your home
|
||||
directory the following commands can be run:
|
||||
|
@@ -6,14 +6,14 @@
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<h2><a id="description">Description</a></h2>
|
||||
<h2><a name="description">Description</a></h2>
|
||||
|
||||
<p>
|
||||
libvirt-dbus wraps libvirt API to provide a high-level object-oriented
|
||||
API better suited for dbus-based applications.
|
||||
</p>
|
||||
|
||||
<h2><a id="git">GIT source repository</a></h2>
|
||||
<h2><a name="git">GIT source repository</a></h2>
|
||||
<p>
|
||||
The D-Bus bindings source code is maintained in a
|
||||
<a href="https://git-scm.com/">git</a> repository available on
|
||||
@@ -32,7 +32,7 @@ git clone https://libvirt.org/git/libvirt-dbus.git
|
||||
<a href="https://libvirt.org/git/?p=libvirt-dbus.git">https://libvirt.org/git/?p=libvirt-dbus.git</a>
|
||||
</pre>
|
||||
|
||||
<h2><a id="usage">Usage</a></h2>
|
||||
<h2><a name="usage">Usage</a></h2>
|
||||
|
||||
<p>
|
||||
libvirt-dbus exports libvirt API using D-Bus objects with methods and
|
||||
|
131
docs/devhelp/devhelp.xsl
Normal file
131
docs/devhelp/devhelp.xsl
Normal file
@@ -0,0 +1,131 @@
|
||||
<?xml version="1.0"?>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
||||
xmlns="http://www.devhelp.net/book"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
xmlns:str="http://exslt.org/strings"
|
||||
extension-element-prefixes="exsl str"
|
||||
exclude-result-prefixes="exsl str">
|
||||
<!-- The stylesheet for the html pages -->
|
||||
<xsl:import href="html.xsl"/>
|
||||
|
||||
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
|
||||
|
||||
<!-- Build keys for all symbols -->
|
||||
<xsl:key name="symbols" match="/api/symbols/*" use="@name"/>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:document xmlns="http://www.devhelp.net/book" href="libvirt.devhelp"
|
||||
method="xml" encoding="UTF-8" indent="yes">
|
||||
<xsl:apply-templates/>
|
||||
</xsl:document>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="/api">
|
||||
<book title="{@name} Reference Manual" link="index.html" author="" name="{@name}">
|
||||
<xsl:apply-templates select="files"/>
|
||||
<xsl:apply-templates select="symbols"/>
|
||||
</book>
|
||||
<xsl:call-template name="generate_index"/>
|
||||
<xsl:call-template name="generate_general"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/files">
|
||||
<chapters>
|
||||
<sub name="API" link="general.html">
|
||||
<xsl:apply-templates select="file"/>
|
||||
</sub>
|
||||
</chapters>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/files/file">
|
||||
<xsl:variable name="module" select="@name"/>
|
||||
<xsl:variable name="prev" select="string(preceding-sibling::file[position()=1]/@name)"/>
|
||||
<xsl:variable name="next" select="string(following-sibling::file[position()=1]/@name)"/>
|
||||
<sub name="{@name}" link="libvirt-{@name}.html"/>
|
||||
<xsl:document xmlns="" href="libvirt-{@name}.html" method="xml" indent="yes" encoding="UTF-8">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title><xsl:value-of select="concat(@name, ': ', summary)"/></title>
|
||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
||||
<link rel="start" href="index.html" title="libvirt Reference Manual"/>
|
||||
<link rel="up" href="general.html" title="API"/>
|
||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
||||
<link rel="chapter" href="general.html" title="API"/>
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
|
||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
||||
<tr valign="middle">
|
||||
<xsl:if test="$prev != ''">
|
||||
<td><a accesskey="p" href="libvirt-{$prev}.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"/></a></td>
|
||||
</xsl:if>
|
||||
<td><a accesskey="u" href="general.html"><img src="up.png" width="24" height="24" border="0" alt="Up"/></a></td>
|
||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
||||
<xsl:if test="$next != ''">
|
||||
<td><a accesskey="n" href="libvirt-{$next}.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
||||
</xsl:if>
|
||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
||||
</tr>
|
||||
</table>
|
||||
<h2><span class="refentrytitle"><xsl:value-of select="@name"/></span></h2>
|
||||
<p><xsl:value-of select="@name"/> - <xsl:value-of select="summary"/></p>
|
||||
<p><xsl:value-of select="description"/></p>
|
||||
<xsl:if test="deprecated">
|
||||
<p> WARNING: this module is deprecated !</p>
|
||||
</xsl:if>
|
||||
<div class="refsynopsisdiv">
|
||||
<h2>Synopsis</h2>
|
||||
<pre class="synopsis">
|
||||
<xsl:apply-templates mode="synopsis" select="exports"/>
|
||||
</pre>
|
||||
</div>
|
||||
<div class="refsect1" lang="en">
|
||||
<h2>Description</h2>
|
||||
</div>
|
||||
<div class="refsect1" lang="en">
|
||||
<h2>Details</h2>
|
||||
<div class="refsect2" lang="en">
|
||||
<xsl:apply-templates mode="details" select="/api/symbols/macro[@file=$module]"/>
|
||||
<xsl:apply-templates mode="details" select="/api/symbols/typedef[@file=$module] | /api/symbols/struct[@file=$module]"/>
|
||||
<xsl:apply-templates mode="details" select="/api/symbols/functype[@file=$module]"/>
|
||||
<xsl:apply-templates mode="details" select="/api/symbols/variable[@file=$module]"/>
|
||||
<xsl:apply-templates mode="details" select="/api/symbols/function[@file=$module]"/>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:document>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols">
|
||||
<functions>
|
||||
<xsl:apply-templates select="macro"/>
|
||||
<xsl:apply-templates select="enum"/>
|
||||
<xsl:apply-templates select="typedef"/>
|
||||
<xsl:apply-templates select="struct"/>
|
||||
<xsl:apply-templates select="functype"/>
|
||||
<xsl:apply-templates select="variable"/>
|
||||
<xsl:apply-templates select="function"/>
|
||||
</functions>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/functype">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/function">
|
||||
<function name="{@name} ()" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/typedef">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/enum">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/struct">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/macro">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
<xsl:template match="/api/symbols/variable">
|
||||
<function name="{@name}" link="libvirt-{@file}.html#{@name}"/>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
BIN
docs/devhelp/home.png
Normal file
BIN
docs/devhelp/home.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 654 B |
577
docs/devhelp/html.xsl
Normal file
577
docs/devhelp/html.xsl
Normal file
@@ -0,0 +1,577 @@
|
||||
<?xml version="1.0"?>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
xmlns:str="http://exslt.org/strings"
|
||||
extension-element-prefixes="exsl str"
|
||||
exclude-result-prefixes="exsl str">
|
||||
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
|
||||
|
||||
<!-- This is convoluted but needed to force the current document to
|
||||
be the API one and not the result tree from the tokenize() result,
|
||||
because the keys are only defined on the main document -->
|
||||
<xsl:template mode="dumptoken" match='*'>
|
||||
<xsl:param name="token"/>
|
||||
<xsl:variable name="ref" select="key('symbols', $token)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$ref">
|
||||
<a href="libvirt-{$ref/@file}.html#{$ref/@name}"><xsl:value-of select="$token"/></a>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$token"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- dumps a string, making cross-reference links -->
|
||||
<xsl:template name="dumptext">
|
||||
<xsl:param name="text"/>
|
||||
<xsl:variable name="ctxt" select='.'/>
|
||||
<!-- <xsl:value-of select="$text"/> -->
|
||||
<xsl:for-each select="str:tokenize($text, ' 	')">
|
||||
<xsl:apply-templates select="$ctxt" mode='dumptoken'>
|
||||
<xsl:with-param name="token" select="string(.)"/>
|
||||
</xsl:apply-templates>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!--
|
||||
|
||||
The following builds the Synopsis section
|
||||
|
||||
-->
|
||||
<xsl:template mode="synopsis" match="function">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>	</xsl:text>
|
||||
<a href="#{@name}"><xsl:value-of select="@name"/></a>
|
||||
<xsl:if test="$blen - 40 < -8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 < 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>	(</xsl:text>
|
||||
<xsl:if test="not(arg)">
|
||||
<xsl:text>void</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="arg">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text><br/>
|
||||
<xsl:if test="$blen - 40 > 8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 > 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>					 </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>);</xsl:text>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="synopsis" match="functype">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
||||
<xsl:text>typedef </xsl:text>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<a href="#{@name}"><xsl:value-of select="@name"/></a>
|
||||
<xsl:if test="$blen - 40 < -8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 < 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>	(</xsl:text>
|
||||
<xsl:if test="not(arg)">
|
||||
<xsl:text>void</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="arg">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text><br/>
|
||||
<xsl:if test="$blen - 40 > 8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 > 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>					 </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>);</xsl:text>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="synopsis" match="exports[@type='function']">
|
||||
<xsl:variable name="def" select="key('symbols',@symbol)"/>
|
||||
<xsl:apply-templates mode="synopsis" select="$def"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="synopsis" match="exports[@type='typedef']">
|
||||
<xsl:text>typedef </xsl:text>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="string(key('symbols',@symbol)/@type)"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<a href="#{@symbol}"><xsl:value-of select="@symbol"/></a>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="synopsis" match="exports[@type='macro']">
|
||||
<xsl:variable name="def" select="key('symbols',@symbol)"/>
|
||||
<xsl:text>#define </xsl:text>
|
||||
<a href="#{@symbol}"><xsl:value-of select="@symbol"/></a>
|
||||
<xsl:if test="$def/arg">
|
||||
<xsl:text>(</xsl:text>
|
||||
<xsl:for-each select="$def/arg">
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>)</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</xsl:template>
|
||||
<xsl:template mode="synopsis" match="exports[@type='enum']">
|
||||
</xsl:template>
|
||||
<xsl:template mode="synopsis" match="exports[@type='struct']">
|
||||
</xsl:template>
|
||||
|
||||
<!--
|
||||
|
||||
The following builds the Details section
|
||||
|
||||
-->
|
||||
<xsl:template mode="details" match="struct">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}">Structure </a><xsl:value-of select="$name"/></h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:value-of select="@type"/><xsl:text> {
|
||||
</xsl:text>
|
||||
<xsl:if test="not(field)">
|
||||
<xsl:text>The content of this structure is not made public by the API.
|
||||
</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="field">
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>	</xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="@info != ''">
|
||||
<xsl:text>	: </xsl:text>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="substring(@info, 1, 70)"/>
|
||||
</xsl:call-template>
|
||||
</xsl:if>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</xsl:for-each>
|
||||
<xsl:text>} </xsl:text>
|
||||
<xsl:value-of select="$name"/>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="typedef[@type != 'enum']">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}">Typedef </a><xsl:value-of select="$name"/></h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="string(@type)"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="$name"/>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="variable">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}">Variable </a><xsl:value-of select="$name"/></h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="string(@type)"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="$name"/>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="typedef[@type = 'enum']">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}">Enum </a><xsl:value-of select="$name"/></h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:text>enum </xsl:text>
|
||||
<a href="#{$name}"><xsl:value-of select="$name"/></a>
|
||||
<xsl:text> {
|
||||
</xsl:text>
|
||||
<xsl:for-each select="/api/symbols/enum[@type=$name]">
|
||||
<xsl:sort select="@value" data-type="number" order="ascending"/>
|
||||
<xsl:text> </xsl:text>
|
||||
<a name="{@name}"><xsl:value-of select="@name"/></a>
|
||||
<xsl:if test="@value">
|
||||
<xsl:text> = </xsl:text>
|
||||
<xsl:value-of select="@value"/>
|
||||
</xsl:if>
|
||||
<xsl:if test="@info">
|
||||
<xsl:text> /* </xsl:text>
|
||||
<xsl:value-of select="@info"/>
|
||||
<xsl:text> */</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</xsl:for-each>
|
||||
<xsl:text>};
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="macro">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}">Macro </a><xsl:value-of select="$name"/></h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:text>#define </xsl:text>
|
||||
<a href="#{$name}"><xsl:value-of select="$name"/></a>
|
||||
<xsl:if test="arg">
|
||||
<xsl:text>(</xsl:text>
|
||||
<xsl:for-each select="arg">
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>)</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>;
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p>
|
||||
<xsl:if test="arg">
|
||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
||||
<xsl:for-each select="arg">
|
||||
<tr>
|
||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
||||
<td>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@info"/>
|
||||
</xsl:call-template>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody></table></div>
|
||||
</xsl:if>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="function">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}"></a><xsl:value-of select="$name"/> ()</h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>	</xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="$blen - 40 < -8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 < 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>	(</xsl:text>
|
||||
<xsl:if test="not(arg)">
|
||||
<xsl:text>void</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="arg">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text><br/>
|
||||
<xsl:if test="$blen - 40 > 8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 > 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>					 </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>)</xsl:text><br/>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
<xsl:if test="arg | return/@info">
|
||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
||||
<xsl:for-each select="arg">
|
||||
<tr>
|
||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
||||
<td>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@info"/>
|
||||
</xsl:call-template>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="return/@info">
|
||||
<tr>
|
||||
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
|
||||
<td>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@info"/>
|
||||
</xsl:call-template>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:if>
|
||||
</tbody></table></div>
|
||||
</xsl:if>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template mode="details" match="functype">
|
||||
<xsl:variable name="name" select="string(@name)"/>
|
||||
<xsl:variable name="nlen" select="string-length($name)"/>
|
||||
<xsl:variable name="tlen" select="string-length(return/@type)"/>
|
||||
<xsl:variable name="blen" select="(($nlen + 8) - (($nlen + 8) mod 8)) + (($tlen + 8) - (($tlen + 8) mod 8))"/>
|
||||
<div class="refsect2" lang="en">
|
||||
<h3><a name="{$name}"></a>Function type <xsl:value-of select="$name"/> </h3>
|
||||
<pre class="programlisting">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text>	</xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="$blen - 40 < -8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 < 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>	(</xsl:text>
|
||||
<xsl:if test="not(arg)">
|
||||
<xsl:text>void</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="arg">
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@type"/>
|
||||
</xsl:call-template>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="@name"/>
|
||||
<xsl:if test="position() != last()">
|
||||
<xsl:text>, </xsl:text><br/>
|
||||
<xsl:if test="$blen - 40 > 8">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:if test="$blen - 40 > 0">
|
||||
<xsl:text>	</xsl:text>
|
||||
</xsl:if>
|
||||
<xsl:text>					 </xsl:text>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:text>)</xsl:text><br/>
|
||||
<xsl:text>
|
||||
</xsl:text>
|
||||
</pre>
|
||||
<p>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="info"/>
|
||||
</xsl:call-template>
|
||||
</p><xsl:text>
|
||||
</xsl:text>
|
||||
<xsl:if test="arg | return/@info">
|
||||
<div class="variablelist"><table border="0"><col align="left"/><tbody>
|
||||
<xsl:for-each select="arg">
|
||||
<tr>
|
||||
<td><span class="term"><i><tt><xsl:value-of select="@name"/></tt></i>:</span></td>
|
||||
<td>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="@info"/>
|
||||
</xsl:call-template>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="return/@info">
|
||||
<tr>
|
||||
<td><span class="term"><i><tt>Returns</tt></i>:</span></td>
|
||||
<td>
|
||||
<xsl:call-template name="dumptext">
|
||||
<xsl:with-param name="text" select="return/@info"/>
|
||||
</xsl:call-template>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:if>
|
||||
</tbody></table></div>
|
||||
</xsl:if>
|
||||
</div><hr/>
|
||||
</xsl:template>
|
||||
|
||||
<!--
|
||||
|
||||
The following builds the general.html page
|
||||
|
||||
-->
|
||||
<xsl:template name="generate_general">
|
||||
<xsl:variable name="next" select="string(/api/files/file[position()=1]/@name)"/>
|
||||
<xsl:document xmlns="" href="general.html" method="xml" indent="yes" encoding="UTF-8">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title><xsl:value-of select="concat(@name, ': ', summary)"/></title>
|
||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
||||
<link rel="start" href="index.html" title="libvirt Reference Manual"/>
|
||||
<link rel="up" href="index.html" title="libvirt Reference Manual"/>
|
||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
||||
<link rel="chapter" href="index.html" title="libvirt Reference Manual"/>
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
|
||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
||||
<tr valign="middle">
|
||||
<td><a accesskey="u" href="index.html"><img src="up.png" width="24" height="24" border="0" alt="Up"/></a></td>
|
||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
||||
<xsl:if test="$next != ''">
|
||||
<td><a accesskey="n" href="libvirt-{$next}.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
||||
</xsl:if>
|
||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
||||
</tr>
|
||||
</table>
|
||||
<h2><span class="refentrytitle">libvirt API Modules</span></h2>
|
||||
<p>
|
||||
<xsl:for-each select="/api/files/file">
|
||||
<a href="libvirt-{@name}.html"><xsl:value-of select="@name"/></a> - <xsl:value-of select="summary"/><br/>
|
||||
</xsl:for-each>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:document>
|
||||
</xsl:template>
|
||||
|
||||
<!--
|
||||
|
||||
The following builds the index.html page
|
||||
|
||||
-->
|
||||
<xsl:template name="generate_index">
|
||||
<xsl:document xmlns="" href="index.html" method="xml" indent="yes" encoding="UTF-8">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||
<title>libvirt Reference Manual</title>
|
||||
<meta name="generator" content="Libvirt devhelp stylesheet"/>
|
||||
<link rel="stylesheet" href="style.css" type="text/css"/>
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
|
||||
<table class="navigation" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
|
||||
<tr valign="middle">
|
||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"/></a></td>
|
||||
<td><a accesskey="n" href="general.html"><img src="right.png" width="24" height="24" border="0" alt="Next"/></a></td>
|
||||
<th width="100%" align="center">libvirt Reference Manual</th>
|
||||
</tr>
|
||||
</table>
|
||||
<h2><span class="refentrytitle">libvirt Reference Manual</span></h2>
|
||||
<p>Libvir 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 <a href="http://www.opensource.org/licenses/lgpl-license.html">GNU
|
||||
Lesser General Public License</a>. 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 <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.html">Xen
|
||||
paravirtualization</a> but should be able to integrate other virtualization
|
||||
mechanisms if needed.</p>
|
||||
<p> If you get lost searching for some specific API use, try
|
||||
<a href="https://libvirt.org/search.php">the online search
|
||||
engine</a> hosted on <a href="https://libvirt.org/">libvirt.org</a>
|
||||
it indexes the project page, the APIs as well as the mailing-list archives. </p>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:document>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
BIN
docs/devhelp/left.png
Normal file
BIN
docs/devhelp/left.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 459 B |
BIN
docs/devhelp/right.png
Normal file
BIN
docs/devhelp/right.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 472 B |
66
docs/devhelp/style.css
Normal file
66
docs/devhelp/style.css
Normal file
@@ -0,0 +1,66 @@
|
||||
.synopsis, .classsynopsis
|
||||
{
|
||||
background: #eeeeee;
|
||||
border: solid 1px #aaaaaa;
|
||||
padding: 0.5em;
|
||||
}
|
||||
.programlisting
|
||||
{
|
||||
background: #eeeeff;
|
||||
border: solid 1px #aaaaff;
|
||||
padding: 0.5em;
|
||||
}
|
||||
.variablelist
|
||||
{
|
||||
padding: 4px;
|
||||
margin-left: 3em;
|
||||
}
|
||||
.variablelist td:first-child
|
||||
{
|
||||
vertical-align: top;
|
||||
}
|
||||
table.navigation
|
||||
{
|
||||
background: #ffeeee;
|
||||
border: solid 1px #ffaaaa;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.navigation a
|
||||
{
|
||||
color: #770000;
|
||||
}
|
||||
.navigation a:visited
|
||||
{
|
||||
color: #550000;
|
||||
}
|
||||
.navigation .title
|
||||
{
|
||||
font-size: 200%;
|
||||
}
|
||||
div.refnamediv
|
||||
{
|
||||
margin-top: 2em;
|
||||
}
|
||||
div.gallery-float
|
||||
{
|
||||
float: left;
|
||||
padding: 10px;
|
||||
}
|
||||
div.gallery-float img
|
||||
{
|
||||
border-style: none;
|
||||
}
|
||||
div.gallery-spacer
|
||||
{
|
||||
clear: both;
|
||||
}
|
||||
a
|
||||
{
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover
|
||||
{
|
||||
text-decoration: underline;
|
||||
color: #FF0000;
|
||||
}
|
BIN
docs/devhelp/up.png
Normal file
BIN
docs/devhelp/up.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 406 B |
@@ -9,9 +9,6 @@
|
||||
<dt><a href="apps.html">Applications</a></dt>
|
||||
<dd>Applications known to use libvirt</dd>
|
||||
|
||||
<dt><a href="manpages/index.html">Manual pages</a></dt>
|
||||
<dd>Manual pages for libvirt tools / daemons</dd>
|
||||
|
||||
<dt><a href="windows.html">Windows</a></dt>
|
||||
<dd>Downloads for Windows</dd>
|
||||
|
||||
@@ -21,9 +18,6 @@
|
||||
<dt><a href="remote.html">Remote access</a></dt>
|
||||
<dd>Enable remote access over TCP</dd>
|
||||
|
||||
<dt><a href="tlscerts.html">TLS certs</a></dt>
|
||||
<dd>Generate and deploy x509 certificates for TLS</dd>
|
||||
|
||||
<dt><a href="auth.html">Authentication</a></dt>
|
||||
<dd>Configure authentication for the libvirt daemon</dd>
|
||||
|
||||
@@ -54,27 +48,11 @@
|
||||
<div class="panel">
|
||||
<h2>Application development</h2>
|
||||
<dl>
|
||||
<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-checkpoint.html">domain checkpoint</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>
|
||||
and
|
||||
<a href="html/index-admin.html">admin</a>,
|
||||
<a href="html/index-qemu.html">QEMU</a>,
|
||||
<a href="html/index-lxc.html">LXC</a> libs
|
||||
</dd>
|
||||
<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 and API modules</a></dt>
|
||||
<dd>Bindings of the libvirt API for
|
||||
@@ -94,7 +72,6 @@
|
||||
<dd>Description of the XML schemas for
|
||||
<a href="formatdomain.html">domains</a>,
|
||||
<a href="formatnetwork.html">networks</a>,
|
||||
<a href="formatnetworkport.html">network ports</a>,
|
||||
<a href="formatnwfilter.html">network filtering</a>,
|
||||
<a href="formatstorage.html">storage</a>,
|
||||
<a href="formatstorageencryption.html">storage encryption</a>,
|
||||
@@ -103,16 +80,36 @@
|
||||
<a href="formatstoragecaps.html">storage pool capabilities</a>,
|
||||
<a href="formatnode.html">node devices</a>,
|
||||
<a href="formatsecret.html">secrets</a>,
|
||||
<a href="formatsnapshot.html">snapshots</a>,
|
||||
<a href="formatcheckpoint.html">checkpoints</a>,
|
||||
<a href="formatbackup.html">backup jobs</a></dd>
|
||||
<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>
|
||||
|
||||
@@ -122,8 +119,8 @@
|
||||
<dt><a href="hvsupport.html">Driver support</a></dt>
|
||||
<dd>matrix of API support per hypervisor per release</dd>
|
||||
|
||||
<dt><a href="kbase.html">Knowledge Base</a></dt>
|
||||
<dd>Task oriented guides to key features</dd>
|
||||
<dt><a href="secureusage.html">Secure usage</a></dt>
|
||||
<dd>Secure usage of the libvirt APIs</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
@@ -133,12 +130,6 @@
|
||||
<dt><a href="hacking.html">Contributor guidelines</a></dt>
|
||||
<dd>General hacking guidelines for contributors</dd>
|
||||
|
||||
<dt><a href="styleguide.html">Docs style guide</a></dt>
|
||||
<dd>Style guidelines for reStructuredText docs</dd>
|
||||
|
||||
<dt><a href="strategy.html">Project strategy</a></dt>
|
||||
<dd>Sets a vision for future direction & technical choices</dd>
|
||||
|
||||
<dt><a href="bugs.html">Bug reports</a></dt>
|
||||
<dd>How and where to report bugs and request features</dd>
|
||||
|
||||
@@ -166,6 +157,9 @@
|
||||
<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>
|
||||
|
@@ -27,7 +27,8 @@
|
||||
<tr>
|
||||
<td>libvirt</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/">libvirt</a>
|
||||
<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>
|
||||
@@ -47,7 +48,8 @@
|
||||
<tr>
|
||||
<td>C#</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/csharp/">libvirt</a>
|
||||
<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>
|
||||
@@ -61,7 +63,8 @@
|
||||
<tr>
|
||||
<td>Go</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/libvirt-go">libvirt</a>
|
||||
<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>
|
||||
@@ -71,13 +74,14 @@
|
||||
<a href="https://github.com/libvirt/libvirt-go">github</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://godoc.org/libvirt.org/libvirt-go">api ref</a>
|
||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go">api ref</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Java</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/java/">libvirt</a>
|
||||
<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>
|
||||
@@ -91,7 +95,8 @@
|
||||
<tr>
|
||||
<td>OCaml</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/ocaml/">libvirt</a>
|
||||
<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>
|
||||
@@ -105,7 +110,7 @@
|
||||
<tr>
|
||||
<td>Perl (Sys::Virt)</td>
|
||||
<td>
|
||||
<a href="https://metacpan.org/release/Sys-Virt/">cpan</a>
|
||||
<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>
|
||||
@@ -115,14 +120,15 @@
|
||||
<a href="https://github.com/libvirt/libvirt-perl">github</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://metacpan.org/release/Sys-Virt/">api ref</a>
|
||||
<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="https://libvirt.org/sources/php/">libvirt</a>
|
||||
<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>
|
||||
@@ -136,7 +142,8 @@
|
||||
<tr>
|
||||
<td>Python</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/python/">libvirt</a>
|
||||
<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>
|
||||
@@ -151,7 +158,8 @@
|
||||
<tr>
|
||||
<td>Ruby</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/ruby/">libvirt</a>
|
||||
<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>
|
||||
@@ -165,7 +173,8 @@
|
||||
<tr>
|
||||
<td>Rust</td>
|
||||
<td>
|
||||
<a href="https://crates.io/crates/virt">crates.io</a>
|
||||
<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>
|
||||
@@ -174,9 +183,7 @@
|
||||
<a href="https://gitlab.com/libvirt/libvirt-rust">gitlab</a>
|
||||
<a href="https://github.com/libvirt/libvirt-rust">github</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://docs.rs/virt">api ref</a>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="7">Integration modules</th>
|
||||
@@ -184,7 +191,8 @@
|
||||
<tr>
|
||||
<td>GLib / GConfig / GObject</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/glib/">libvirt</a>
|
||||
<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>
|
||||
@@ -198,7 +206,8 @@
|
||||
<tr>
|
||||
<td>Go XML</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/libvirt-go-xml">libvirt</a>
|
||||
<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>
|
||||
@@ -208,13 +217,14 @@
|
||||
<a href="https://github.com/libvirt/libvirt-go-xml">github</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://godoc.org/libvirt.org/libvirt-go-xml">api ref</a>
|
||||
<a href="https://godoc.org/github.com/libvirt/libvirt-go-xml">api ref</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>D-Bus</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/dbus/">libvirt</a>
|
||||
<a href="ftp://libvirt.org/libvirt/dbus/">ftp</a>
|
||||
<a href="https://libvirt.org/sources/dbus/">https</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/git/?p=libvirt-dbus.git;a=summary">libvirt</a>
|
||||
@@ -228,7 +238,8 @@
|
||||
<tr>
|
||||
<td>Console Proxy</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/consoleproxy/">libvirt</a>
|
||||
<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>
|
||||
@@ -242,7 +253,8 @@
|
||||
<tr>
|
||||
<td>CIM provider</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/CIM/">libvirt</a>
|
||||
<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>
|
||||
@@ -256,7 +268,8 @@
|
||||
<tr>
|
||||
<td>CIM utils</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/CIM/">libvirt</a>
|
||||
<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>
|
||||
@@ -270,7 +283,8 @@
|
||||
<tr>
|
||||
<td>SNMP</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/snmp/">libvirt</a>
|
||||
<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>
|
||||
@@ -284,7 +298,8 @@
|
||||
<tr>
|
||||
<td>Application Sandbox</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/sandbox/">libvirt</a>
|
||||
<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>
|
||||
@@ -301,7 +316,8 @@
|
||||
<tr>
|
||||
<td>TCK</td>
|
||||
<td>
|
||||
<a href="https://libvirt.org/sources/tck/">libvirt</a>
|
||||
<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>
|
||||
@@ -406,11 +422,14 @@
|
||||
|
||||
<p>
|
||||
Most modules have releases made available for download on the project
|
||||
site via HTTPS. Some modules are instead made available at alternative
|
||||
locations, for example, the Perl binding is made available only on CPAN.
|
||||
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>
|
||||
|
||||
<ul>
|
||||
<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="https://libvirt.org/sources/">libvirt.org HTTPS server</a></li>
|
||||
</ul>
|
||||
|
||||
|
@@ -6,9 +6,8 @@
|
||||
|
||||
<ul>
|
||||
<li><a href="#hypervisor">Hypervisor drivers</a></li>
|
||||
<li><a href="storage.html">Storage drivers</a></li>
|
||||
<li><a href="#storage">Storage drivers</a></li>
|
||||
<li><a href="drvnodedev.html">Node device driver</a></li>
|
||||
<li><a href="drvsecret.html">Secret driver</a></li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
@@ -35,9 +34,24 @@
|
||||
<li><strong><a href="drvvmware.html">VMware Workstation/Player</a></strong></li>
|
||||
<li><strong><a href="drvxen.html">Xen</a></strong></li>
|
||||
<li><strong><a href="drvhyperv.html">Microsoft Hyper-V</a></strong></li>
|
||||
<li><strong><a href="drvphyp.html">IBM PowerVM (phyp)</a></strong></li>
|
||||
<li><strong><a href="drvvirtuozzo.html">Virtuozzo</a></strong></li>
|
||||
<li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
|
||||
</ul>
|
||||
|
||||
<h2><a id="storage">Storage drivers</a></h2>
|
||||
|
||||
<ul>
|
||||
<li><strong><a href="storage.html#StorageBackendDir">Directory backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendFS">Local filesystem backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendNetFS">Network filesystem backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendLogical">Logical Volume Manager (LVM) backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendDisk">Disk backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendISCSI">iSCSI backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendSCSI">SCSI backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendMultipath">Multipath backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendRBD">RBD (RADOS Block Device) backend</a></strong></li>
|
||||
<li><strong><a href="storage.html#StorageBackendSheepdog">Sheepdog backend</a></strong></li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -337,9 +337,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
|
||||
Memory size has to be a multiple of 4096
|
||||
</li>
|
||||
<li>
|
||||
Number of virtual CPU has to be 1 or a multiple of 2.
|
||||
<span class="since">Since 4.10.0</span> any number of vCPUs is
|
||||
supported.
|
||||
Number of virtual CPU has to be 1 or a multiple of 2
|
||||
</li>
|
||||
<li>
|
||||
Valid MAC address prefixes are <code>00:0c:29</code> and
|
||||
|
50
docs/drvphyp.html.in
Normal file
50
docs/drvphyp.html.in
Normal file
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>IBM PowerVM hypervisor driver (phyp)</h1>
|
||||
<ul id="toc"></ul>
|
||||
<p>
|
||||
The IBM PowerVM driver can manage both HMC and IVM PowerVM
|
||||
guests. VIOS connections are tunneled through HMC.
|
||||
</p>
|
||||
|
||||
|
||||
<h2><a id="project">Project Links</a></h2>
|
||||
<ul>
|
||||
<li>
|
||||
The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM
|
||||
PowerVM</a> hypervisor
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2><a id="uri">Connections to the PowerVM driver</a></h2>
|
||||
<p>
|
||||
Some example remote connection URIs for the driver are:
|
||||
</p>
|
||||
<pre>
|
||||
phyp://user@hmc/system (HMC connection)
|
||||
phyp://user@ivm/system (IVM connection)
|
||||
</pre>
|
||||
<p>
|
||||
<strong>Note</strong>: In contrast to other drivers, the
|
||||
PowerVM (or phyp) driver is a client-side-only driver,
|
||||
internally using ssh to connect to the specified hmc or ivm
|
||||
server. Therefore, the <a href="remote.html">remote transport
|
||||
mechanism</a> provided by the remote driver and libvirtd will
|
||||
not work, and you cannot use URIs like
|
||||
<code>phyp+ssh://example.com</code>.
|
||||
</p>
|
||||
|
||||
|
||||
<h3><a id="uriformat">URI Format</a></h3>
|
||||
<p>
|
||||
URIs have this general form (<code>[...]</code> marks an
|
||||
optional part, <code>{...|...}</code> marks a mandatory choice).
|
||||
</p>
|
||||
<pre>
|
||||
phyp://[username@]{hmc|ivm}/managed_system
|
||||
</pre>
|
||||
|
||||
</body></html>
|
@@ -38,7 +38,7 @@
|
||||
<li>
|
||||
<strong>KVM hypervisor</strong>: The driver will probe <code>/usr/bin</code>
|
||||
for the presence of <code>qemu-kvm</code> and <code>/dev/kvm</code> device
|
||||
node. If both are found, then KVM fully virtualized, hardware accelerated
|
||||
node. If both are found, then KVM fullyvirtualized, hardware accelerated
|
||||
guests will be available.
|
||||
</li>
|
||||
</ul>
|
||||
@@ -63,105 +63,6 @@ qemu+tcp://example.com/system (remote access, SASl/Kerberos)
|
||||
qemu+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||
</pre>
|
||||
|
||||
<h3><a id="uriembedded">Embedded driver</a></h3>
|
||||
|
||||
<p>
|
||||
Since 6.1.0 the QEMU driver has experimental support for operating
|
||||
in an embedded mode. In this scenario, rather than connecting to
|
||||
the libvirtd daemon, the QEMU driver runs in the client application
|
||||
process directly. To use this the client application must have
|
||||
registered & be running an instance of the event loop. To open
|
||||
the driver in embedded mode the app use the new URI path and specify
|
||||
a virtual root directory under which the driver will create content.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
qemu:///embed?root=/some/dir
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Broadly speaking the range of functionality is intended to be
|
||||
on a par with that seen when using the traditional system or
|
||||
session libvirt connections to QEMU. The features will of course
|
||||
differ depending on whether the application using the embedded
|
||||
driver is running privileged or unprivileged. For example PCI
|
||||
device assignment or TAP based networking are only available
|
||||
when running privileged. While the embedded mode is still classed
|
||||
as experimental some features may change their default settings
|
||||
between releases.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
By default if the application uses any APIs associated with
|
||||
secondary drivers, these will result in a connection being
|
||||
opened to the corresponding driver in libvirtd. For example,
|
||||
this allows a virtual machine from the embedded QEMU to connect
|
||||
its NIC to a virtual network or connect its disk to a storage
|
||||
volume. Some of the secondary drivers will also be able to support
|
||||
running in embedded mode. Currently this is supported by the
|
||||
secrets driver, to allow for use of VMs with encrypted disks
|
||||
</p>
|
||||
|
||||
<h4><a id="embedTree">Directory tree</a></h4>
|
||||
|
||||
<p>
|
||||
Under the specified root directory the following locations will
|
||||
be used
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
/some/dir
|
||||
|
|
||||
+- log
|
||||
| |
|
||||
| +- qemu
|
||||
| +- swtpm
|
||||
|
|
||||
+- etc
|
||||
| |
|
||||
| +- qemu
|
||||
| +- pki
|
||||
| |
|
||||
| +- qemu
|
||||
|
|
||||
+- run
|
||||
| |
|
||||
| +- qemu
|
||||
| +- swtpm
|
||||
|
|
||||
+- cache
|
||||
| |
|
||||
| +- qemu
|
||||
|
|
||||
+- lib
|
||||
|
|
||||
+- qemu
|
||||
+- swtpm
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Note that UNIX domain sockets used for QEMU virtual machines had
|
||||
a maximum filename length of 108 characters. Bear this in mind
|
||||
when picking a root directory to avoid risk of exhausting the
|
||||
filename space. The application is responsible for recursively
|
||||
purging the contents of this directory tree once they no longer
|
||||
require a connection, though it can also be left intact for reuse
|
||||
when opening a future connection.
|
||||
</p>
|
||||
|
||||
<h4><a id="embedAPI">API usage with event loop</a></h4>
|
||||
|
||||
<p>
|
||||
To use the QEMU driver in embedded mode the application must
|
||||
register an event loop with libvirt. Many of the QEMU driver
|
||||
API calls will rely on the event loop processing data. With this
|
||||
in mind, applications must <strong>NEVER</strong> invoke API
|
||||
calls from the event loop thread itself, only other threads.
|
||||
Not following this rule will lead to deadlocks in the API.
|
||||
This restriction is intended to be lifted in a future release
|
||||
of libvirt, once QMP processing moves to a dedicated thread.
|
||||
</p>
|
||||
|
||||
<h2><a id="security">Driver security architecture</a></h2>
|
||||
|
||||
<p>
|
||||
@@ -286,29 +187,41 @@ chmod o+x /path/to/directory
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The libvirt maintainers <strong>strongly recommend against</strong>
|
||||
running QEMU as the root user/group. This should not be required
|
||||
in most supported usage scenarios, as libvirt will generally do the
|
||||
right thing to grant QEMU access to files it is permitted to
|
||||
use when it is running non-root.
|
||||
</p>
|
||||
|
||||
<h3><a id="securitycap">Linux process capabilities</a></h3>
|
||||
|
||||
<p>
|
||||
In versions of libvirt prior to 6.0.0, even if QEMU was configured
|
||||
to run as the root user / group, libvirt would strip all process
|
||||
capabilities. This meant that QEMU could only read/write files
|
||||
owned by root, or with open permissions. In reality, stripping
|
||||
capabilities did not have any security benefit, as it was trivial
|
||||
to get commands to run in another context with full capabilities,
|
||||
for example, by creating a cronjob.
|
||||
The libvirt QEMU driver has a build time option allowing it to use
|
||||
the <a href="http://people.redhat.com/sgrubb/libcap-ng/index.html">libcap-ng</a>
|
||||
library to manage process capabilities. If this build option is
|
||||
enabled, then the QEMU driver will use this to ensure that all
|
||||
process capabilities are dropped before executing a QEMU virtual
|
||||
machine. Process capabilities are what gives the 'root' account
|
||||
its high power, in particular the CAP_DAC_OVERRIDE capability
|
||||
is what allows a process running as 'root' to access files owned
|
||||
by any user.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Thus since 6.0.0, if QEMU is running as root, it will keep all
|
||||
process capabilities. Behaviour when QEMU is running non-root
|
||||
is unchanged, it still has no capabilities.
|
||||
If the QEMU driver is configured to run virtual machines as non-root,
|
||||
then they will already lose all their process capabilities at time
|
||||
of startup. The Linux capability feature is thus aimed primarily at
|
||||
the scenario where the QEMU processes are running as root. In this
|
||||
case, before launching a QEMU virtual machine, libvirtd will use
|
||||
libcap-ng APIs to drop all process capabilities. It is important
|
||||
for administrators to note that this implies the QEMU process will
|
||||
<strong>only</strong> be able to access files owned by root, and
|
||||
not files owned by any other user.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Thus, if a vendor / distributor has configured their libvirt package
|
||||
to run as 'qemu' by default, a number of changes will be required
|
||||
before an administrator can change a host to run guests as root.
|
||||
In particular it will be necessary to change ownership on the
|
||||
directories <code>/var/run/libvirt/qemu/</code>,
|
||||
<code>/var/lib/libvirt/qemu/</code> and
|
||||
<code>/var/cache/libvirt/qemu/</code> back to root, in addition
|
||||
to changing the <code>/etc/libvirt/qemu.conf</code> settings.
|
||||
</p>
|
||||
|
||||
<h3><a id="securityselinux">SELinux basic confinement</a></h3>
|
||||
@@ -439,8 +352,7 @@ chmod o+x /path/to/directory
|
||||
<p>
|
||||
While users can define their own AppArmor profile scheme, a typical
|
||||
configuration will include a profile for <code>/usr/sbin/libvirtd</code>,
|
||||
<code>/usr/lib/libvirt/virt-aa-helper</code> or
|
||||
<code>/usr/libexec/virt-aa-helper</code>(a helper program which the
|
||||
<code>/usr/lib/libvirt/virt-aa-helper</code> (a helper program which the
|
||||
libvirtd daemon uses instead of manipulating AppArmor directly), and
|
||||
an abstraction to be included by <code>/etc/apparmor.d/libvirt/TEMPLATE</code>
|
||||
(typically <code>/etc/apparmor.d/abstractions/libvirt-qemu</code>).
|
||||
@@ -464,7 +376,7 @@ chmod o+x /path/to/directory
|
||||
<h3><a id="securityacl">Cgroups device ACLs</a></h3>
|
||||
|
||||
<p>
|
||||
Linux kernels have a capability known as "cgroups" which is used
|
||||
Recent Linux kernels have a capability known as "cgroups" which is used
|
||||
for resource management. It is implemented via a number of "controllers",
|
||||
each controller covering a specific task/functional area. One of the
|
||||
available controllers is the "devices" controller, which is able to
|
||||
@@ -514,10 +426,6 @@ mount -t cgroup none /dev/cgroup -o devices
|
||||
|
||||
<h3><a id="xmlimport">Converting from QEMU args to domain XML</a></h3>
|
||||
|
||||
<p>
|
||||
<b>Note:</b> this operation is <span class="removed"> deleted as of
|
||||
5.5.0</span> and will return an error.
|
||||
</p>
|
||||
<p>
|
||||
The <code>virsh domxml-from-native</code> provides a way to
|
||||
convert an existing set of QEMU args into a guest description
|
||||
@@ -531,17 +439,82 @@ mount -t cgroup none /dev/cgroup -o devices
|
||||
examples) or by manually crafting XML to pass to virsh.
|
||||
</p>
|
||||
|
||||
<pre>$ cat > demo.args <<EOF
|
||||
LC_ALL=C PATH=/bin HOME=/home/test USER=test \
|
||||
LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 \
|
||||
-nographic -monitor pty -no-acpi -boot c -hda \
|
||||
/dev/HostVG/QEMUGuest1 -net none -serial none \
|
||||
-parallel none -usb
|
||||
EOF
|
||||
|
||||
$ virsh domxml-from-native qemu-argv demo.args
|
||||
<domain type='qemu'>
|
||||
<uuid>00000000-0000-0000-0000-000000000000</uuid>
|
||||
<memory>219136</memory>
|
||||
<currentMemory>219136</currentMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<disk type='block' device='disk'>
|
||||
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||
<target dev='hda' bus='ide'/>
|
||||
</disk>
|
||||
</devices>
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<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>
|
||||
|
||||
<p>
|
||||
The <code>virsh domxml-to-native</code> provides a way to convert a
|
||||
guest description using libvirt Domain XML, into a set of QEMU args
|
||||
that can be run manually. Note that currently the command line formatted
|
||||
by libvirt is no longer suited for manually running qemu as the
|
||||
configuration expects various resources and open file descriptors passed
|
||||
to the process which are usually prepared by libvirtd.
|
||||
that can be run manually.
|
||||
</p>
|
||||
|
||||
<pre>$ cat > demo.xml <<EOF
|
||||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
<memory>219200</memory>
|
||||
<currentMemory>219200</currentMemory>
|
||||
<vcpu>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<disk type='block' device='disk'>
|
||||
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||
<target dev='hda' bus='ide'/>
|
||||
</disk>
|
||||
</devices>
|
||||
</domain>
|
||||
EOF
|
||||
|
||||
$ virsh domxml-to-native qemu-argv demo.xml
|
||||
LC_ALL=C PATH=/usr/bin:/bin HOME=/home/test \
|
||||
USER=test LOGNAME=test /usr/bin/qemu -S -M pc \
|
||||
-no-kqemu -m 214 -smp 1 -name QEMUGuest1 -nographic \
|
||||
-monitor pty -no-acpi -boot c -drive \
|
||||
file=/dev/HostVG/QEMUGuest1,if=ide,index=0 -net none \
|
||||
-serial none -parallel none -usb
|
||||
</pre>
|
||||
|
||||
<h2><a id="qemucommand">Pass-through of arbitrary qemu
|
||||
commands</a></h2>
|
||||
|
||||
@@ -566,8 +539,7 @@ mount -t cgroup none /dev/cgroup -o devices
|
||||
qemu guest (<span class="since">Since 0.8.3</span>),
|
||||
and <code>virDomainQemuAttach</code>, for registering a qemu
|
||||
domain that was manually started so that it can then be managed
|
||||
by libvirtd (<span class="since">Since 0.9.4</span>,
|
||||
<span class="removed">removed as of 5.5.0</span>).
|
||||
by libvirtd (<span class="since">Since 0.9.4</span>).
|
||||
</p>
|
||||
<p>Additionally, the following XML additions allow fine-tuning of
|
||||
the command line given to qemu when starting a domain
|
||||
@@ -608,36 +580,6 @@ mount -t cgroup none /dev/cgroup -o devices
|
||||
<qemu:env name='QEMU_ENV' value='VAL'/>
|
||||
</qemu:commandline>
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<h2><a id="xmlnsfeatures">QEMU feature configuration for testing</a></h2>
|
||||
|
||||
<p>
|
||||
In some cases e.g. when developing a new feature or for testing it may
|
||||
be required to control a given qemu feature (or qemu capability) to test
|
||||
it before it's complete or disable it for debugging purposes.
|
||||
<span class="since">Since 5.5.0</span> it's possible to use the same
|
||||
special qemu namespace as above
|
||||
(<code>http://libvirt.org/schemas/domain/qemu/1.0</code>) and use
|
||||
<code><qemu:capabilities></code> element to add
|
||||
(<code><qemu:add capability="capname"/></code>) or remove
|
||||
(<code><qemu:del capability="capname"/></code>) capability bits.
|
||||
The naming of the feature bits is the same libvirt uses in the status
|
||||
XML. Note that this feature is meant for experiments only and should
|
||||
_not_ be used in production.
|
||||
</p>
|
||||
|
||||
<p>Example:</p><pre>
|
||||
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
|
||||
<name>testvm</name>
|
||||
|
||||
[...]
|
||||
|
||||
<qemu:capabilities>
|
||||
<qemu:add capability='blockdev'/>
|
||||
<qemu:del capability='drive'/>
|
||||
</qemu:capabilities>
|
||||
</domain>
|
||||
</pre>
|
||||
|
||||
<h2><a id="xmlconfig">Example domain XML config</a></h2>
|
||||
|
@@ -1,82 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Secret information management</h1>
|
||||
|
||||
<p>
|
||||
The secrets driver in libvirt provides a simple interface for
|
||||
storing and retrieving secret information.
|
||||
</p>
|
||||
|
||||
<h2><a id="uris">Connections to SECRET driver</a></h2>
|
||||
|
||||
<p>
|
||||
The libvirt SECRET driver is a multi-instance driver, providing a single
|
||||
system wide privileged driver (the "system" instance), and per-user
|
||||
unprivileged drivers (the "session" instance). A connection to the secret
|
||||
driver is automatically available when opening a connection to one of the
|
||||
stateful primary hypervisor drivers. It is none the less also possible to
|
||||
explicitly open just the secret driver, using the URI protocol "secret"
|
||||
Some example connection URIs for the driver are:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
secret:///session (local access to per-user instance)
|
||||
secret+unix:///session (local access to per-user instance)
|
||||
|
||||
secret:///system (local access to system instance)
|
||||
secret+unix:///system (local access to system instance)
|
||||
secret://example.com/system (remote access, TLS/x509)
|
||||
secret+tcp://example.com/system (remote access, SASl/Kerberos)
|
||||
secret+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||
</pre>
|
||||
|
||||
<h3><a id="uriembedded">Embedded driver</a></h3>
|
||||
|
||||
<p>
|
||||
Since 6.1.0 the secret driver has experimental support for operating
|
||||
in an embedded mode. In this scenario, rather than connecting to
|
||||
the libvirtd daemon, the secret driver runs in the client application
|
||||
process directly. To open the driver in embedded mode the app use the
|
||||
new URI path and specify a virtual root directory under which the
|
||||
driver will create content.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
secret:///embed?root=/some/dir
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Under the specified root directory the following locations will
|
||||
be used
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
/some/dir
|
||||
|
|
||||
+- etc
|
||||
| |
|
||||
| +- secrets
|
||||
|
|
||||
+- run
|
||||
|
|
||||
+- secrets
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
The application is responsible for recursively purging the contents
|
||||
of this directory tree once they no longer require a connection,
|
||||
though it can also be left intact for reuse when opening a future
|
||||
connection.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The range of functionality is intended to be on a par with that
|
||||
seen when using the traditional system or session libvirt connections
|
||||
to QEMU. Normal practice would be to open the secret driver in embedded
|
||||
mode any time one of the other drivers is opened in embedded mode so
|
||||
that the two drivers can interact in-process.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@@ -58,7 +58,8 @@ xen+ssh://root@example.com/system (remote access, SSH tunnelled)
|
||||
original Xen virtual machine config format used by the legacy
|
||||
xm/xend toolstack. The second, known as <code>xen-sxpr</code>,
|
||||
is also one of the original formats that was used by xend's
|
||||
legacy HTTP RPC service (<span class='removed'>removed in 5.6.0</span>)
|
||||
legacy HTTP RPC service. For compatibility, import and export
|
||||
of these legacy formats is supported by the libxl driver.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
@@ -17,7 +17,6 @@
|
||||
<li><a href="formatdomain.html">Domains</a></li>
|
||||
<li><a href="formatnetwork.html">Networks</a></li>
|
||||
<li><a href="formatnwfilter.html">Network filtering</a></li>
|
||||
<li><a href="formatnetworkport.html">Network ports</a></li>
|
||||
<li><a href="formatstorage.html">Storage</a></li>
|
||||
<li><a href="formatstorageencryption.html">Storage encryption</a></li>
|
||||
<li><a href="formatcaps.html">Capabilities</a></li>
|
||||
@@ -26,8 +25,6 @@
|
||||
<li><a href="formatnode.html">Node devices</a></li>
|
||||
<li><a href="formatsecret.html">Secrets</a></li>
|
||||
<li><a href="formatsnapshot.html">Snapshots</a></li>
|
||||
<li><a href="formatcheckpoint.html">Checkpoints</a></li>
|
||||
<li><a href="formatbackup.html">Backup jobs</a></li>
|
||||
</ul>
|
||||
|
||||
<h2>Command line validation</h2>
|
||||
|
@@ -1,184 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Backup XML format</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<h2><a id="BackupAttributes">Backup XML</a></h2>
|
||||
|
||||
<p>
|
||||
Creating a backup, whether full or incremental, is done
|
||||
via <code>virDomainBackupBegin()</code>, which takes an XML
|
||||
description of the actions to perform, as well as an optional
|
||||
second XML document <a href="formatcheckpoint.html">describing a
|
||||
checkpoint</a> to create at the same point in time. See
|
||||
also <a href="domainstatecapture.html">a comparison</a> between
|
||||
the various state capture APIs.
|
||||
</p>
|
||||
<p>
|
||||
There are two general modes for backups: a push mode (where the
|
||||
hypervisor writes out the data to the destination file, which
|
||||
may be local or remote), and a pull mode (where the hypervisor
|
||||
creates an NBD server that a third-party client can then read as
|
||||
needed, and which requires the use of temporary storage,
|
||||
typically local, until the backup is complete).
|
||||
</p>
|
||||
<p>
|
||||
The instructions for beginning a backup job are provided as
|
||||
attributes and elements of the
|
||||
top-level <code>domainbackup</code> element. This element
|
||||
includes an optional attribute <code>mode</code> which can be
|
||||
either "push" or "pull" (default
|
||||
push). <code>virDomainBackupGetXMLDesc()</code> can be used to
|
||||
see the actual values selected for elements omitted during
|
||||
creation (for example, learning which port the NBD server is
|
||||
using in the pull model or what file names libvirt generated
|
||||
when none were supplied). The following child elements and attributes
|
||||
are supported:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>incremental</code></dt>
|
||||
<dd>An optional element giving the name of an existing
|
||||
checkpoint of the domain, which will be used to make this
|
||||
backup an incremental one. In the push model, only changes
|
||||
since the named checkpoint are written to the destination. In
|
||||
the pull model, the NBD server uses the
|
||||
NBD_OPT_SET_META_CONTEXT extension to advertise to the client
|
||||
which portions of the export contain changes since the named
|
||||
checkpoint. If omitted, a full backup is performed.
|
||||
</dd>
|
||||
<dt><code>server</code></dt>
|
||||
<dd>Present only for a pull mode backup. Contains the same
|
||||
attributes as
|
||||
the <a href="formatdomain.html#elementsDisks"><code>protocol</code>
|
||||
element of a disk</a> attached via NBD in the domain (such as
|
||||
transport, socket, name, port, or tls), necessary to set up an
|
||||
NBD server that exposes the content of each disk at the time
|
||||
the backup is started.
|
||||
</dd>
|
||||
<dt><code>disks</code></dt>
|
||||
<dd>An optional listing of instructions for disks participating
|
||||
in the backup (if omitted, all disks participate and libvirt
|
||||
attempts to generate filenames by appending the current
|
||||
timestamp as a suffix). If the entire element was omitted on
|
||||
input, then all disks participate in the backup, otherwise,
|
||||
only the disks explicitly listed which do not also
|
||||
use <code>backup='no'</code> will participate. On output, this
|
||||
is the state of each of the domain's disk in relation to the
|
||||
backup operation.
|
||||
<dl>
|
||||
<dt><code>disk</code></dt>
|
||||
<dd>This sub-element describes the backup properties of a
|
||||
specific disk, with the following attributes and child
|
||||
elements:
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>A mandatory attribute which must match
|
||||
the <code><target dev='name'/></code>
|
||||
of one of
|
||||
the <a href="formatdomain.html#elementsDisks">disk
|
||||
devices</a> specified for the domain at the time of
|
||||
the checkpoint.</dd>
|
||||
<dt><code>backup</code></dt>
|
||||
<dd>Setting this attribute to <code>yes</code>(default) specifies
|
||||
that the disk should take part in the backup and using
|
||||
<code>no</code> excludes the disk from the backup.</dd>
|
||||
<dt><code>exportname</code></dt>
|
||||
<dd>Allows modification of the NBD export name for the given disk.
|
||||
By default equal to disk target.
|
||||
Valid only for pull mode backups.</dd>
|
||||
<dt><code>exportbitmap</code></dt>
|
||||
<dd>Allows modification of the name of the bitmap describing dirty
|
||||
blocks for an incremental backup exported via NBD export name
|
||||
for the given disk.
|
||||
Valid only for pull mode backups.</dd>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>A mandatory attribute to describe the type of the
|
||||
disk, except when <code>backup='no'</code> is
|
||||
used. Valid values include <code>file</code>,
|
||||
<code>block</code>, or <code>network</code>.
|
||||
Similar to a disk declaration for a domain, the choice of type
|
||||
controls what additional sub-elements are needed to describe
|
||||
the destination (such as <code>protocol</code> for a
|
||||
network destination).</dd>
|
||||
<dt><code>target</code></dt>
|
||||
<dd>Valid only for push mode backups, this is the
|
||||
primary sub-element that describes the file name of
|
||||
the backup destination, similar to
|
||||
the <code>source</code> sub-element of a domain
|
||||
disk. An optional sub-element <code>driver</code> can
|
||||
also be used, with an attribute <code>type</code> to
|
||||
specify a destination format different from
|
||||
qcow2. </dd>
|
||||
<dt><code>scratch</code></dt>
|
||||
<dd>Valid only for pull mode backups, this is the
|
||||
primary sub-element that describes the file name of
|
||||
the local scratch file to be used in facilitating the
|
||||
backup, and is similar to the <code>source</code>
|
||||
sub-element of a domain disk. Currently only <code>file</code>
|
||||
and <code>block</code> scratch storage is supported. The
|
||||
<code>file</code> scratch file is created and deleted by
|
||||
libvirt in the given location. A <code>block</code> scratch
|
||||
device must exist prior to starting the backup and is formatted.
|
||||
The block device must have enough space for the corresponding
|
||||
disk data including format overhead.
|
||||
|
||||
If <code>VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL</code> flag is
|
||||
used the file for a scratch of <code>file</code> type must
|
||||
exist with the correct format and size to hold the copy and is
|
||||
used without modification. The file is not deleted after the
|
||||
backup but the contents of the file don't make sense outside
|
||||
of the backup. The same applies for the block device which
|
||||
must be formatted appropriately.</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2><a id="example">Examples</a></h2>
|
||||
|
||||
<p>Use <code>virDomainBackupBegin()</code> to perform a full
|
||||
backup using push mode. The example lets libvirt pick the
|
||||
destination and format for 'vda', fully specifies that we want a
|
||||
raw backup of 'vdb', and omits 'vdc' from the operation.
|
||||
</p>
|
||||
<pre>
|
||||
<domainbackup>
|
||||
<disks>
|
||||
<disk name='vda' backup='yes'/>
|
||||
<disk name='vdb' type='file'>
|
||||
<target file='/path/to/vdb.backup'/>
|
||||
<driver type='raw'/>
|
||||
</disk>
|
||||
<disk name='vdc' backup='no'/>
|
||||
</disks>
|
||||
</domainbackup>
|
||||
</pre>
|
||||
|
||||
<p>If the previous full backup also passed a parameter describing
|
||||
<a href="formatcheckpoint.html">checkpoint XML</a> that resulted
|
||||
in a checkpoint named <code>1525889631</code>, we can make
|
||||
another call to <code>virDomainBackupBegin()</code> to perform
|
||||
an incremental backup of just the data changed since that
|
||||
checkpoint, this time using the following XML to start a pull
|
||||
model export of the 'vda' and 'vdb' disks, where a third-party
|
||||
NBD client connecting to '/path/to/server' completes the backup
|
||||
(omitting 'vdc' from the explicit list has the same effect as
|
||||
the backup='no' from the previous example):
|
||||
</p>
|
||||
<pre>
|
||||
<domainbackup mode="pull">
|
||||
<incremental>1525889631</incremental>
|
||||
<server transport="unix" socket="/path/to/server"/>
|
||||
<disks>
|
||||
<disk name='vda' backup='yes' type='file'>
|
||||
<scratch file='/path/to/file1.scratch'/>
|
||||
</disk>
|
||||
</disks>
|
||||
</domainbackup>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@@ -173,7 +173,7 @@
|
||||
</features>
|
||||
<model>core2duo</model>
|
||||
<vendor>Intel</vendor>
|
||||
<topology sockets="1" dies="1" cores="2" threads="1"/>
|
||||
<topology sockets="1" cores="2" threads="1"/>
|
||||
<feature name="lahf_lm"/>
|
||||
<feature name='xtpr'/>
|
||||
...
|
||||
|
@@ -1,198 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Checkpoint XML format</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<h2><a id="CheckpointAttributes">Checkpoint XML</a></h2>
|
||||
|
||||
<p>
|
||||
One method of capturing domain disk backups is via the use of
|
||||
incremental backups. Right now, incremental backups are only
|
||||
supported for the QEMU hypervisor when using qcow2 disks at the
|
||||
active layer; if other disk formats are in use, capturing disk
|
||||
backups requires different libvirt APIs
|
||||
(see <a href="kbase/domainstatecapture.html">domain state
|
||||
capture</a> for a comparison between APIs).
|
||||
</p>
|
||||
<p>
|
||||
Libvirt is able to facilitate incremental backups by tracking
|
||||
disk checkpoints, which are points in time against which it is
|
||||
easy to compute which portion of the disk has changed. Given a
|
||||
full backup (a backup created from the creation of the disk to a
|
||||
given point in time), coupled with the creation of a disk
|
||||
checkpoint at that time, and an incremental backup (a backup
|
||||
created from just the dirty portion of the disk between the
|
||||
first checkpoint and the second backup operation), it is
|
||||
possible to do an offline reconstruction of the state of the
|
||||
disk at the time of the second backup without having to copy as
|
||||
much data as a second full backup would require. Most disk
|
||||
checkpoints are created in conjunction with a backup
|
||||
via <code>virDomainBackupBegin()</code>, although a future API
|
||||
addition of <code>virDomainSnapshotCreateXML2()</code> will also
|
||||
make this possible when creating external snapshots; however,
|
||||
libvirt also exposes enough support to create disk checkpoints
|
||||
independently from a backup operation
|
||||
via <code>virDomainCheckpointCreateXML()</code> <span class="since">since
|
||||
5.6.0</span>. Likewise, the creation of checkpoints when
|
||||
external snapshots exist is currently forbidden, although future
|
||||
work will make it possible to integrate these two concepts.
|
||||
</p>
|
||||
<p>
|
||||
Attributes of libvirt checkpoints are stored as child elements
|
||||
of the <code>domaincheckpoint</code> element. At checkpoint
|
||||
creation time, normally only
|
||||
the <code>name</code>, <code>description</code>,
|
||||
and <code>disks</code> elements are settable. The rest of the
|
||||
fields are ignored on creation and will be filled in by libvirt
|
||||
in for informational purposes
|
||||
by <code>virDomainCheckpointGetXMLDesc()</code>. However, when
|
||||
redefining a checkpoint, with
|
||||
the <code>VIR_DOMAIN_CHECKPOINT_CREATE_REDEFINE</code> flag
|
||||
of <code>virDomainCheckpointCreateXML()</code>, all of the XML
|
||||
fields described here are relevant on input, even the fields
|
||||
that are normally described as readonly for output.
|
||||
</p>
|
||||
<p>
|
||||
The top-level <code>domaincheckpoint</code> element may contain
|
||||
the following elements:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>The optional name for this checkpoint. If the name is
|
||||
omitted, libvirt will create a name based on the time of the
|
||||
creation.
|
||||
</dd>
|
||||
<dt><code>description</code></dt>
|
||||
<dd>An optional human-readable description of the checkpoint.
|
||||
If the description is omitted when initially creating the
|
||||
checkpoint, then this field will be empty.
|
||||
</dd>
|
||||
<dt><code>disks</code></dt>
|
||||
<dd>On input, this is an optional listing of specific
|
||||
instructions for disk checkpoints; it is needed when making a
|
||||
checkpoint on only a subset of the disks associated with a
|
||||
domain. In particular, since QEMU checkpoints require qcow2
|
||||
disks, this element may be needed on input for excluding guest
|
||||
disks that are not in qcow2 format. If the entire element was
|
||||
omitted on input, then all disks participate in the
|
||||
checkpoint, otherwise, only the disks explicitly listed which
|
||||
do not also use <code>checkpoint='no'</code> will
|
||||
participate. On output, this is the checkpoint state of each
|
||||
of the domain's disks.
|
||||
<dl>
|
||||
<dt><code>disk</code></dt>
|
||||
<dd>This sub-element describes the checkpoint properties of
|
||||
a specific disk with the following attributes:
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>A mandatory attribute which must match either
|
||||
the <code><target dev='name'/></code> or an
|
||||
unambiguous <code><source file='name'/></code>
|
||||
of one of
|
||||
the <a href="formatdomain.html#elementsDisks">disk
|
||||
devices</a> specified for the domain at the time of
|
||||
the checkpoint.</dd>
|
||||
<dt><code>checkpoint</code></dt>
|
||||
<dd>An optional attribute; possible values
|
||||
are <code>no</code> when the disk does not participate
|
||||
in this checkpoint; or <code>bitmap</code> if the disk
|
||||
will track all changes since the creation of this
|
||||
checkpoint via a bitmap.</dd>
|
||||
<dt><code>bitmap</code></dt>
|
||||
<dd>The attribute <code>bitmap</code> is only valid
|
||||
if <code>checkpoint='bitmap'</code>; it describes the
|
||||
name of the tracking bitmap (defaulting to the
|
||||
checkpoint name).</dd>
|
||||
<dt><code>size</code></dt>
|
||||
<dd>The attribute <code>size</code> is ignored on input;
|
||||
on output, it is only present if
|
||||
the <code>VIR_DOMAIN_CHECKPOINT_XML_SIZE</code> flag
|
||||
was used to perform a dynamic query of the estimated
|
||||
size in bytes of the changes made since the checkpoint
|
||||
was created.</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dt><code>creationTime</code></dt>
|
||||
<dd>A readonly representation of the time this checkpoint was
|
||||
created. The time is specified in seconds since the Epoch,
|
||||
UTC (i.e. Unix time).
|
||||
</dd>
|
||||
<dt><code>parent</code></dt>
|
||||
<dd>Readonly, present if this checkpoint has a parent. The
|
||||
parent name is given by the sub-element <code>name</code>. The
|
||||
parent relationship allows tracking a list of related checkpoints.
|
||||
</dd>
|
||||
<dt><code>domain</code></dt>
|
||||
<dd>A readonly representation of the
|
||||
inactive <a href="formatdomain.html">domain configuration</a>
|
||||
at the time the checkpoint was created. This element may be
|
||||
omitted for output brevity by supplying
|
||||
the <code>VIR_DOMAIN_CHECKPOINT_XML_NO_DOMAIN</code> flag, but
|
||||
the resulting XML is no longer viable for use with
|
||||
the <code>VIR_DOMAIN_CHECKPOINT_CREATE_REDEFINE</code> flag
|
||||
of <code>virDomainCheckpointCreateXML()</code>. The domain
|
||||
will have security-sensitive information omitted unless the
|
||||
flag <code>VIR_DOMAIN_CHECKPOINT_XML_SECURE</code> is provided
|
||||
on a read-write connection.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h2><a id="example">Examples</a></h2>
|
||||
|
||||
<p>Using this XML to create a checkpoint of just vda on a qemu
|
||||
domain with two disks and a prior checkpoint:</p>
|
||||
<pre>
|
||||
<domaincheckpoint>
|
||||
<description>Completion of updates after OS install</description>
|
||||
<disks>
|
||||
<disk name='vda' checkpoint='bitmap'/>
|
||||
<disk name='vdb' checkpoint='no'/>
|
||||
</disks>
|
||||
</domaincheckpoint></pre>
|
||||
|
||||
<p>will result in XML similar to this from
|
||||
<code>virDomainCheckpointGetXMLDesc()</code>:</p>
|
||||
<pre>
|
||||
<domaincheckpoint>
|
||||
<name>1525889631</name>
|
||||
<description>Completion of updates after OS install</description>
|
||||
<parent>
|
||||
<name>1525111885</name>
|
||||
</parent>
|
||||
<creationTime>1525889631</creationTime>
|
||||
<disks>
|
||||
<disk name='vda' checkpoint='bitmap' bitmap='1525889631'/>
|
||||
<disk name='vdb' checkpoint='no'/>
|
||||
</disks>
|
||||
<domain type='qemu'>
|
||||
<name>fedora</name>
|
||||
<uuid>93a5c045-6457-2c09-e56c-927cdf34e178</uuid>
|
||||
<memory>1048576</memory>
|
||||
...
|
||||
<devices>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2'/>
|
||||
<source file='/path/to/file1'/>
|
||||
<target dev='vda' bus='virtio'/>
|
||||
</disk>
|
||||
<disk type='file' device='disk' snapshot='external'>
|
||||
<driver name='qemu' type='raw'/>
|
||||
<source file='/path/to/file2'/>
|
||||
<target dev='vdb' bus='virtio'/>
|
||||
</disk>
|
||||
...
|
||||
</devices>
|
||||
</domain>
|
||||
</domaincheckpoint></pre>
|
||||
|
||||
<p>With that checkpoint created, the qcow2 image is now tracking
|
||||
all changes that occur in the image since the checkpoint via
|
||||
the persistent bitmap named <code>1525889631</code>.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@@ -128,7 +128,7 @@
|
||||
|
||||
<pre>
|
||||
...
|
||||
<os firmware='efi'>
|
||||
<os firmware='uefi'>
|
||||
<type>hvm</type>
|
||||
<loader readonly='yes' secure='no' type='rom'>/usr/lib/xen/boot/hvmloader</loader>
|
||||
<nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/nvram/guest_VARS.fd</nvram>
|
||||
@@ -159,10 +159,7 @@
|
||||
For more information refer to firmware metadata specification as
|
||||
described in <code>docs/interop/firmware.json</code> in QEMU
|
||||
repository. Regular users do not need to bother.
|
||||
<span class="since">Since 5.2.0 (QEMU and KVM only)</span><br/>
|
||||
For VMware guests, this is set to <code>efi</code> when the guest
|
||||
uses UEFI, and it is not set when using BIOS.
|
||||
<span class="since">Since 5.3.0 (VMware ESX and Workstation/Player)</span>
|
||||
<span class="since">Since 5.2.0 (QEMU and KVM only)</span>
|
||||
</dd>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>The content of the <code>type</code> element specifies the
|
||||
@@ -175,11 +172,7 @@
|
||||
and <a id="attributeOSTypeMachine"><code>machine</code></a> referring
|
||||
to the machine type. The <a href="formatcaps.html">Capabilities XML</a>
|
||||
provides details on allowed values for
|
||||
these. If <code>arch</code> is omitted then for most hypervisor
|
||||
drivers, the host native arch will be chosen. For the <code>test</code>,
|
||||
<code>ESX</code> and <code>VMWare</code> hypervisor drivers, however,
|
||||
the <code>i686</code> arch will always be chosen even on an
|
||||
<code>x86_64</code> host. <span class="since">Since 0.0.1</span></dd>
|
||||
these. <span class="since">Since 0.0.1</span></dd>
|
||||
<dt><a id="elementLoader"><code>loader</code></a></dt>
|
||||
<dd>The optional <code>loader</code> tag refers to a firmware blob,
|
||||
which is specified by absolute path,
|
||||
@@ -367,8 +360,7 @@
|
||||
<dd>The <code>table</code> element contains a fully-qualified path
|
||||
to the ACPI table. The <code>type</code> attribute contains the
|
||||
ACPI table type (currently only <code>slic</code> is supported)
|
||||
<span class="since">Since 1.3.5 (QEMU)</span>
|
||||
<span class="since">Since 5.9.0 (Xen)</span></dd>
|
||||
<span class="since">Since 1.3.5 (QEMU only)</span></dd>
|
||||
</dl>
|
||||
|
||||
<h4><a id="elementsOSContainer">Container boot</a></h4>
|
||||
@@ -943,22 +935,16 @@
|
||||
<span class="since">Only QEMU driver support since 2.1.0</span>
|
||||
</dd>
|
||||
|
||||
<dt><code>vcpusched</code>, <code>iothreadsched</code>
|
||||
and <code>emulatorsched</code></dt>
|
||||
<dt><code>vcpusched</code> and <code>iothreadsched</code></dt>
|
||||
<dd>
|
||||
The optional
|
||||
<code>vcpusched</code>, <code>iothreadsched</code>
|
||||
and <code>emulatorsched</code> elements specify the scheduler type
|
||||
(values <code>batch</code>, <code>idle</code>, <code>fifo</code>,
|
||||
<code>rr</code>) for particular vCPU, IOThread and emulator threads
|
||||
respecively. For <code>vcpusched</code> and <code>iothreadsched</code>
|
||||
the attributes <code>vcpus</code> and <code>iothreads</code> select
|
||||
which vCPUs/IOThreads this setting applies to, leaving them out sets the
|
||||
default. The element <code>emulatorsched</code> does not have that
|
||||
attribute. Valid <code>vcpus</code> values start at 0 through one less
|
||||
than the number of vCPU's defined for the
|
||||
domain. Valid <code>iothreads</code> values are described in
|
||||
the <code>iothreadids</code>
|
||||
The optional <code>vcpusched</code> elements specifies the scheduler
|
||||
type (values <code>batch</code>, <code>idle</code>, <code>fifo</code>,
|
||||
<code>rr</code>) for particular vCPU/IOThread threads (based on
|
||||
<code>vcpus</code> and <code>iothreads</code>, leaving out
|
||||
<code>vcpus</code>/<code>iothreads</code> sets the default). Valid
|
||||
<code>vcpus</code> values start at 0 through one less than the
|
||||
number of vCPU's defined for the domain. Valid <code>iothreads</code>
|
||||
values are described in the <code>iothreadids</code>
|
||||
<a href="#elementsIOThreadsAllocation"><code>description</code></a>.
|
||||
If no <code>iothreadids</code> are defined, then libvirt numbers
|
||||
IOThreads from 1 to the number of <code>iothreads</code> available
|
||||
@@ -967,7 +953,6 @@
|
||||
well (and is ignored for non-real-time ones). The value range
|
||||
for the priority depends on the host kernel (usually 1-99).
|
||||
<span class="since">Since 1.2.13</span>
|
||||
<code>emulatorsched</code> <span class="since">since 5.3.0</span>
|
||||
</dd>
|
||||
|
||||
<dt><code>cachetune</code><span class="since">Since 4.1.0</span></dt>
|
||||
@@ -1470,7 +1455,7 @@
|
||||
<cpu match='exact'>
|
||||
<model fallback='allow'>core2duo</model>
|
||||
<vendor>Intel</vendor>
|
||||
<topology sockets='1' dies='1' cores='2' threads='1'/>
|
||||
<topology sockets='1' cores='2' threads='1'/>
|
||||
<cache level='3' mode='emulate'/>
|
||||
<feature policy='disable' name='lahf_lm'/>
|
||||
</cpu>
|
||||
@@ -1479,7 +1464,7 @@
|
||||
<pre>
|
||||
<cpu mode='host-model'>
|
||||
<model fallback='forbid'/>
|
||||
<topology sockets='1' dies='1' cores='2' threads='1'/>
|
||||
<topology sockets='1' cores='2' threads='1'/>
|
||||
</cpu>
|
||||
...</pre>
|
||||
|
||||
@@ -1498,7 +1483,7 @@
|
||||
<pre>
|
||||
...
|
||||
<cpu>
|
||||
<topology sockets='1' dies='1' cores='2' threads='1'/>
|
||||
<topology sockets='1' cores='2' threads='1'/>
|
||||
</cpu>
|
||||
...</pre>
|
||||
|
||||
@@ -1595,8 +1580,8 @@
|
||||
hand, the ABI provided to the guest is reproducible. During
|
||||
migration, complete CPU model definition is transferred to the
|
||||
destination host so the migrated guest will see exactly the same CPU
|
||||
model for the running instance of the guest, even if the destination
|
||||
host contains more capable CPUs or newer kernel; but shutting down and restarting
|
||||
model even if the destination host contains more capable CPUs for
|
||||
the running instance of the guest; but shutting down and restarting
|
||||
the guest may present different hardware to the guest according to
|
||||
the capabilities of the new host. Prior to libvirt 3.2.0 and QEMU
|
||||
2.9.0 detection of the host CPU model via QEMU is not supported.
|
||||
@@ -1630,10 +1615,10 @@
|
||||
environment cannot be reproduced on different hardware. Thus, if you
|
||||
hit any bugs, you are on your own. Further details of that CPU can
|
||||
be changed using <code>feature</code> elements. Migration of a guest
|
||||
using host-passthrough is dangerous if the source and destination hosts
|
||||
are not identical in both hardware, QEMU version, microcode version
|
||||
and configuration. If such a migration is attempted then the guest may
|
||||
hang or crash upon resuming execution on the destination host.</dd>
|
||||
using host-passthrough is dangerous if the source and destination
|
||||
hosts are not identical in both hardware and configuration. If such
|
||||
a migration is attempted then the guest may hang or crash upon
|
||||
resuming execution on the destination host.</dd>
|
||||
</dl>
|
||||
|
||||
Both <code>host-model</code> and <code>host-passthrough</code> modes
|
||||
@@ -1673,15 +1658,13 @@
|
||||
|
||||
<dt><code>topology</code></dt>
|
||||
<dd>The <code>topology</code> element specifies requested topology of
|
||||
virtual CPU provided to the guest. Four attributes, <code>sockets</code>,
|
||||
<code>dies</code>, <code>cores</code>, and <code>threads</code>,
|
||||
accept non-zero positive integer values. They refer to the total number
|
||||
of CPU sockets, number of dies per socket, number of cores per die, and
|
||||
number of threads per core, respectively. The <code>dies</code>
|
||||
attribute is optional and will default to 1 if omitted, while the other
|
||||
attributes are all mandatory. Hypervisors may require that the maximum
|
||||
number of vCPUs specified by the <code>cpus</code> element equals to
|
||||
the number of vcpus resulting from the topology.</dd>
|
||||
virtual CPU provided to the guest. Three non-zero values have to be
|
||||
given for <code>sockets</code>, <code>cores</code>, and
|
||||
<code>threads</code>: total number of CPU sockets, number of cores per
|
||||
socket, and number of threads per core, respectively. Hypervisors may
|
||||
require that the maximum number of vCPUs specified by the
|
||||
<code>cpus</code> element equals to the number of vcpus resulting
|
||||
from the topology.</dd>
|
||||
|
||||
<dt><code>feature</code></dt>
|
||||
<dd>The <code>cpu</code> element can contain zero or more
|
||||
@@ -1966,7 +1949,7 @@
|
||||
<span class="since">Since 3.9.0</span>, the lifecycle events can
|
||||
be configured via the
|
||||
<a href="html/libvirt-libvirt-domain.html#virDomainSetLifecycleAction">
|
||||
<code>virDomainSetLifecycleAction</code></a> API.
|
||||
<code>virDomainSetLifecycleAction</code></a> API.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -2040,9 +2023,6 @@
|
||||
<vpindex state='on'/>
|
||||
<runtime state='on'/>
|
||||
<synic state='on'/>
|
||||
<stimer state='on'>
|
||||
<direct state='on'/>
|
||||
</stimer>
|
||||
<reset state='on'/>
|
||||
<vendor_id state='on' value='KVM Hv'/>
|
||||
<frequencies state='on'/>
|
||||
@@ -2050,10 +2030,10 @@
|
||||
<tlbflush state='on'/>
|
||||
<ipi state='on'/>
|
||||
<evmcs state='on'/>
|
||||
<msrs unknown='ignore'/>
|
||||
</hyperv>
|
||||
<kvm>
|
||||
<hidden state='on'/>
|
||||
<hint-dedicated state='on'/>
|
||||
</kvm>
|
||||
<pvspinlock state='on'/>
|
||||
<gic version='2'/>
|
||||
@@ -2066,8 +2046,6 @@
|
||||
<tseg unit='MiB'>48</tseg>
|
||||
</smm>
|
||||
<htm state='on'/>
|
||||
<ccf-assist state='on'/>
|
||||
<msrs unknown='ignore'/>
|
||||
</features>
|
||||
...</pre>
|
||||
|
||||
@@ -2153,15 +2131,15 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>synic</td>
|
||||
<td>Enable Synthetic Interrupt Controller (SynIC)</td>
|
||||
<td>Enable Synthetic Interrupt Controller (SyNIC)</td>
|
||||
<td>on, off</td>
|
||||
<td><span class="since">1.3.3 (QEMU 2.6)</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>stimer</td>
|
||||
<td>Enable SynIC timers, optionally with Direct Mode support</td>
|
||||
<td>on, off; direct - on,off</td>
|
||||
<td><span class="since">1.3.3 (QEMU 2.6), direct mode 5.7.0 (QEMU 4.1)</span></td>
|
||||
<td>Enable SyNIC timers</td>
|
||||
<td>on, off</td>
|
||||
<td><span class="since">1.3.3 (QEMU 2.6)</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>reset</td>
|
||||
@@ -2228,12 +2206,6 @@
|
||||
<td>on, off</td>
|
||||
<td><span class="since">1.2.8 (QEMU 2.1.0)</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>hint-dedicated</td>
|
||||
<td>Allows a guest to enable optimizations when running on dedicated vCPUs</td>
|
||||
<td>on, off</td>
|
||||
<td><span class="since">5.7.0 (QEMU 2.12.0)</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
</dd>
|
||||
<dt><code>pmu</code></dt>
|
||||
@@ -2365,14 +2337,6 @@
|
||||
will not be ignored.
|
||||
<span class="since">Since 5.1.0</span> (bhyve only)
|
||||
</dd>
|
||||
<dt><code>ccf-assist</code></dt>
|
||||
<dd>Configure ccf-assist (Count Cache Flush Assist) availability for
|
||||
pSeries guests.
|
||||
Possible values for the <code>state</code> attribute
|
||||
are <code>on</code> and <code>off</code>. If the attribute is not
|
||||
defined, the hypervisor default will be used.
|
||||
<span class="since">Since 5.9.0</span> (QEMU/KVM only)
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a id="elementsTime">Time keeping</a></h3>
|
||||
@@ -2465,10 +2429,8 @@
|
||||
being modified, and can be one of
|
||||
"platform" (currently unsupported),
|
||||
"hpet" (libxl, xen, qemu), "kvmclock" (qemu),
|
||||
"pit" (qemu), "rtc" (qemu), "tsc" (libxl, qemu -
|
||||
<span class="since">since 3.2.0</span>), "hypervclock"
|
||||
(qemu - <span class="since">since 1.2.2</span>) or
|
||||
"armvtimer" (qemu - <span class="since">since 6.1.0</span>).
|
||||
"pit" (qemu), "rtc" (qemu), "tsc" (libxl) or "hypervclock"
|
||||
(qemu - <span class="since">since 1.2.2</span>).
|
||||
|
||||
The <code>hypervclock</code> timer adds support for the
|
||||
reference time counter and the reference page for iTSC
|
||||
@@ -2487,36 +2449,26 @@
|
||||
<p>
|
||||
The <code>tickpolicy</code> attribute determines what
|
||||
happens when QEMU misses a deadline for injecting a
|
||||
tick to the guest. This can happen, for example, because the
|
||||
guest was paused.
|
||||
tick to the guest:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>delay</code></dt>
|
||||
<dd>Continue to deliver ticks at the normal rate. The guest OS
|
||||
will not notice anything is amiss, as from its point of view
|
||||
time will have continued to flow normally. The time in the
|
||||
guest should now be behind the time in the host by exactly
|
||||
the amount of time during which ticks have been missed.</dd>
|
||||
<dd>Continue to deliver ticks at the normal rate.
|
||||
The guest time will be delayed due to the late
|
||||
tick</dd>
|
||||
<dt><code>catchup</code></dt>
|
||||
<dd>Deliver ticks at a higher rate to catch up with the missed
|
||||
ticks. The guest OS will not notice anything is amiss, as
|
||||
from its point of view time will have continued to flow
|
||||
normally. Once the timer has managed to catch up with all
|
||||
the missing ticks, the time in the guest and in the host
|
||||
should match.</dd>
|
||||
<dd>Deliver ticks at a higher rate to catch up
|
||||
with the missed tick. The guest time should
|
||||
not be delayed once catchup is complete.</dd>
|
||||
<dt><code>merge</code></dt>
|
||||
<dd>Merge the missed tick(s) into one tick and
|
||||
inject. The guest time may be delayed, depending
|
||||
on how the OS reacts to the merging of ticks</dd>
|
||||
<dt><code>discard</code></dt>
|
||||
<dd>Throw away the missed ticks and continue with future
|
||||
injection normally. The guest OS will see the timer jump
|
||||
ahead by a potentially quite significant amount all at once,
|
||||
as if the intervening chunk of time had simply not existed;
|
||||
needless to say, such a sudden jump can easily confuse a
|
||||
guest OS which is not specifically prepared to deal with it.
|
||||
Assuming the guest OS can deal correctly with the time jump,
|
||||
the time in the guest and in the host should now match.</dd>
|
||||
<dd>Throw away the missed tick(s) and continue
|
||||
with future injection normally. The guest time
|
||||
may be delayed, unless the OS has explicit
|
||||
handling of lost ticks</dd>
|
||||
</dl>
|
||||
<p>If the policy is "catchup", there can be further details in
|
||||
the <code>catchup</code> sub-element.</p>
|
||||
@@ -2888,13 +2840,9 @@
|
||||
<disk type='block' device='lun'>
|
||||
<driver name='qemu' type='raw'/>
|
||||
<source dev='/dev/sda'>
|
||||
<slices>
|
||||
<slice type='storage' offset='12345' size='123'/>
|
||||
</slices>
|
||||
<reservations managed='no'>
|
||||
<source type='unix' path='/path/to/qemu-pr-helper' mode='client'/>
|
||||
</reservations>
|
||||
</source>
|
||||
<target dev='sda' bus='scsi'/>
|
||||
<address type='drive' controller='0' bus='0' target='3' unit='0'/>
|
||||
</disk>
|
||||
@@ -2964,13 +2912,6 @@
|
||||
</backingStore>
|
||||
<target dev='vdd' bus='virtio'/>
|
||||
</disk>
|
||||
<disk type='nvme' device='disk'>
|
||||
<driver name='qemu' type='raw'/>
|
||||
<source type='pci' managed='yes' namespace='1'>
|
||||
<address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||
</source>
|
||||
<target dev='vde' bus='virtio'/>
|
||||
</disk>
|
||||
</devices>
|
||||
...</pre>
|
||||
|
||||
@@ -2984,8 +2925,7 @@
|
||||
Valid values are "file", "block",
|
||||
"dir" (<span class="since">since 0.7.5</span>),
|
||||
"network" (<span class="since">since 0.8.7</span>), or
|
||||
"volume" (<span class="since">since 1.0.5</span>), or
|
||||
"nvme" (<span class="since">since 6.0.0</span>)
|
||||
"volume" (<span class="since">since 1.0.5</span>)
|
||||
and refer to the underlying source for the disk.
|
||||
<span class="since">Since 0.0.3</span>
|
||||
</dd>
|
||||
@@ -3168,43 +3108,6 @@
|
||||
<span class="since">Since 1.0.5</span>
|
||||
</p>
|
||||
</dd>
|
||||
<dt><code>nvme</code></dt>
|
||||
<dd>
|
||||
To specify disk source for NVMe disk the <code>source</code>
|
||||
element has the following attributes:
|
||||
<dl>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>The type of address specified in <code>address</code>
|
||||
sub-element. Currently, only <code>pci</code> value is
|
||||
accepted.
|
||||
</dd>
|
||||
|
||||
<dt><code>managed</code></dt>
|
||||
<dd>This attribute instructs libvirt to detach NVMe
|
||||
controller automatically on domain startup (<code>yes</code>)
|
||||
or expect the controller to be detached by system
|
||||
administrator (<code>no</code>).
|
||||
</dd>
|
||||
|
||||
<dt><code>namespace</code></dt>
|
||||
<dd>The namespace ID which should be assigned to the domain.
|
||||
According to NVMe standard, namespace numbers start from 1,
|
||||
including.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
The difference between <code><disk type='nvme'></code>
|
||||
and <code><hostdev/></code> is that the latter is plain
|
||||
host device assignment with all its limitations (e.g. no live
|
||||
migration), while the former makes hypervisor to run the NVMe
|
||||
disk through hypervisor's block layer thus enabling all
|
||||
features provided by the layer (e.g. snapshots, domain
|
||||
migration, etc.). Moreover, since the NVMe disk is unbinded
|
||||
from its PCI driver, the host kernel storage stack is not
|
||||
involved (compared to passing say <code>/dev/nvme0n1</code> via
|
||||
<code><disk type='block'></code> and therefore lower
|
||||
latencies can be achieved.
|
||||
</dd>
|
||||
</dl>
|
||||
With "file", "block", and "volume", one or more optional
|
||||
sub-elements <code>seclabel</code>, <a href="#seclabel">described
|
||||
@@ -3367,22 +3270,6 @@
|
||||
initiator IQN needed to access the source via mandatory
|
||||
attribute <code>name</code>.
|
||||
</dd>
|
||||
<dt><code>address</code></dt>
|
||||
<dd>For disk of type <code>nvme</code> this element
|
||||
specifies the PCI address of the host NVMe
|
||||
controller.
|
||||
<span class="since">Since 6.0.0</span>
|
||||
</dd>
|
||||
<dt><code>slices</code></dt>
|
||||
<dd>The <code>slices</code> element using its <code>slice</code>
|
||||
sub-elements allows configuring offset and size of either the
|
||||
location of the image format (<code>slice type='storage'</code>)
|
||||
inside the storage source or the guest data inside the image format
|
||||
container (future expansion).
|
||||
|
||||
The <code>offset</code> and <code>size</code> values are in bytes.
|
||||
<span class="since">Since 6.1.0</span>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
@@ -3421,26 +3308,15 @@
|
||||
<dt><code>backingStore</code></dt>
|
||||
<dd>
|
||||
This element describes the backing store used by the disk
|
||||
specified by sibling <code>source</code> element.
|
||||
<span class="since">Since 1.2.4.</span>
|
||||
|
||||
If the hypervisor driver does not support the
|
||||
<a href='formatdomaincaps.html#featureBackingStoreInput'>
|
||||
<code>backingStoreInput</code></a>
|
||||
(<span class='since'>Since 5.10.0</span>)
|
||||
domain feature the <code>backingStore</code> is ignored on
|
||||
input and only used for output to describe the detected
|
||||
backing chains of running domains.
|
||||
|
||||
If <code>backingStoreInput</code> is supported
|
||||
the <code>backingStore</code> is used as the backing image of
|
||||
<code>source</code> or other <code>backingStore</code> overriding
|
||||
any backing image information recorded in the image metadata.
|
||||
|
||||
An empty <code>backingStore</code> element means the sibling
|
||||
source is self-contained and is not based on any backing store.
|
||||
|
||||
For the detected backing chain information to be accurate, the
|
||||
specified by sibling <code>source</code> element. It is
|
||||
currently ignored on input and only used for output to
|
||||
describe the detected backing chains of running
|
||||
domains <span class="since">since 1.2.4</span> (although a
|
||||
future version of libvirt may start accepting chains on input,
|
||||
or output information for offline domains). An
|
||||
empty <code>backingStore</code> element means the sibling
|
||||
source is self-contained and is not based on any backing
|
||||
store. For backing chain information to be accurate, the
|
||||
backing format must be correctly specified in the metadata of
|
||||
each file of the chain (files created by libvirt satisfy this
|
||||
property, but using existing external files for snapshot or
|
||||
@@ -3939,7 +3815,7 @@
|
||||
<readonly/>
|
||||
</filesystem>
|
||||
<filesystem type='file' accessmode='passthrough'>
|
||||
<driver type='loop' format='raw'/>
|
||||
<driver name='loop' type='raw'/>
|
||||
<driver type='path' wrpolicy='immediate'/>
|
||||
<source file='/export/to/guest.img'/>
|
||||
<target dir='/import/from/host'/>
|
||||
@@ -4005,7 +3881,7 @@
|
||||
<span class="since"> (since 0.9.13)</span></dd>
|
||||
</dl>
|
||||
|
||||
The filesystem element has an optional attribute <code>accessmode</code>
|
||||
The filesystem block has an optional attribute <code>accessmode</code>
|
||||
which specifies the security mode for accessing the source
|
||||
<span class="since">(since 0.8.5)</span>. Currently this only works
|
||||
with <code>type='mount'</code> for the QEMU/KVM driver. The possible
|
||||
@@ -4190,9 +4066,9 @@
|
||||
</dd>
|
||||
<dt><code>spapr-vio</code></dt>
|
||||
<dd>On PowerPC pseries guests, devices can be assigned to the
|
||||
SPAPR-VIO bus. It has a flat 32-bit address space; by
|
||||
SPAPR-VIO bus. It has a flat 64-bit address space; by
|
||||
convention, devices are generally assigned at a non-zero
|
||||
multiple of 0x00001000, but other addresses are valid and
|
||||
multiple of 0x1000, but other addresses are valid and
|
||||
permitted by libvirt. Each address has the following
|
||||
additional attribute: <code>reg</code> (the hex value address
|
||||
of the starting register). <span class="since">Since
|
||||
@@ -4229,16 +4105,6 @@
|
||||
attributes: <code>iobase</code> and <code>irq</code>.
|
||||
<span class="since">Since 1.2.1</span>
|
||||
</dd>
|
||||
<dt><code>unassigned</code></dt>
|
||||
<dd>For PCI hostdevs, <code><address type='unassigned'/></code>
|
||||
allows the admin to include a PCI hostdev in the domain XML definition,
|
||||
without making it available for the guest. This allows for configurations
|
||||
in which Libvirt manages the device as a regular PCI hostdev,
|
||||
regardless of whether the guest will have access to it.
|
||||
<code><address type='unassigned'/></code> is an invalid address
|
||||
type for all other device types.
|
||||
<span class="since">Since 6.0.0</span>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a id="elementsVirtio">Virtio-related options</a></h4>
|
||||
@@ -4538,7 +4404,7 @@
|
||||
subelement <code><model></code> with an attribute
|
||||
<code>name</code>. The name attribute holds the name of the
|
||||
specific device that qemu is emulating (e.g. "i82801b11-bridge")
|
||||
rather than simply the class of device ("pcie-to-pci-bridge",
|
||||
rather than simply the class of device ("dmi-to-pci-bridge",
|
||||
"pci-bridge"), which is set in the controller element's
|
||||
model <b>attribute</b>. In almost all cases, you should not
|
||||
manually add a <code><model></code> subelement to a
|
||||
@@ -4727,11 +4593,11 @@
|
||||
...
|
||||
<devices>
|
||||
<controller type='pci' index='0' model='pcie-root'/>
|
||||
<controller type='pci' index='1' model='pcie-root-port'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
|
||||
<controller type='pci' index='1' model='dmi-to-pci-bridge'>
|
||||
<address type='pci' domain='0' bus='0' slot='0xe' function='0'/>
|
||||
</controller>
|
||||
<controller type='pci' index='2' model='pcie-to-pci-bridge'>
|
||||
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
|
||||
<controller type='pci' index='2' model='pci-bridge'>
|
||||
<address type='pci' domain='0' bus='1' slot='1' function='0'/>
|
||||
</controller>
|
||||
</devices>
|
||||
...</pre>
|
||||
@@ -4949,14 +4815,6 @@
|
||||
<a href="#elementsGraphics">graphical framebuffer</a> in order to
|
||||
use this attribute, currently only supported with VNC, Spice and
|
||||
egl-headless graphics devices.
|
||||
|
||||
<span class="since">Since version 5.10.0</span>, there is an optional
|
||||
<code>ramfb</code> attribute for devices with
|
||||
<code>model='vfio-pci'</code>. Supported values are either
|
||||
<code>on</code> or <code>off</code> (default is 'off'). When
|
||||
enabled, this attribute provides a memory framebuffer device to the
|
||||
guest. This framebuffer will be used as a boot display when a vgpu
|
||||
device is the primary display.
|
||||
<p>
|
||||
Note: There are also some implications on the usage of guest's
|
||||
address type depending on the <code>model</code> attribute,
|
||||
@@ -5441,14 +5299,6 @@
|
||||
information for different classes of network
|
||||
connections. <span class="since">Since 0.9.4</span>.
|
||||
</p>
|
||||
<p>
|
||||
When a guest is running an interface of type <code>network</code>
|
||||
may include a <code>portid</code> attribute. This provides the UUID
|
||||
of an associated virNetworkPortPtr object that records the association
|
||||
between the domain interface and the network. This attribute is
|
||||
read-only since port objects are create and deleted automatically
|
||||
during startup and shutdown. <span class="since">Since 5.1.0</span>
|
||||
</p>
|
||||
<p>
|
||||
Also, similar to <code>direct</code> network connections
|
||||
(described below), a connection of type <code>network</code> may
|
||||
@@ -5631,51 +5481,23 @@
|
||||
<h5><a id="elementsNICSEthernet">Generic ethernet connection</a></h5>
|
||||
|
||||
<p>
|
||||
Provides a means to use a new or existing tap device (or veth
|
||||
device pair, depening on the needs of the hypervisor driver)
|
||||
that is partially or wholly setup external to libvirt (either
|
||||
prior to the guest starting, or while the guest is being started
|
||||
via an optional script specified in the config).
|
||||
</p>
|
||||
<p>
|
||||
The name of the tap device can optionally be specified with
|
||||
the <code>dev</code> attribute of the
|
||||
<code><target></code> element. If no target dev is
|
||||
specified, libvirt will create a new standard tap device with a
|
||||
name of the pattern "vnetN", where "N" is replaced with a
|
||||
number. If a target dev is specified and that device doesn't
|
||||
exist, then a new standard tap device will be created with the
|
||||
exact dev name given. If the specified target dev does exist,
|
||||
then that existing device will be used. Usually some basic setup
|
||||
of the device is done by libvirt, including setting a MAC
|
||||
address, and the IFF_UP flag, but if the <code>dev</code> is a
|
||||
pre-existing device, and the <code>managed</code> attribute of
|
||||
the <code>target</code> element is also set to "no" (the default
|
||||
value is "yes"), even this basic setup will not be performed -
|
||||
libvirt will simply pass the device on to the hypervisor with no
|
||||
setup at all. <span class="since">Since 5.7.0</span> Using
|
||||
managed='no' with a pre-created tap device is useful because
|
||||
it permits a virtual machine managed by an unprivileged libvirtd
|
||||
to have emulated network devices based on tap devices.
|
||||
</p>
|
||||
<p>
|
||||
After creating/opening the tap device, an optional shell script
|
||||
(given in the <code>path</code> attribute of
|
||||
the <code><script></code> element) will be run; this can
|
||||
be used to do whatever extra host network integration is
|
||||
required.
|
||||
Provides a means for the administrator to execute an arbitrary script
|
||||
to connect the guest's network to the LAN. The guest will have a tun
|
||||
device created with a name of vnetN, which can also be overridden with the
|
||||
<target> element. After creating the tun device a shell script will
|
||||
be run which is expected to do whatever host network integration is
|
||||
required. By default this script is called /etc/qemu-ifup but can be
|
||||
overridden.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<devices>
|
||||
<interface type='ethernet'>
|
||||
<script path='/etc/qemu-ifup-mynet'/>
|
||||
</interface>
|
||||
<interface type='ethernet'/>
|
||||
...
|
||||
<interface type='ethernet'>
|
||||
<target dev='mytap1' managed='no'/>
|
||||
<model type='virtio'/>
|
||||
<target dev='vnet7'/>
|
||||
<script path='/etc/qemu-ifup-mynet'/>
|
||||
</interface>
|
||||
</devices>
|
||||
...</pre>
|
||||
@@ -5897,107 +5719,6 @@
|
||||
</devices>
|
||||
...</pre>
|
||||
|
||||
<h5><a id="elementsTeaming">Teaming a virtio/hostdev NIC pair</a></h5>
|
||||
|
||||
<p>
|
||||
<span class="since">Since 6.1.0 (QEMU and KVM only, requires
|
||||
QEMU 4.2.0 or newer and a guest virtio-net driver supporting
|
||||
the "failover" feature, such as the one included in Linux
|
||||
kernel 4.18 and newer)
|
||||
</span>
|
||||
The <code><teaming></code> element of two interfaces can
|
||||
be used to connect them as a team/bond device in the guest
|
||||
(assuming proper support in the hypervisor and the guest
|
||||
network driver).
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<devices>
|
||||
<interface type='network'>
|
||||
<source network='mybridge'/>
|
||||
<mac address='00:11:22:33:44:55'/>
|
||||
<model type='virtio'/>
|
||||
<teaming type='persistent'/>
|
||||
<alias name='ua-backup0'/>
|
||||
</interface>
|
||||
<interface type='network'>
|
||||
<source network='hostdev-pool'/>
|
||||
<mac address='00:11:22:33:44:55'/>
|
||||
<model type='virtio'/>
|
||||
<teaming type='transient' persistent='ua-backup0'/>
|
||||
</interface>
|
||||
</devices>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code><teaming></code> element required
|
||||
attribute <code>type</code> will be set to
|
||||
either <code>"persistent"</code> to indicate a device that
|
||||
should always be present in the domain,
|
||||
or <code>"transient"</code> to indicate a device that may
|
||||
periodically be removed, then later re-added to the domain. When
|
||||
type="transient", there should be a second attribute
|
||||
to <code><teaming></code> called <code>"persistent"</code>
|
||||
- this attribute should be set to the alias name of the other
|
||||
device in the pair (the one that has <code><teaming
|
||||
type="persistent'/></code>).
|
||||
</p>
|
||||
<p>
|
||||
In the particular case of QEMU,
|
||||
libvirt's <code><teaming></code> element is used to setup
|
||||
a virtio-net "failover" device pair. For this setup, the
|
||||
persistent device must be an interface with <code><model
|
||||
type="virtio"/></code>, and the transient device must
|
||||
be <code><interface type='hostdev'/></code>
|
||||
(or <code><interface type='network'/></code> where the
|
||||
referenced network defines a pool of SRIOV VFs). The guest will
|
||||
then have a simple network team/bond device made of the virtio
|
||||
NIC + hostdev NIC pair. In this configuration, the
|
||||
higher-performing hostdev NIC will normally be preferred for all
|
||||
network traffic, but when the domain is migrated, QEMU will
|
||||
automatically unplug the VF from the guest, and then hotplug a
|
||||
similar device once migration is completed; while migration is
|
||||
taking place, network traffic will use the virtio NIC. (Of
|
||||
course the emulated virtio NIC and the hostdev NIC must be
|
||||
connected to the same subnet for bonding to work properly).
|
||||
</p>
|
||||
<p>
|
||||
NB1: Since you must know the alias name of the virtio NIC when
|
||||
configuring the hostdev NIC, it will need to be manually set in
|
||||
the virtio NIC's configuration (as with all other manually set
|
||||
alias names, this means it must start with "ua-").
|
||||
</p>
|
||||
<p>
|
||||
NB2: Currently the only implementation of the guest OS
|
||||
virtio-net driver supporting virtio-net failover requires that
|
||||
the MAC addresses of the virtio and hostdev NIC must
|
||||
match. Since that may not always be a requirement in the future,
|
||||
libvirt doesn't enforce this limitation - it is up to the
|
||||
person/management application that is creating the configuration
|
||||
to assure the MAC addresses of the two devices match.
|
||||
</p>
|
||||
<p>
|
||||
NB3: Since the PCI addresses of the SRIOV VFs on the hosts that
|
||||
are the source and destination of the migration will almost
|
||||
certainly be different, either higher level management software
|
||||
will need to modify the <code><source></code> of the
|
||||
hostdev NIC (<code><interface type='hostdev'></code>) at
|
||||
the start of migration, or (a simpler solution) the
|
||||
configuration will need to use a libvirt "hostdev" virtual
|
||||
network that maintains a pool of such devices, as is implied in
|
||||
the example's use of the libvirt network named "hostdev-pool" -
|
||||
as long as the hostdev network pools on both hosts have the same
|
||||
name, libvirt itself will take care of allocating an appropriate
|
||||
device on both ends of the migration. Similarly the XML for the
|
||||
virtio interface must also either work correctly unmodified on
|
||||
both the source and destination of the migration (e.g. by
|
||||
connecting to the same bridge device on both hosts, or by using
|
||||
the same virtual network), or the management software must
|
||||
properly modify the interface XML during migration so that the
|
||||
virtio device remains connected to the same network segment
|
||||
before and after migration.
|
||||
</p>
|
||||
|
||||
<h5><a id="elementsNICSMulticast">Multicast tunnel</a></h5>
|
||||
|
||||
@@ -6539,37 +6260,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
traffic for that VLAN will be tagged.
|
||||
</p>
|
||||
|
||||
<h5><a id="elementPort">Isolating guests's network traffic from each other</a></h5>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<devices>
|
||||
<interface type='network'>
|
||||
<source network='default'/>
|
||||
<b><port isolated='yes'/></b>
|
||||
</interface>
|
||||
</devices>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
<span class="since">Since 6.1.0.</span> The <code>port</code>
|
||||
element property <code>isolated</code>, when set
|
||||
to <code>yes</code> (default setting is <code>no</code>) is used
|
||||
to isolate this interface's network traffic from that of other
|
||||
guest interfaces connected to the same network that also
|
||||
have <code><port isolated='yes'/></code>. This setting is
|
||||
only supported for emulated interface devices that use a
|
||||
standard tap device to connect to the network via a Linux host
|
||||
bridge. This property can be inherited from a libvirt network,
|
||||
so if all guests that will be connected to the network should be
|
||||
isolated, it is better to put the setting in the network
|
||||
configuration. (NB: this only prevents guests that
|
||||
have <code>isolated='yes'</code> from communicating with each
|
||||
other; if there is a guest on the same bridge that doesn't
|
||||
have <code>isolated='yes'</code>, even the isolated guests will
|
||||
be able to communicate with it.)
|
||||
</p>
|
||||
|
||||
<h5><a id="elementLink">Modifying virtual link state</a></h5>
|
||||
<pre>
|
||||
...
|
||||
@@ -7249,7 +6939,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<model type='vga' vram='16384' heads='1'>
|
||||
<acceleration accel3d='yes' accel2d='yes'/>
|
||||
</model>
|
||||
<driver name='qemu'/>
|
||||
</video>
|
||||
</devices>
|
||||
...</pre>
|
||||
@@ -7283,11 +6972,9 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
attribute which takes the value "vga", "cirrus", "vmvga", "xen",
|
||||
"vbox", "qxl" (<span class="since">since 0.8.6</span>),
|
||||
"virtio" (<span class="since">since 1.3.0</span>),
|
||||
"gop" (<span class="since">since 3.2.0</span>),
|
||||
"bochs" (<span class="since">since 5.6.0</span>), "ramfb"
|
||||
(<span class="since">since 5.9.0</span>), or "none"
|
||||
(<span class="since">since 4.6.0</span>, depending on the hypervisor
|
||||
features available.
|
||||
"gop" (<span class="since">since 3.2.0</span>), or
|
||||
"none" (<span class="since">since 4.6.0</span>)
|
||||
depending on the hypervisor features available.
|
||||
The purpose of the type <code>none</code> is to instruct libvirt not
|
||||
to add a default video device in the guest (see the paragraph above).
|
||||
This legacy behaviour can be inconvenient in cases where GPU mediated
|
||||
@@ -7321,13 +7008,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
Attribute <code>vram64</code> (<span class="since">since 1.3.3</span>)
|
||||
extends secondary bar and makes it addressable as 64bit memory.
|
||||
</p>
|
||||
<p><span class="since">Since 5.9.0</span>, the <code>model</code>
|
||||
element may also have an optional <code>resolution</code> sub-element.
|
||||
The <code>resolution</code> element has attributes <code>x</code> and
|
||||
<code>y</code> to set the minimum resolution for the video device. This
|
||||
sub-element is valid for model types "vga", "qxl", "bochs", and
|
||||
"virtio".
|
||||
</p>
|
||||
</dd>
|
||||
|
||||
<dt><code>acceleration</code></dt>
|
||||
@@ -7342,12 +7022,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<dd>Enable 3D acceleration (for vbox driver
|
||||
<span class="since">since 0.7.1</span>, qemu driver
|
||||
<span class="since">since 1.3.0</span>)</dd>
|
||||
|
||||
<dt><code>rendernode</code></dt>
|
||||
<dd>Absolute path to a host's DRI device to be used for
|
||||
rendering (for 'vhostuser' driver only, <span
|
||||
class="since">since 5.8.0</span>). If none is specified,
|
||||
libvirt will pick one available.</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
@@ -7364,16 +7038,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<dd>
|
||||
The subelement <code>driver</code> can be used to tune the device:
|
||||
<dl>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>
|
||||
Specify the backend driver to use, either "qemu" or
|
||||
"vhostuser" depending on the hypervisor features available
|
||||
(<span class="since">since 5.8.0</span>). "qemu" is the
|
||||
default QEMU backend. "vhostuser" will use a separate
|
||||
vhost-user process backend (for <code>virtio</code>
|
||||
device).
|
||||
</dd>
|
||||
<dt>virtio options</dt>
|
||||
<dt>virtio options</dt>
|
||||
<dd>
|
||||
<a href="#elementsVirtio">Virtio-specific options</a> can also be
|
||||
set (<span class="since">Since 3.5.0</span>)
|
||||
@@ -7565,10 +7230,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<span class="since">since 4.7.0</span>, <code>16550a</code> (usable
|
||||
with the <code>system-serial</code> target type);
|
||||
<code>sclpconsole</code> and <code>sclplmconsole</code> (usable with
|
||||
the <code>sclp-serial</code> target type). Providing a target model is
|
||||
usually unnecessary: libvirt will automatically pick one that's suitable
|
||||
for the chosen target type, and overriding that value is generally not
|
||||
recommended.
|
||||
the <code>sclp-serial</code> target type).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -7714,8 +7376,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
for early boot logging / interactive / recovery use, and one
|
||||
paravirtualized serial console to be used eg. as a side channel. Most
|
||||
people will be fine with having just the first <code>console</code>
|
||||
element in their configuration, but if a specific configuration is
|
||||
desired then both elements should be specified.
|
||||
element in their configuration.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -8419,8 +8080,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<source mode='bind' service='1234'/>
|
||||
<source mode='connect' host='1.2.3.4' service='1234'/>
|
||||
</backend>
|
||||
<!-- OR -->
|
||||
<backend model='builtin'/>
|
||||
</rng>
|
||||
</devices>
|
||||
...
|
||||
@@ -8485,14 +8144,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
for more information.
|
||||
</p>
|
||||
</dd>
|
||||
<dt><code>builtin</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
This backend uses qemu builtin random generator, which uses
|
||||
<code>getrandom()</code> syscall as the source of entropy.
|
||||
(<span class="since">Since 6.1.0 and QEMU 4.2</span>)
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dt><code>driver</code></dt>
|
||||
@@ -8543,9 +8194,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
TPM functionality for each VM. QEMU talks to it over a Unix socket. With
|
||||
the emulator device type each guest gets its own private TPM.
|
||||
<span class="since">'emulator' since 4.5.0</span>
|
||||
The state of the TPM emulator can be encrypted by providing an
|
||||
<code>encryption</code> element.
|
||||
<span class="since">'encryption' since 5.6.0</span>
|
||||
</p>
|
||||
<p>
|
||||
Example: usage of the TPM Emulator
|
||||
@@ -8555,7 +8203,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<devices>
|
||||
<tpm model='tpm-tis'>
|
||||
<backend type='emulator' version='2.0'>
|
||||
<encryption secret='6dd3e4a5-1d76-44ce-961f-f119f5aad935'/>
|
||||
</backend>
|
||||
</tpm>
|
||||
</devices>
|
||||
@@ -8567,13 +8214,10 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<p>
|
||||
The <code>model</code> attribute specifies what device
|
||||
model QEMU provides to the guest. If no model name is provided,
|
||||
<code>tpm-tis</code> will automatically be chosen for non-PPC64
|
||||
architectures.
|
||||
<code>tpm-tis</code> will automatically be chosen.
|
||||
<span class="since">Since 4.4.0</span>, another available choice
|
||||
is the <code>tpm-crb</code>, which should only be used when the
|
||||
backend device is a TPM 2.0. <span class="since">Since 6.1.0</span>,
|
||||
pSeries guests on PPC64 are supported and the default is
|
||||
<code>tpm-spapr</code>.
|
||||
backend device is a TPM 2.0.
|
||||
</p>
|
||||
</dd>
|
||||
<dt><code>backend</code></dt>
|
||||
@@ -8621,14 +8265,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<li>'2.0' : creates a TPM 2.0</li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dt><code>encryption</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
The <code>encryption</code> element allows the state of a TPM emulator
|
||||
to be encrypted. The <code>secret</code> must reference a secret object
|
||||
that holds the passphrase from which the encryption key will be derived.
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h4><a id="elementsNVRAM">NVRAM device</a></h4>
|
||||
@@ -8645,7 +8281,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
...
|
||||
<devices>
|
||||
<nvram>
|
||||
<address type='spapr-vio' reg='0x00003000'/>
|
||||
<address type='spapr-vio' reg='0x3000'/>
|
||||
</nvram>
|
||||
</devices>
|
||||
...
|
||||
@@ -8826,6 +8462,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<memory model='nvdimm'>
|
||||
<source>
|
||||
<path>/tmp/nvdimm</path>
|
||||
<alignsize unit='KiB'>2048</alignsize>
|
||||
</source>
|
||||
<target>
|
||||
<size unit='KiB'>524288</size>
|
||||
@@ -8836,10 +8473,9 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<readonly/>
|
||||
</target>
|
||||
</memory>
|
||||
<memory model='nvdimm' access='shared'>
|
||||
<memory model='nvdimm'>
|
||||
<source>
|
||||
<path>/dev/dax0.0</path>
|
||||
<alignsize unit='KiB'>2048</alignsize>
|
||||
<pmem/>
|
||||
</source>
|
||||
<target>
|
||||
@@ -8873,8 +8509,6 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
module basis. Values are the same as
|
||||
<a href="#elementsMemoryBacking">Memory Backing</a>:
|
||||
<code>shared</code> and <code>private</code>.
|
||||
For <code>nvdimm</code> model, if using real NVDIMM DAX device as
|
||||
backend, <code>shared</code> is required.
|
||||
</p>
|
||||
</dd>
|
||||
|
||||
@@ -8938,8 +8572,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
alignment used to mmap the address range for the backend
|
||||
<code>path</code>. If not supplied the host page size is used.
|
||||
For example, to mmap a real NVDIMM device a 2M-aligned page may
|
||||
be required, and host page size is 4KB, then we need to set this
|
||||
element to 2MB.
|
||||
be required.
|
||||
<span class="since">Since 5.0.0</span>
|
||||
</p>
|
||||
</dd>
|
||||
@@ -9032,17 +8665,14 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
<dt><code>model</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
Supported values are <code>intel</code> (for Q35 guests) and,
|
||||
<span class="since">since 5.5.0</span>, <code>smmuv3</code> (for
|
||||
ARM virt guests).
|
||||
Currently only the <code>intel</code> model is supported.
|
||||
</p>
|
||||
</dd>
|
||||
<dt><code>driver</code></dt>
|
||||
<dd>
|
||||
<p>
|
||||
The <code>driver</code> subelement can be used to configure
|
||||
additional options, some of which might only be available for
|
||||
certain IOMMU models:
|
||||
additional options:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>intremap</code></dt>
|
||||
@@ -9186,8 +8816,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
</dd>
|
||||
<dt><code>model</code></dt>
|
||||
<dd>A valid security model name, matching the currently
|
||||
activated security model. Model <code>dac</code> is not available
|
||||
when guest is run by unprivileged user.
|
||||
activated security model
|
||||
</dd>
|
||||
<dt><code>relabel</code></dt>
|
||||
<dd>Either <code>yes</code> or <code>no</code>. This must always
|
||||
@@ -9285,7 +8914,7 @@ qemu-kvm -net nic,model=? /dev/null
|
||||
|
||||
<p>Note: DEA/TDEA is synonymous with DES/TDES.</p>
|
||||
|
||||
<h3><a id="launchSecurity">Launch Security</a></h3>
|
||||
<h3><a id="sev">Launch Security</a></h3>
|
||||
|
||||
<p>
|
||||
The contents of the <code><launchSecurity type='sev'></code> element
|
||||
|
@@ -119,10 +119,6 @@
|
||||
<domainCapabilities>
|
||||
...
|
||||
<os supported='yes'>
|
||||
<enum name='firmware'>
|
||||
<value>bios</value>
|
||||
<value>efi</value>
|
||||
</enum>
|
||||
<loader supported='yes'>
|
||||
<value>/usr/share/OVMF/OVMF_CODE.fd</value>
|
||||
<enum name='type'>
|
||||
@@ -133,61 +129,29 @@
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</enum>
|
||||
<enum name='secure'>
|
||||
<value>yes</value>
|
||||
<value>no</value>
|
||||
</enum>
|
||||
</loader>
|
||||
</os>
|
||||
...
|
||||
<domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<p>The <code>firmware</code> enum corresponds to the
|
||||
<code>firmware</code> attribute of the <code>os</code> element in
|
||||
the domain XML. The presence of this enum means libvirt is capable
|
||||
of the so-called firmware auto-selection feature. And the listed
|
||||
firmware values represent the accepted input in the domain
|
||||
XML. Note that the <code>firmware</code> enum reports only those
|
||||
values for which a firmware "descriptor file" exists on the host.
|
||||
Firmware descriptor file is a small JSON document that describes
|
||||
details about a given BIOS or UEFI binary on the host, e.g. the
|
||||
fimware binary path, its architecture, supported machine types,
|
||||
NVRAM template, etc. This ensures that the reported values won't
|
||||
cause a failure on guest boot.
|
||||
</p>
|
||||
|
||||
<p>For the <code>loader</code> element, the following can occur:</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>value</code></dt>
|
||||
<dd>List of known firmware binary paths. Currently this is used
|
||||
only to advertise the known location of OVMF binaries for
|
||||
QEMU. OVMF binaries will only be listed if they actually exist on
|
||||
host.</dd>
|
||||
<dd>List of known loader paths. Currently this is only used
|
||||
to advertise known locations of OVMF binaries for qemu. Binaries
|
||||
will only be listed if they actually exist on disk.</dd>
|
||||
|
||||
<dt><code>type</code></dt>
|
||||
<dd>Whether the boot loader is a typical BIOS (<code>rom</code>)
|
||||
or a UEFI firmware (<code>pflash</code>). Each <code>value</code>
|
||||
sub-element under the <code>type</code> enum represents a possible
|
||||
value for the <code>type</code> attribute for the <loader/>
|
||||
element in the domain XML. E.g. the presence
|
||||
of <code>pfalsh</code> under the <code>type</code> enum means that
|
||||
a domain XML can use UEFI firmware via: <loader/>
|
||||
type="pflash" ...>/path/to/the/firmware/binary/</loader>.
|
||||
</dd>
|
||||
<dd>Whether loader is a typical BIOS (<code>rom</code>) or
|
||||
an UEFI binary (<code>pflash</code>). This refers to
|
||||
<code>type</code> attribute of the <loader/>
|
||||
element.</dd>
|
||||
|
||||
<dt><code>readonly</code></dt>
|
||||
<dd>Options for the <code>readonly</code> attribute of the
|
||||
<loader/> element in the domain XML.</dd>
|
||||
|
||||
<dt><code>secure</code></dt>
|
||||
<dd>Options for the <code>secure</code> attribute of the
|
||||
<loader/> element in the domain XML. Note that the
|
||||
value <code>yes</code> is listed only if libvirt detects a
|
||||
firmware descriptor file that has path to an OVMF binary that
|
||||
supports Secure boot, and lists its architecture and supported
|
||||
machine type.</dd>
|
||||
<loader/> element.</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a id="elementsCPU">CPU configuration</a></h3>
|
||||
@@ -463,42 +427,6 @@
|
||||
element.</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h4><a id="elementsRNG">RNG device</a></h4>
|
||||
<p>RNG device capabilities are exposed under the
|
||||
<code>rng</code> element. For instance:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<rng supported='yes'>
|
||||
<enum name='model'>
|
||||
<value>virtio</value>
|
||||
<value>virtio-transitional</value>
|
||||
<value>virtio-non-transitional</value>
|
||||
</enum>
|
||||
<enum name='backendModel'>
|
||||
<value>random</value>
|
||||
<value>egd</value>
|
||||
<value>builtin</value>
|
||||
</enum>
|
||||
</rng>
|
||||
...
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>model</code></dt>
|
||||
<dd>Options for the <code>model</code> attribute of the
|
||||
<rng> element.</dd>
|
||||
<dt><code>backendModel</code></dt>
|
||||
<dd>Options for the <code>model</code> attribute of the
|
||||
<rng><backend> element.</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h3><a id="elementsFeatures">Features</a></h3>
|
||||
|
||||
<p>One more set of XML elements describe the supported features and
|
||||
@@ -517,8 +445,6 @@
|
||||
</gic>
|
||||
<vmcoreinfo supported='yes'/>
|
||||
<genid supported='yes'/>
|
||||
<backingStoreInput supported='yes'/>
|
||||
<backup supported='yes'/>
|
||||
<sev>
|
||||
<cbitpos>47</cbitpos>
|
||||
<reduced-phys-bits>1</reduced-phys-bits>
|
||||
@@ -555,23 +481,6 @@
|
||||
|
||||
<p>Reports whether the genid feature can be used by the domain.</p>
|
||||
|
||||
<h4><a id="featureBackingStoreInput">backingStoreInput</a></h4>
|
||||
|
||||
<p>Reports whether the hypervisor will obey the <backingStore>
|
||||
elements configured for a <disk> when booting the guest, hotplugging
|
||||
the disk to a running guest, or similar.
|
||||
</p>
|
||||
|
||||
<h4><a id="featureBackup">backup</a></h4>
|
||||
|
||||
<p>Reports whether the hypervisor supports the backup, checkpoint, and
|
||||
related features. (<code>virDomainBackupBegin</code>,
|
||||
<code>virDomainCheckpointCreateXML</code> etc). The presence of the
|
||||
<code>backup</code> element even if <code>supported='no'</code> implies that
|
||||
the <code>VIR_DOMAIN_UNDEFINE_CHECKPOINTS_METADATA</code> flag for
|
||||
<code>virDomainUndefine</code> is supported.
|
||||
</p>
|
||||
|
||||
<h4><a id="elementsSEV">SEV capabilities</a></h4>
|
||||
|
||||
<p>AMD Secure Encrypted Virtualization (SEV) capabilities are exposed under
|
||||
@@ -582,9 +491,10 @@
|
||||
encrypted with a key unique to that VM.</p>
|
||||
|
||||
<p>
|
||||
For more details on the SEV feature, please follow resources in the
|
||||
AMD developer's document store. In order to use SEV with libvirt have
|
||||
a look at <a href="formatdomain.html#launchSecurity">SEV in domain XML</a>
|
||||
For more details on SEV feature see:
|
||||
<a href="https://support.amd.com/TechDocs/55766_SEV-KM_API_Specification.pdf">
|
||||
SEV API spec</a> and <a href="http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf">
|
||||
SEV White Paper</a>
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
|
@@ -548,10 +548,10 @@
|
||||
(<span class="since">since 0.9.4</span>). Setting
|
||||
<code>bandwidth</code> for a network is supported only
|
||||
for networks with a <code><forward></code> mode
|
||||
of <code>route</code>, <code>nat</code>, <code>bridge</code>,
|
||||
or no mode at all (i.e. an "isolated" network). Setting
|
||||
<code>bandwidth</code> is <b>not</b> supported for forward modes
|
||||
<code>passthrough</code>, <code>private</code>,
|
||||
of <code>route</code>, <code>nat</code>, or no mode at all
|
||||
(i.e. an "isolated" network). Setting <code>bandwidth</code>
|
||||
is <b>not</b> supported for forward modes
|
||||
of <code>bridge</code>, <code>passthrough</code>, <code>private</code>,
|
||||
or <code>hostdev</code>. Attempts to do this will lead to
|
||||
a failure to define the network or to create a transient network.
|
||||
</p>
|
||||
@@ -631,7 +631,7 @@
|
||||
goes through one point where QoS decisions can take place, hence
|
||||
why this attribute works only for virtual networks for now
|
||||
(that is <code><interface type='network'/></code> with a
|
||||
forward type of route, nat, open or no forward at all). Moreover, the
|
||||
forward type of route, nat, or no forward at all). Moreover, the
|
||||
virtual network the interface is connected to is required to have
|
||||
at least inbound QoS set (<code>average</code> at least). If
|
||||
using the <code>floor</code> attribute users don't need to specify
|
||||
@@ -729,31 +729,6 @@
|
||||
or <code><interface></code>.
|
||||
</p>
|
||||
|
||||
<h5><a id="elementPort">Isolating ports from one another</a></h5>
|
||||
|
||||
<pre>
|
||||
<network>
|
||||
<name>isolated-ports</name>
|
||||
<forward mode='bridge'/>
|
||||
<bridge name='br0'/>
|
||||
<port isolated='yes'/>
|
||||
</network>
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
<span class="since">Since 6.1.0.</span> The <code>port</code>
|
||||
element property <code>isolated</code>, when set
|
||||
to <code>yes</code> (default setting is <code>no</code>) is used
|
||||
to isolate the network traffic of each guest on the network from
|
||||
all other guests connected to the network; it does not have an
|
||||
effect on communication between the guests and the host, or
|
||||
between the guests and destinations beyond this network. This
|
||||
setting is only supported for networks that use a Linux host
|
||||
bridge to connect guest interfaces via a standard tap device
|
||||
(i.e. those with a forward mode of nat, route, open, bridge, or
|
||||
no forward mode).
|
||||
</p>
|
||||
|
||||
<h5><a id="elementsPortgroup">Portgroups</a></h5>
|
||||
|
||||
<pre>
|
||||
@@ -1121,28 +1096,6 @@
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a id="elementsNamespaces">Network namespaces</a></h3>
|
||||
|
||||
<p>
|
||||
A special XML namespace is available for passing options directly to the
|
||||
underlying dnsmasq configuration file. Usage of XML namespaces comes with no
|
||||
support guarantees, so use at your own risk.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This example XML will pass the option strings <code>foo=bar</code> and
|
||||
<code>cname=*.foo.example.com,master.example.com</code> directly to the
|
||||
underlying dnsmasq instance.
|
||||
<pre>
|
||||
<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
|
||||
...
|
||||
<dnsmasq:options>
|
||||
<dnsmasq:option value="foo=bar"/>
|
||||
<dnsmasq:option value="cname=*.foo.example.com,master.example.com"/>
|
||||
</dnsmasq:options>
|
||||
</network></pre>
|
||||
</p>
|
||||
|
||||
<h2><a id="examples">Example configuration</a></h2>
|
||||
|
||||
<h3><a id="examplesNAT">NAT based network</a></h3>
|
||||
|
@@ -1,223 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Network XML format</h1>
|
||||
|
||||
<ul id="toc">
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
This page provides an introduction to the network port XML format.
|
||||
This stores information about the connection between a virtual
|
||||
interface of a virtual domain, and the virtual network it is
|
||||
attached to.
|
||||
</p>
|
||||
|
||||
<h2><a id="elements">Element and attribute overview</a></h2>
|
||||
|
||||
<p>
|
||||
The root element required for all virtual network ports is
|
||||
named <code>networkport</code> and has no configurable attributes
|
||||
The network port XML format is available <span class="since">since
|
||||
5.5.0</span>
|
||||
</p>
|
||||
|
||||
<h3><a id="elementsMetadata">General metadata</a></h3>
|
||||
|
||||
<p>
|
||||
The first elements provide basic metadata about the virtual
|
||||
network port.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<networkport
|
||||
<uuid>7ae63b5f-fe96-4af0-a7c3-da04ba1b3f54</uuid>
|
||||
<owner>
|
||||
<uuid>06578fc1-c686-46fa-bc2c-220893b466a6</uuid>
|
||||
<name>myguest<name>
|
||||
</owner>
|
||||
<group>webfront<group>
|
||||
<mac address='52:54:0:7b:35:93'/>
|
||||
...</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>uuid</code></dt>
|
||||
<dd>The content of the <code>uuid</code> element provides
|
||||
a globally unique identifier for the virtual network port.
|
||||
The format must be RFC 4122 compliant, eg <code>3e3fce45-4f53-4fa7-bb32-11f34168b82b</code>.
|
||||
If omitted when defining/creating a new network port, a random
|
||||
UUID is generated.</dd>
|
||||
<dd>The <code>owner</code> node records the domain object that
|
||||
is the owner of the network port. It contains two child nodes:
|
||||
<dl>
|
||||
<dt><code>uuid</code></dt>
|
||||
<dd>The content of the <code>uuid</code> element provides
|
||||
a globally unique identifier for the virtual domain.</dd>
|
||||
<dt><code>name</code></dt>
|
||||
<dd>The unique name of the virtual domain</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
<dt><code>group</code></dt>
|
||||
<dd>The port group in the virtual network to which the
|
||||
port belongs. Can be omitted if no port groups are
|
||||
defined on the network.</dd>
|
||||
<dt><code>mac</code></dt>
|
||||
<dd>The <code>address</code> attribute provides the MAC
|
||||
address of the virtual port that will be see by the
|
||||
guest. The MAC address must not start with 0xFE as this
|
||||
byte is reserved for use on the host side of the port.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a id="elementsCommon">Common elements</a></h3>
|
||||
|
||||
<p>
|
||||
The following elements are common to one or more of the plug
|
||||
types listed later
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<bandwidth>
|
||||
<inbound average='1000' peak='5000' floor='200' burst='1024'/>
|
||||
<outbound average='128' peak='256' burst='256'/>
|
||||
</bandwidth>
|
||||
<rxfilters trustGuest='yes'/>
|
||||
<port isolated='yes'/>
|
||||
<virtualport type='802.1Qbg'>
|
||||
<parameters managerid='11' typeid='1193047' typeidversion='2'/>
|
||||
</virtualport>
|
||||
...</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>bandwidth</code></dt>
|
||||
<dd>This part of the network port XML provides setting quality of service.
|
||||
Incoming and outgoing traffic can be shaped independently.
|
||||
The <code>bandwidth</code> element and its child elements are described
|
||||
in the <a href="formatnetwork.html#elementQoS">QoS</a> section of
|
||||
the Network XML. In addition the <code>classID</code> attribute may
|
||||
exist to provide the ID of the traffic shaping class that is active.
|
||||
</dd>
|
||||
<dt><code>rxfilters</code></dt>
|
||||
<dd>The <code>rxfilters</code> element property
|
||||
<code>trustGuest</code> provides the
|
||||
capability for the host to detect and trust reports from the
|
||||
guest regarding changes to the interface mac address and receive
|
||||
filters by setting the attribute to <code>yes</code>. The default
|
||||
setting for the attribute is <code>no</code> for security
|
||||
reasons and support depends on the guest network device model as
|
||||
well as the type of connection on the host - currently it is
|
||||
only supported for the virtio device model and for macvtap
|
||||
connections on the host.
|
||||
</dd>
|
||||
<dt><code>port</code></dt>
|
||||
<dd> <span class="since">Since 6.1.0.</span>
|
||||
The <code>port</code> element property
|
||||
<code>isolated</code>, when set to <code>yes</code> (default
|
||||
setting is <code>no</code>) is used to isolate this port's
|
||||
network traffic from other ports on the same network that also
|
||||
have <code><port isolated='yes'/></code>. This setting
|
||||
is only supported for emulated network devices connected to a
|
||||
Linux host bridge via a standard tap device.
|
||||
</dd>
|
||||
<dt><code>virtualport</code></dt>
|
||||
<dd>The <code>virtualport</code> element describes metadata that
|
||||
needs to be provided to the underlying network subsystem. It
|
||||
is described in the domain XML
|
||||
<a href="formatdomain.html#elementsNICS">interface documentation</a>.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h3><a id="elementsPlug">Plugs</a></h3>
|
||||
|
||||
<p>
|
||||
The <code>plug</code> element has varying content depending
|
||||
on the value of the <code>type</code> attribute.
|
||||
</p>
|
||||
|
||||
<h4><a id="elementsPlugNetwork">Network</a></h4>
|
||||
|
||||
<p>
|
||||
The <code>network</code> plug type refers to a managed virtual
|
||||
network plug that is based on a traditional software bridge
|
||||
device privately managed by libvirt.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<plug type='network' bridge='virbr0'/>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code>bridge</code> attribute provides the name of the
|
||||
privately managed bridge device associated with the virtual
|
||||
network.
|
||||
</p>
|
||||
|
||||
<h4><a id="elementsPlugNetwork">Bridge</a></h4>
|
||||
|
||||
<p>
|
||||
The <code>bridge</code> plug type refers to an externally
|
||||
managed traditional software bridge.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<plug type='bridge' bridge='br2'/>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code>bridge</code> attribute provides the name of the
|
||||
externally managed bridge device associated with the virtual
|
||||
network.
|
||||
</p>
|
||||
|
||||
<h4><a id="elementsPlugNetwork">Direct</a></h4>
|
||||
|
||||
<p>
|
||||
The <code>direct</code> plug type refers to a connection
|
||||
directly to a physical network interface.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<plug type='direct' dev='ens3' mode='vepa'/>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code>dev</code> attribute provides the name of the
|
||||
physical network interface to which the port will be
|
||||
connected. The <code>mode</code> attribute describes
|
||||
how the connection will be setup and takes the same
|
||||
values described in the
|
||||
<a href="formatdomain.html#elementsNICSDirect">domain XML</a>.
|
||||
</p>
|
||||
|
||||
<h4><a id="elementsPlugNetwork">Host PCI</a></h4>
|
||||
|
||||
<p>
|
||||
The <code>hostdev-pci</code> plug type refers to the
|
||||
passthrough of a physical PCI device rather than emulation.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<plug type='hostdev-pci' managed='yes'>
|
||||
<driver name='vfio'/>
|
||||
<address domain='0x0001' bus='0x02' slot='0x03' function='0x4'/>
|
||||
</plug>
|
||||
...</pre>
|
||||
|
||||
<p>
|
||||
The <code>managed</code> attribute indicates who is responsible for
|
||||
managing the PCI device in the host. When set to the value <code>yes</code>
|
||||
libvirt is responsible for automatically detaching the device from host
|
||||
drivers and resetting it if needed. If the value is <code>no</code>,
|
||||
some other party must ensure the device is not attached to any
|
||||
host drivers.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -42,8 +42,8 @@
|
||||
Specifies what this secret is used for. A mandatory
|
||||
<code>type</code> attribute specifies the usage category, currently
|
||||
only <code>volume</code>, <code>ceph</code>, <code>iscsi</code>,
|
||||
<code>tls</code>, and <code>vtpm</code> are defined. Specific usage
|
||||
categories are described below.
|
||||
and <code>tls</code> are defined. Specific usage categories
|
||||
are described below.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
@@ -76,13 +76,13 @@
|
||||
<pre>
|
||||
# virsh secret-define volume-secret.xml
|
||||
Secret 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f created
|
||||
#
|
||||
# MYSECRET=`printf %s "open sesame" | base64`
|
||||
# virsh secret-set-value 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f $MYSECRET
|
||||
Secret value set
|
||||
#
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
See <a href="#settingSecrets">virsh secret-set-value</a> on how
|
||||
to set the value of the secret.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The volume type secret can be supplied either in volume XML during
|
||||
creation of a <a href="formatstorage.html#StorageVol">storage volume</a>
|
||||
@@ -103,11 +103,12 @@ Secret 0a81f5b2-8403-7b23-c8d6-21ccc2f80d6f created
|
||||
|
||||
# virsh secret-define luks-secret.xml
|
||||
Secret f52a81b2-424e-490c-823d-6bd4235bc57 created
|
||||
#
|
||||
# MYSECRET=`printf %s "letmein" | base64`
|
||||
# virsh secret-set-value f52a81b2-424e-490c-823d-6bd4235bc57 $MYSECRET
|
||||
Secret value set
|
||||
#
|
||||
</pre>
|
||||
<p>
|
||||
See <a href="#settingSecrets">virsh secret-set-value</a> on how
|
||||
to set the value of the secret.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The volume type secret can be supplied in domain XML for a luks storage
|
||||
@@ -155,11 +156,13 @@ Secret 1b40a534-8301-45d5-b1aa-11894ebb1735 created
|
||||
UUID Usage
|
||||
-----------------------------------------------------------
|
||||
1b40a534-8301-45d5-b1aa-11894ebb1735 cephx ceph_example
|
||||
#
|
||||
# CEPHPHRASE=`printf %s "pass phrase" | base64`
|
||||
# virsh secret-set-value 1b40a534-8301-45d5-b1aa-11894ebb1735 $CEPHPHRASE
|
||||
Secret value set
|
||||
|
||||
#
|
||||
</pre>
|
||||
<p>
|
||||
See <a href="#settingSecrets">virsh secret-set-value</a> on how
|
||||
to set the value of the secret.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The ceph secret can then be used by UUID or by the
|
||||
@@ -226,9 +229,7 @@ incominguser myname mysecret
|
||||
|
||||
<p>
|
||||
Next, use <code>virsh secret-define iscsi-secret.xml</code> to define
|
||||
the secret and
|
||||
<code><a href="#settingSecrets">virsh secret-set-value</a></code>
|
||||
using the generated
|
||||
the secret and <code>virsh secret-set-value</code> using the generated
|
||||
UUID value and a base64 generated secret value in order to define the
|
||||
chosen secret pass phrase. The pass phrase must match the password
|
||||
used in the iSCSI authentication configuration file.
|
||||
@@ -242,13 +243,12 @@ Secret c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 created
|
||||
-----------------------------------------------------------
|
||||
c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 iscsi libvirtiscsi
|
||||
|
||||
# MYSECRET=`printf %s "mysecret" | base64`
|
||||
# virsh secret-set-value c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 $MYSECRET
|
||||
Secret value set
|
||||
#
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
See <a href="#settingSecrets">virsh secret-set-value</a> on how
|
||||
to set the value of the secret.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The iSCSI secret can then be used by UUID or by the
|
||||
usage name via the <code><auth></code> element in a domain's
|
||||
@@ -313,101 +313,17 @@ Secret 718c71bd-67b5-4a2b-87ec-a24e8ca200dc created
|
||||
Once the secret is defined, a secret value will need to be set. The
|
||||
secret would be the passphrase used to access the TLS credentials.
|
||||
The following is a simple example of using
|
||||
<code><a href="#settingSecrets">virsh secret-set-value</a></code> to set
|
||||
the secret value. The
|
||||
<code>virsh secret-set-value</code> to set the secret value. The
|
||||
<a href="html/libvirt-libvirt-secret.html#virSecretSetValue">
|
||||
<code>virSecretSetValue</code></a> API may also be used to set
|
||||
a more secure secret without using printable/readable characters.
|
||||
</p>
|
||||
|
||||
<h3><a id="vTPMUsageType">Usage type "vtpm"</a></h3>
|
||||
|
||||
<p>
|
||||
This secret is associated with a virtualized TPM (vTPM) and serves
|
||||
as a passphrase for deriving a key from for encrypting the state
|
||||
of the vTPM.
|
||||
The <code><usage type='vtpm'></code> element must contain
|
||||
a single <code>name</code> element that specifies a usage name
|
||||
for the secret. The vTPM secret can then be used by UUID
|
||||
via the <code><encryption></code> element of
|
||||
a <a href="formatdomain.html#elementsTpm">tpm</a> when using an
|
||||
emulator.
|
||||
<span class="since">Since 5.6.0</span>. The following is an example
|
||||
of the steps to be taken. First create a vtpm-secret.xml file: </p>
|
||||
|
||||
<pre>
|
||||
# cat vtpm-secret.xml
|
||||
<secret ephemeral='no' private='yes'>
|
||||
<description>sample vTPM secret</description>
|
||||
<usage type='vtpm'>
|
||||
<name>VTPM_example</name>
|
||||
</usage>
|
||||
</secret>
|
||||
|
||||
# virsh secret-define vtpm-secret.xml
|
||||
Secret 6dd3e4a5-1d76-44ce-961f-f119f5aad935 created
|
||||
|
||||
# virsh secret-list
|
||||
UUID Usage
|
||||
----------------------------------------------------------------------------------------
|
||||
6dd3e4a5-1d76-44ce-961f-f119f5aad935 vtpm VTPM_example
|
||||
|
||||
#
|
||||
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
A secret may also be defined via the
|
||||
<a href="html/libvirt-libvirt-secret.html#virSecretDefineXML">
|
||||
<code>virSecretDefineXML</code></a> API.
|
||||
|
||||
Once the secret is defined, a secret value will need to be set. The
|
||||
secret would be the passphrase used to decrypt the vTPM state.
|
||||
The following is a simple example of using
|
||||
<code><a href="#settingSecrets">virsh secret-set-value</a></code>
|
||||
to set the secret value. The
|
||||
<a href="html/libvirt-libvirt-secret.html#virSecretSetValue">
|
||||
<code>virSecretSetValue</code></a> API may also be used to set
|
||||
a more secure secret without using printable/readable characters.
|
||||
</p>
|
||||
|
||||
<h2><a id="settingSecrets">Setting secret values in virsh</a></h2>
|
||||
|
||||
<p>
|
||||
To set the value of the secret you can use the following virsh commands.
|
||||
If the secret is a password-like string (printable characters, no newline)
|
||||
you can use:
|
||||
</p>
|
||||
<pre>
|
||||
# virsh secret-set-value --interactive 6dd3e4a5-1d76-44ce-961f-f119f5aad935
|
||||
Enter new value for secret:
|
||||
# MYSECRET=`printf %s "letmein" | base64`
|
||||
# virsh secret-set-value 718c71bd-67b5-4a2b-87ec-a24e8ca200dc $MYSECRET
|
||||
Secret value set
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Another secure option is to read the secret from a file. This way the
|
||||
secret can contain any bytes (even NUL and non-printable characters). The
|
||||
length of the secret is the length of the input file. Alternatively the
|
||||
<code>--plain</code> option can be omitted if the file contents are
|
||||
base64-encoded.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# virsh secret-set-value 6dd3e4a5-1d76-44ce-961f-f119f5aad935 --file --plain secretinfile
|
||||
Secret value set
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
<b>WARNING</b> The following approach is <b>insecure</b> and deprecated.
|
||||
The secret can also be set via an argument. Note that other users may see
|
||||
the actual secret in the process listing!
|
||||
The secret must be base64 encoded.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# MYSECRET=`printf %s "open sesame" | base64`
|
||||
# virsh secret-set-value 6dd3e4a5-1d76-44ce-961f-f119f5aad935 $MYSECRET
|
||||
Secret value set
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
|
@@ -9,9 +9,7 @@
|
||||
<h2><a id="SnapshotAttributes">Snapshot XML</a></h2>
|
||||
|
||||
<p>
|
||||
Snapshots are one form
|
||||
of <a href="kbase/domainstatecapture.html">domain state
|
||||
capture</a>. There are several types of snapshots:
|
||||
There are several types of snapshots:
|
||||
</p>
|
||||
<dl>
|
||||
<dt>disk snapshot</dt>
|
||||
@@ -93,9 +91,7 @@
|
||||
sets that snapshot as current, and the prior current snapshot is
|
||||
the parent of the new snapshot. Branches in the hierarchy can
|
||||
be formed by reverting to a snapshot with a child, then creating
|
||||
another snapshot. For now, the creation of external snapshots
|
||||
when checkpoints exist is forbidden, although future work will
|
||||
make it possible to integrate these two concepts.
|
||||
another snapshot.
|
||||
</p>
|
||||
<p>
|
||||
The top-level <code>domainsnapshot</code> element may contain
|
||||
@@ -144,8 +140,8 @@
|
||||
<dd>This sub-element describes the snapshot properties of a
|
||||
specific disk. The attribute <code>name</code> is
|
||||
mandatory, and must match either the <code><target
|
||||
dev='name'/></code> (recommended) or an unambiguous
|
||||
<code><source file='name'/></code> of one of
|
||||
dev='name'/></code> or an unambiguous <code><source
|
||||
file='name'/></code> of one of
|
||||
the <a href="formatdomain.html#elementsDisks">disk
|
||||
devices</a> specified for the domain at the time of the
|
||||
snapshot. The attribute <code>snapshot</code> is
|
||||
@@ -174,12 +170,6 @@
|
||||
snapshots, the original file name becomes the read-only
|
||||
snapshot, and the new file name contains the read-write
|
||||
delta of all disk changes since the snapshot.
|
||||
<p/>
|
||||
The <code>source</code> element also may contain the
|
||||
<code>seclabel</code> element (described in the
|
||||
<a href="formatdomain.html#seclabel">domain XML documentation</a>)
|
||||
which can be used to override the domain security labeling policy
|
||||
for <code>source</code>.
|
||||
</dd>
|
||||
<dt><code>driver</code></dt>
|
||||
<dd>An optional sub-element <code>driver</code>,
|
||||
@@ -187,7 +177,6 @@
|
||||
as qcow2), of the new file created by the external
|
||||
snapshot of the new file.
|
||||
</dd>
|
||||
<dt><code>seclabel</code></dt>
|
||||
</dl>
|
||||
|
||||
<span class="since">Since 1.2.2</span> the <code>disk</code> element
|
||||
@@ -227,9 +216,11 @@
|
||||
guest.
|
||||
</dd>
|
||||
<dt><code>parent</code></dt>
|
||||
<dd>Readonly, present only if this snapshot has a parent. The
|
||||
parent name is given by the sub-element <code>name</code>. The
|
||||
parent relationship allows tracking a tree of related snapshots.
|
||||
<dd>An optional readonly representation of the parent of this
|
||||
snapshot. If present, this element contains exactly one child
|
||||
element, <code>name</code>. This specifies the name of the
|
||||
parent snapshot of this snapshot, and is used to represent
|
||||
trees of snapshots.
|
||||
</dd>
|
||||
<dt><code>domain</code></dt>
|
||||
<dd>A readonly representation of the domain that this snapshot
|
||||
@@ -264,15 +255,10 @@
|
||||
<domainsnapshot>
|
||||
<description>Snapshot of OS install and updates</description>
|
||||
<disks>
|
||||
<disk name='vda'>
|
||||
<disk name='/path/to/old'>
|
||||
<source file='/path/to/new'/>
|
||||
</disk>
|
||||
<disk name='vdb' snapshot='no'/>
|
||||
<disk name='vdc'>
|
||||
<source file='/path/to/newc'>
|
||||
<seclabel model='dac' relabel='no'/>
|
||||
</source>
|
||||
</disk>
|
||||
</disks>
|
||||
</domainsnapshot></pre>
|
||||
|
||||
|
124
docs/genaclperms.pl
Executable file
124
docs/genaclperms.pl
Executable file
@@ -0,0 +1,124 @@
|
||||
#!/usr/bin/env perl
|
||||
#
|
||||
# Copyright (C) 2013 Red Hat, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my @objects = (
|
||||
"CONNECT", "DOMAIN", "INTERFACE",
|
||||
"NETWORK","NODE_DEVICE", "NWFILTER",
|
||||
"SECRET", "STORAGE_POOL", "STORAGE_VOL",
|
||||
);
|
||||
|
||||
my %class;
|
||||
|
||||
foreach my $object (@objects) {
|
||||
my $class = lc $object;
|
||||
|
||||
$class =~ s/(^\w|_\w)/uc $1/eg;
|
||||
$class =~ s/_//g;
|
||||
$class =~ s/Nwfilter/NWFilter/;
|
||||
$class = "vir" . $class . "Ptr";
|
||||
|
||||
$class{$object} = $class;
|
||||
}
|
||||
|
||||
my $objects = join ("|", @objects);
|
||||
|
||||
my %opts;
|
||||
my $in_opts = 0;
|
||||
|
||||
my %perms;
|
||||
|
||||
while (<>) {
|
||||
if ($in_opts) {
|
||||
if (m,\*/,) {
|
||||
$in_opts = 0;
|
||||
} elsif (/\*\s*\@(\w+):\s*(.*?)\s*$/) {
|
||||
$opts{$1} = $2;
|
||||
}
|
||||
} elsif (m,/\*\*,) {
|
||||
$in_opts = 1;
|
||||
} elsif (/VIR_ACCESS_PERM_($objects)_((?:\w|_)+),/) {
|
||||
my $object = $1;
|
||||
my $perm = lc $2;
|
||||
next if $perm eq "last";
|
||||
|
||||
$perm =~ s/_/-/g;
|
||||
|
||||
$perms{$object} = {} unless exists $perms{$object};
|
||||
$perms{$object}->{$perm} = {
|
||||
desc => $opts{desc},
|
||||
message => $opts{message},
|
||||
anonymous => $opts{anonymous}
|
||||
};
|
||||
%opts = ();
|
||||
}
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
EOF
|
||||
|
||||
foreach my $object (sort { $a cmp $b } keys %perms) {
|
||||
my $class = $class{$object};
|
||||
my $olink = lc "object_" . $object;
|
||||
print <<EOF;
|
||||
<h3><a name="$olink">$class</a></h3>
|
||||
<table class="acl">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Permission</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
EOF
|
||||
|
||||
foreach my $perm (sort { $a cmp $b } keys %{$perms{$object}}) {
|
||||
my $description = $perms{$object}->{$perm}->{desc};
|
||||
|
||||
die "missing description for $object.$perm" unless
|
||||
defined $description;
|
||||
|
||||
my $plink = lc "perm_" . $object . "_" . $perm;
|
||||
$plink =~ s/-/_/g;
|
||||
|
||||
print <<EOF;
|
||||
<tr>
|
||||
<td><a name="$plink">$perm</a></td>
|
||||
<td>$description</td>
|
||||
</tr>
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</tbody>
|
||||
</table>
|
||||
EOF
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
@@ -72,11 +72,11 @@ h6 {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
code, pre, tt {
|
||||
code, pre {
|
||||
font-family: LibvirtOverpassMono;
|
||||
}
|
||||
|
||||
dd code, p code, tt {
|
||||
dd code, p code {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
|
@@ -1,26 +0,0 @@
|
||||
# Silly mistakes, mostly found in S-o-b or R-b tags.
|
||||
|
||||
"jdenemar redhat com" jdenemar@redhat.com
|
||||
"pkrempa@redhat st.com" pkrempa@redhat.com
|
||||
berrange@localhost.localdomain berrange@redhat.com
|
||||
jyang@redhat jyang@redhat.com
|
||||
wangjie88.huawei.com wangjie88@huawei.com
|
||||
|
||||
# This is information that's already present in .mailmap, and having to
|
||||
# duplicate it is annoying. Unfortunately gitdm doesn't parse .mailmap
|
||||
# and the format is different, so we can't just point it to the file
|
||||
# either.
|
||||
|
||||
cedric.bosdonnat@free.fr cbosdonnat@suse.com
|
||||
dan@berrange.com berrange@redhat.com
|
||||
fabiano@fidencio.org fidencio@redhat.com
|
||||
intrigeri+libvirt@boum.org intrigeri@boum.org
|
||||
jim@meyering.net meyering@redhat.com
|
||||
laine@laine.org laine@redhat.com
|
||||
redhat@adrb.pl adrian.brzezinski@eo.pl
|
||||
shilei.massclouds@gmx.com shi_lei@massclouds.com
|
||||
|
||||
# This deviates from what's found in .mailmap, but it makes more sense as
|
||||
# far as gitdm is concerned since Jim was employed by Novell at the time.
|
||||
|
||||
jfehlig@linux-ypgk.site jfehlig@novell.com
|
@@ -1,11 +0,0 @@
|
||||
canonical.com
|
||||
|
||||
# Having an @ubuntu.com email address doesn't necessarily imply you're
|
||||
# a Canonical employee; these people, however, seem to have been employed
|
||||
# by Canonical at the time they contributed to libvirt.
|
||||
|
||||
jamie@ubuntu.com
|
||||
serge.hallyn@ubuntu.com
|
||||
smoser@ubuntu.com
|
||||
soren@ubuntu.com
|
||||
wgrant@ubuntu.com
|
@@ -1,2 +0,0 @@
|
||||
datto.com
|
||||
dattobackup.com
|
@@ -1,4 +0,0 @@
|
||||
dreamhost.com
|
||||
dreamhost.net
|
||||
newdream.com
|
||||
newdream.net
|
@@ -1,7 +0,0 @@
|
||||
ibm.com
|
||||
|
||||
# These IBM employees used their personal email address when contributing
|
||||
# to libvirt and we don't have the corresponding @ibm.com address on file.
|
||||
|
||||
danielhb413@gmail.com
|
||||
jcfaracco@gmail.com
|
@@ -1,2 +0,0 @@
|
||||
nec.co.jp
|
||||
nec.com
|
@@ -1,105 +0,0 @@
|
||||
6wind.com 6WIND
|
||||
cmss.chinamobile.com China Mobile
|
||||
active.by ActiveCloud
|
||||
aero.org Aerospace
|
||||
akamai.com Akamai
|
||||
amd.com AMD
|
||||
anchor.net.au Anchor
|
||||
aristanetworks.com Arista Networks
|
||||
arpnetworks.com ARP Networks
|
||||
av-test.de AV-TEST
|
||||
b1-systems.de B1 Systems
|
||||
baidu.com Baidu
|
||||
brightbox.co.uk Brightbox
|
||||
cisco.com Cisco
|
||||
citrix.com Citrix
|
||||
cloudwatt.com Cloudwatt
|
||||
codethink.co.uk Codethink
|
||||
cumulusnetworks.com Cumulus Networks
|
||||
dataductus.se Data Ductus
|
||||
datagravity.com DataGravity
|
||||
dell.com Dell
|
||||
designassembly.de Coffee-Break-Games
|
||||
diateam.net DIATEAM
|
||||
eldorado.org.br ELDORADO
|
||||
endocode.com Endocode
|
||||
eo.pl eo Networks
|
||||
ericsson.com Ericsson
|
||||
fb.com Facebook
|
||||
firewall-services.com Firewall-Services
|
||||
freescale.com Freescale
|
||||
fujitsu.com Fujitsu
|
||||
gluster.com Gluster
|
||||
gridcentric.ca Gridcentric
|
||||
h3c.com H3C
|
||||
hde.co.jp HDE
|
||||
hds.com Hitachi Data Systems
|
||||
hitachi.com Hitachi
|
||||
hoster-ok.com hoster-ok.com
|
||||
hp.com HP
|
||||
huawei.com Huawei
|
||||
hygon.cn Hygon
|
||||
inktank.com Inktank Storage
|
||||
intel.com Intel
|
||||
intellilink.co.jp NTT DATA INTELLILINK
|
||||
invisiblethingslab.com Invisible Things Lab
|
||||
jtan.com JTAN
|
||||
juniper.net Juniper Networks
|
||||
laposte.net La Poste
|
||||
le.com Le.com
|
||||
linaro.org Linaro
|
||||
linutronix.de Linutronix
|
||||
linux2go.dk Linux2Go
|
||||
liquidweb.com Liquid Web
|
||||
massclouds.com MassClouds
|
||||
mellanox.com Mellanox
|
||||
midokura.com Midokura
|
||||
mirantis.com Mirantis
|
||||
munzinger.de Munzinger Archiv
|
||||
netease.com NetEase
|
||||
netzquadrat.de [netzquadrat]
|
||||
nicira.com Nicira
|
||||
nimboxx.com NIMBOXX
|
||||
novell.com Novell
|
||||
ntt.co.jp NTT Group
|
||||
nutanix.com Nutanix
|
||||
ohmu.fi OHMU
|
||||
open-minds.org OpenThink
|
||||
oracle.com Oracle
|
||||
os-t.de OpenSource Training
|
||||
otb.bg Open Technologies Bulgaria
|
||||
outscale.com OUTSCALE
|
||||
parallels.com Parallels
|
||||
petalogix.com PetaLogix
|
||||
quobyte.com Quobyte
|
||||
ravellosystems.com Ravello Systems
|
||||
samsung.com Samsung
|
||||
sde.cz SDE
|
||||
semihalf.com Semihalf
|
||||
siemens.com Siemens
|
||||
smartjog.com SmartJog
|
||||
solarflare.com Solarflare
|
||||
ssatr.ch Swiss Satellite Radio
|
||||
sun.com Sun Microsystems
|
||||
tabit.pro Tabit
|
||||
taobao.com Taobao
|
||||
tdf.fr TDF
|
||||
tencent.com Tencent
|
||||
transip.nl TransIP
|
||||
tresys.com Tresys
|
||||
uniudc.com Tsinghua Uniudc
|
||||
univention.de Univention
|
||||
veritas.com Veritas
|
||||
vhgroup.net VHGroup
|
||||
virtualopensystems.com Virtual Open Systems
|
||||
websense.com Websense
|
||||
wiktel.com Wikstrom Telephone Company
|
||||
windriver.com Wind River
|
||||
winhong.com Winhong
|
||||
xmission.com XMission
|
||||
xs4all.nl XS4ALL
|
||||
yadro.com YADRO
|
||||
yandex.ru Yandex
|
||||
yunify.com Yunify
|
||||
zstack.io ZStack
|
||||
zte.com.cn ZTE
|
@@ -1,6 +0,0 @@
|
||||
redhat.com
|
||||
|
||||
# These Red Hat employees used their personal email address when contributing
|
||||
# to libvirt and we don't have the corresponding @redhat.com address on file.
|
||||
|
||||
lkundrak@v3.sk
|
@@ -1,7 +0,0 @@
|
||||
suse.com
|
||||
suse.de
|
||||
|
||||
# These SUSE employees used their personal email address when contributing
|
||||
# to libvirt and we don't have the corresponding @suse.com address on file.
|
||||
|
||||
olaf@aepfle.de
|
@@ -1,2 +0,0 @@
|
||||
openvz.org
|
||||
virtuozzo.com
|
@@ -1,17 +0,0 @@
|
||||
byu.net
|
||||
csiro.au
|
||||
epita.fr
|
||||
hibikino.ne.jp
|
||||
infn.it
|
||||
inria.fr
|
||||
isi.edu
|
||||
nict.go.jp
|
||||
parisdescartes.fr
|
||||
telecom-bretagne.eu
|
||||
tu-berlin.de
|
||||
tu-dresden.de
|
||||
ucla.edu
|
||||
upc.edu
|
||||
utah.edu
|
||||
uvt.ro
|
||||
wide.ad.jp
|
@@ -1,13 +0,0 @@
|
||||
alpinelinux.org
|
||||
debian.org
|
||||
fedoraproject.org
|
||||
fsf.org
|
||||
gentoo.org
|
||||
gnome.org
|
||||
gnu.org
|
||||
kernel.org
|
||||
linux.com
|
||||
openbsd.org
|
||||
salasaga.org
|
||||
samba.org
|
||||
sdf.org
|
@@ -1,88 +0,0 @@
|
||||
# These are all domains you can get a personal email address from, so it's
|
||||
# fair to assume people using such addresses are contributing in their spare
|
||||
# time rather than on behalf of their respective employers.
|
||||
|
||||
126.com
|
||||
gmail.com
|
||||
gmx.com
|
||||
gmx.de
|
||||
googlemail.com
|
||||
hotmail.com
|
||||
mail.ru
|
||||
pobox.com
|
||||
protonmail.com
|
||||
riseup.net
|
||||
web.de
|
||||
yahoo.com
|
||||
|
||||
# Same as the above, but for domains that don't generally allow random
|
||||
# people to sign up for an email address. In this case we list the email
|
||||
# addresses directly rather than just the domain, because we can't really
|
||||
# consider the domain itself one way or the other.
|
||||
|
||||
=@eater.me
|
||||
adam@pandorasboxen.com
|
||||
agx@sigxcpu.org
|
||||
alexander.nusov@nfvexpress.com
|
||||
andres@lagarcavilla.org
|
||||
andrew@interpretmath.pw
|
||||
asad.saeed@acidseed.com
|
||||
atler@pld-linux.org
|
||||
benoar@dolka.fr
|
||||
beorn@binaries.fr
|
||||
bigon@bigon.be
|
||||
bugzilla.redhat.simon@arlott.org
|
||||
cardoe@cardoe.com
|
||||
charles@dyfis.net
|
||||
d.herrendoerfer@herrendoerfer.name
|
||||
dan@danny.cz
|
||||
debfx@fobos.de
|
||||
eike@sf-mail.de
|
||||
exo@tty.sk
|
||||
fritz@fritz-elfert.de
|
||||
gene@czarc.net
|
||||
gordon@dragonsdawn.net
|
||||
gregor@kopka.net
|
||||
heathpetersen@kandre.com
|
||||
ibaldo@adinet.com.uy
|
||||
igor47@moomers.org
|
||||
infos@nafets.de
|
||||
intrigeri@boum.org
|
||||
james410@cowgill.org.uk
|
||||
james@shubin.ca
|
||||
jasper@humppa.nl
|
||||
jeremy@goop.org
|
||||
jk@ozlabs.org
|
||||
jwm@horde.net
|
||||
klaus@ethgen.de
|
||||
lacos@caesar.elte.hu
|
||||
lenaic@lhuard.fr.eu.org
|
||||
libvirt@dunquino.com
|
||||
lists@egidy.de
|
||||
marti@juffo.org
|
||||
max@rfc2324.org
|
||||
michael@ellerman.id.au
|
||||
mike@very.puzzling.org
|
||||
n0ano@n0ano.com
|
||||
neil@aldur.co.uk
|
||||
nobody@nowhere.ws
|
||||
peter@kieser.ca
|
||||
pieter@hollants.com
|
||||
raimue@codingfarm.de
|
||||
richard@nod.at
|
||||
rmy@tigress.co.uk
|
||||
ruben@rubenkerkhof.com
|
||||
rufo@rufoa.com
|
||||
slawek@kaplonski.pl
|
||||
soulxu@soulxu-thinkpad-t410.(none)
|
||||
stybla@turnovfree.net
|
||||
tai@rakugaki.org
|
||||
thomas@scripty.at
|
||||
v.tolstov@selfip.ru
|
||||
ville.skytta@iki.fi
|
||||
vincent@bernat.im
|
||||
wido@widodh.nl
|
||||
wiedi@frubar.net
|
||||
wongc-redhat@hoku.net
|
||||
xschen@tnsoft.com.cn
|
||||
yurchor@ukr.net
|
@@ -29,11 +29,11 @@
|
||||
file from zanata.</p>
|
||||
</li>
|
||||
|
||||
<li><p>The simplest way to send patches is to use the
|
||||
<a href="https://github.com/stefanha/git-publish"><code>git-publish</code></a>
|
||||
tool. All libvirt-related repositories contain a config file that
|
||||
tells git-publish to use the correct mailing list and subject prefix.</p>
|
||||
<p>Alternatively, you may send patches using <code>git send-email</code>.</p>
|
||||
<li><p>Post patches using <code>git send-email</code>, with git
|
||||
rename detection enabled. You need a one-time setup of:</p>
|
||||
<pre>
|
||||
git config diff.renames true
|
||||
</pre>
|
||||
<p>Also, for code motion patches, you may find that <code>git
|
||||
diff --patience</code> provides an easier-to-read patch.
|
||||
However, the usual workflow of libvirt developer is:</p>
|
||||
@@ -72,8 +72,8 @@
|
||||
</pre>
|
||||
<p>As a rule, patches should be sent to the mailing list only: all
|
||||
developers are subscribed to libvir-list and read it regularly, so
|
||||
<strong>please don't CC individual developers</strong> unless
|
||||
they've explicitly asked you to.</p>
|
||||
please don't CC individual developers unless they've explicitly
|
||||
asked you to.</p>
|
||||
<p>Avoid using mail clients for sending patches, as most of them
|
||||
will mangle the messages in some way, making them unusable for our
|
||||
purposes. Gmail and other Web-based mail clients are particularly
|
||||
@@ -81,11 +81,9 @@
|
||||
<p>If everything went well, your patch should show up on the
|
||||
<a href="https://www.redhat.com/archives/libvir-list/">libvir-list
|
||||
archives</a> in a matter of minutes; if you still can't find it on
|
||||
there after an hour or so, you should double-check your setup.
|
||||
<strong>Note that, if you are not already a subscriber, your very
|
||||
first post to the mailing list will be
|
||||
subject to moderation</strong>, and it's not uncommon for that to
|
||||
take around a day.</p>
|
||||
there after an hour or so, you should double-check your setup. Note
|
||||
that your very first post to the mailing list will be subject to
|
||||
moderation, and it's not uncommon for that to take around a day.</p>
|
||||
<p>Please follow this as close as you can, especially the rebase and
|
||||
<code>git send-email</code> part, as it makes life easier for other
|
||||
developers to review your patch set.</p>
|
||||
@@ -141,7 +139,14 @@
|
||||
</li>
|
||||
|
||||
<li><p>Run the automated tests on your code before submitting any changes.
|
||||
That is:
|
||||
In particular, configure with compile warnings set to
|
||||
-Werror. This is done automatically for a git checkout; from a
|
||||
tarball, use:</p>
|
||||
<pre>
|
||||
./configure --enable-werror
|
||||
</pre>
|
||||
<p>
|
||||
and run the tests:
|
||||
</p>
|
||||
<pre>
|
||||
make check
|
||||
@@ -179,13 +184,12 @@
|
||||
|
||||
<p>
|
||||
When debugging failures during development, it is possible
|
||||
to focus in on just the failing subtests by using
|
||||
VIR_TEST_RANGE. I.e. to run all tests from 3 to 20 with the
|
||||
exception of tests 6 and 16, use:
|
||||
to focus in on just the failing subtests by using TESTS and
|
||||
VIR_TEST_RANGE:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
VIR_TEST_DEBUG=1 VIR_TEST_RANGE=3-5,7-20,^16 ./run tests/qemuxml2argvtest
|
||||
make check VIR_TEST_DEBUG=1 VIR_TEST_RANGE=3-5 TESTS=qemuxml2argvtest
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -339,36 +343,6 @@
|
||||
Richard Jones' guide to working with open source projects</a>.
|
||||
</p>
|
||||
|
||||
<h2><a id="lang">Language Usage</a></h2>
|
||||
|
||||
<p>
|
||||
The libvirt repository makes use of a large number of programming
|
||||
languages. It is anticipated that in the future libvirt will adopt
|
||||
use of other new languages. To reduce the overall burden on developers,
|
||||
there is thus a general desire to phase out usage of some of the
|
||||
existing languages.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The preferred languages at this time are:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>C - for the main libvirt codebase. Dialect supported by
|
||||
GCC/CLang only.</li>
|
||||
<li>Python - for supporting build scripts / tools. Code must
|
||||
run with both version 2.7 and 3.x at this time.</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Languages that should not be used for any new contributions:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Perl - build scripts must be written in Python instead.</li>
|
||||
<li>Shell - build scripts must be written in Python instead.</li>
|
||||
</ul>
|
||||
|
||||
<h2><a id="tooling">Tooling</a></h2>
|
||||
|
||||
<p>
|
||||
@@ -852,39 +826,6 @@
|
||||
}
|
||||
</pre>
|
||||
|
||||
<h2><a id="conditions">Conditional expressions</a></h2>
|
||||
<p>For readability reasons new code should avoid shortening comparisons
|
||||
to 0 for numeric types. Boolean and pointer comparisions may be
|
||||
shortened. All long forms are okay:
|
||||
</p>
|
||||
<pre>
|
||||
virFooPtr foos = NULL;
|
||||
size nfoos = 0;
|
||||
bool hasFoos = false;
|
||||
|
||||
GOOD:
|
||||
if (!foos)
|
||||
if (!hasFoos)
|
||||
if (nfoos == 0)
|
||||
if (foos == NULL)
|
||||
if (hasFoos == true)
|
||||
|
||||
BAD:
|
||||
if (!nfoos)
|
||||
if (nfoos)
|
||||
</pre>
|
||||
<p>New code should avoid the ternary operator as much as possible.
|
||||
Specifically it must never span more than one line or nest:
|
||||
</p>
|
||||
<pre>
|
||||
BAD:
|
||||
char *foo = baz ?
|
||||
virDoSomethingReallyComplex(driver, vm, something, baz->foo) :
|
||||
NULL;
|
||||
|
||||
char *foo = bar ? bar->baz ? bar->baz->foo : "nobaz" : "nobar";
|
||||
</pre>
|
||||
|
||||
<h2><a id="preprocessor">Preprocessor</a></h2>
|
||||
|
||||
<p>Macros defined with an ALL_CAPS name should generally be
|
||||
@@ -932,7 +873,8 @@ BAD:
|
||||
type is at least four bytes wide).</li>
|
||||
<li>If a variable has boolean semantics, give it the <code>bool</code> type
|
||||
and use the corresponding <code>true</code> and <code>false</code> macros.
|
||||
</li>
|
||||
It's ok to include <stdbool.h>, since libvirt's use of gnulib ensures
|
||||
that it exists and is usable.</li>
|
||||
<li>In the unusual event that you require a specific width, use a
|
||||
standard type like <code>int32_t</code>, <code>uint32_t</code>,
|
||||
<code>uint64_t</code>, etc.</li>
|
||||
@@ -984,151 +926,99 @@ BAD:
|
||||
it points to, or it is aliased to another pointer that is.
|
||||
</p>
|
||||
|
||||
<h2><a id="attribute_annotations">Attribute annotations</a></h2>
|
||||
<p>
|
||||
Use the following annotations to help the compiler and/or static
|
||||
analysis tools understand the code better:
|
||||
</p>
|
||||
|
||||
<table class="top_table">
|
||||
<tr><th>Macro</th><th>Meaning</th></tr>
|
||||
<tr><td><code>ATTRIBUTE_NONNULL</code></td><td>passing NULL for this parameter is not allowed</td></tr>
|
||||
<tr><td><code>ATTRIBUTE_PACKED</code></td><td>force a structure to be packed</td></tr>
|
||||
<tr><td><code>G_GNUC_FALLTHROUGH</code></td><td>allow code reuse by multiple switch cases</td></tr>
|
||||
<tr><td><code>G_GNUC_NO_INLINE</code></td><td>the function is mocked in the test suite</td></tr>
|
||||
<tr><td><code>G_GNUC_NORETURN</code></td><td>the function never returns</td></tr>
|
||||
<tr><td><code>G_GNUC_NULL_TERMINATED</code></td><td>last parameter must be NULL</td></tr>
|
||||
<tr><td><code>G_GNUC_PRINTF</code></td><td>validate that the formatting string matches parameters</td></tr>
|
||||
<tr><td><code>G_GNUC_UNUSED</code></td><td>parameter is unused in this implementation of the function</td></tr>
|
||||
<tr><td><code>G_GNUC_WARN_UNUSED_RESULT</code></td><td>the return value must be checked</td></tr>
|
||||
</table>
|
||||
|
||||
<h2><a id="glib">Adoption of GLib APIs</a></h2>
|
||||
<h2><a id="memalloc">Low level memory management</a></h2>
|
||||
|
||||
<p>
|
||||
Libvirt has adopted use of the
|
||||
<a href="https://developer.gnome.org/glib/stable/">GLib library</a>.
|
||||
Due to libvirt's long history of development, there are many APIs
|
||||
in libvirt, for which GLib provides an alternative solution. The
|
||||
general rule to follow is that the standard GLib solution will be
|
||||
preferred over historical libvirt APIs. Existing code will be
|
||||
ported over to use GLib APIs over time, but new code should use
|
||||
the GLib APIs straight away where possible.
|
||||
Use of the malloc/free/realloc/calloc APIs is deprecated in the libvirt
|
||||
codebase, because they encourage a number of serious coding bugs and do
|
||||
not enable compile time verification of checks for NULL. Instead of these
|
||||
routines, use the macros from viralloc.h.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The following is a list of libvirt APIs that should no longer be
|
||||
used in new code, and their suggested GLib replacements:
|
||||
</p>
|
||||
<ul>
|
||||
<li><p>To allocate a single object:</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>VIR_ALLOC</code>, <code>VIR_REALLOC</code>,
|
||||
<code>VIR_RESIZE_N</code>, <code>VIR_EXPAND_N</code>,
|
||||
<code>VIR_SHRINK_N</code>, <code>VIR_FREE</code>,
|
||||
<code>VIR_APPEND_ELEMENT</code>, <code>VIR_INSERT_ELEMENT</code>,
|
||||
<code>VIR_DELETE_ELEMENT</code></dt>
|
||||
<dd>Prefer the GLib APIs <code>g_new0</code>/<code>g_renew</code>/
|
||||
<code>g_free</code> in most cases. There should rarely be a need
|
||||
to use <code>g_malloc</code>/<code>g_realloc</code>.
|
||||
Instead of using plain C arrays, it is preferrable to use
|
||||
one of the GLib types, <code>GArray</code>, <code>GPtrArray</code>
|
||||
or <code>GByteArray</code>. These
|
||||
all use a struct to track the array memory and size together
|
||||
and efficiently resize. <strong>NEVER MIX</strong> use of the
|
||||
classic libvirt memory allocation APIs and GLib APIs within
|
||||
a single method. Keep the style consistent, converting existing
|
||||
code to GLib style in a separate, prior commit.</dd>
|
||||
<pre>
|
||||
virDomainPtr domain;
|
||||
|
||||
<dt><code>virStrerror</code></dt>
|
||||
<dd>The GLib <code>g_strerror()</code> function should be used instead,
|
||||
which has a simpler calling convention as an added benefit.</dd>
|
||||
if (VIR_ALLOC(domain) < 0)
|
||||
return NULL;
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<table class="top_table">
|
||||
<tr><th>deprecated version</th><th>GLib version</th><th>Notes</th></tr>
|
||||
<tr><td><code>VIR_ALLOC(var)</code></td><td><code>g_new0(var_t, 1)</code></td>
|
||||
<td>the type needs to be passed explicitly</td></tr>
|
||||
<tr><td><code>VIR_ALLOC_N</code></td><td><code>g_new0(var_t, n)</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_REALLOC_N</code></td><td><code>g_renew(var_t, ptr, n)</code></td>
|
||||
<td>the newly added memory is not zeroed</td></tr>
|
||||
<tr><td><code>VIR_EXPAND_N</code></td><td><code>g_renew(var_t, ptr, n)</code></td>
|
||||
<td>zero the new memory manually or use an array type</td></tr>
|
||||
<tr><td><code>VIR_SHRINK_N</code></td><td><code>g_renew(var_t, ptr, n)</code></td>
|
||||
<td></td></tr>
|
||||
<tr><td><code>VIR_APPEND_ELEMENT</code></td><td><code>g_array_append_val</code></td>
|
||||
<td><code>g_ptr_array_add</code> or <code>g_byte_array_append</code></td></tr>
|
||||
<tr><td><code>VIR_INSERT_ELEMENT</code></td><td><code>g_array_insert_val</code></td>
|
||||
<td><code>g_ptr_array_insert</code></td></tr>
|
||||
<tr><td><code>VIR_DELETE_ELEMENT</code></td><td><code>g_array_remove_index</code></td>
|
||||
<td><code>g_ptr_array_remove_index</code> or <code>g_byte_array_remove_index</code></td></tr>
|
||||
<tr><td><code>VIR_FREE</code></td><td><code>g_free</code></td>
|
||||
<td><code>g_free</code> does not zero the pointer</td></tr>
|
||||
</table>
|
||||
<li><p>To allocate an array of objects:</p>
|
||||
<pre>
|
||||
virDomainPtr domains;
|
||||
size_t ndomains = 10;
|
||||
|
||||
<p>String allocation macros and functions:</p>
|
||||
<table class="top_table">
|
||||
<tr><th>deprecated version</th><th>GLib version</th><th>Notes</th></tr>
|
||||
<tr><td><code>virAsprintf</code></td><td><code>g_strdup_printf</code></td><td></td></tr>
|
||||
<tr><td><code>virVasprintf</code></td><td><code>g_strdup_vprint</code></td>
|
||||
<td>use <code>g_vasprintf</code> if you really need to know the returned length</td></tr>
|
||||
<tr><td><code>virStrerror</code></td><td><code>g_strerror</code></td>
|
||||
<td>the error strings are cached globally so no need to free it</td></tr>
|
||||
</table>
|
||||
</dl>
|
||||
if (VIR_ALLOC_N(domains, ndomains) < 0)
|
||||
return NULL;
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<p>
|
||||
The following libvirt APIs have been deleted already:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>VIR_AUTOPTR</code>, <code>VIR_AUTOCLEAN</code>, <code>VIR_AUTOFREE</code></dt>
|
||||
<dd>The GLib macros <code>g_autoptr</code>, <code>g_auto</code> and
|
||||
<code>g_autofree</code> must be used
|
||||
instead in all new code. In existing code, the GLib macros must
|
||||
never be mixed with libvirt macros within a method, nor should
|
||||
they be mixed with <code>VIR_FREE</code>. If introducing GLib macros to an
|
||||
existing method, any use of libvirt macros must be converted
|
||||
in an independent commit.
|
||||
</dd>
|
||||
<li><p>To allocate an array of object pointers:</p>
|
||||
<pre>
|
||||
virDomainPtr *domains;
|
||||
size_t ndomains = 10;
|
||||
|
||||
<dt><code>VIR_DEFINE_AUTOPTR_FUNC</code>, <code>VIR_DEFINE_AUTOCLEAN_FUNC</code></dt>
|
||||
<dd>The GLib macros <code>G_DEFINE_AUTOPTR_CLEANUP_FUNC</code> and
|
||||
<code>G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC</code> must be used in all
|
||||
new code. Existing code should be converted to the
|
||||
new macros where relevant. It is permissible to use
|
||||
<code>g_autoptr</code>, <code>g_auto</code> on an object whose cleanup function
|
||||
is declared with the libvirt macros and vice-versa.
|
||||
</dd>
|
||||
if (VIR_ALLOC_N(domains, ndomains) < 0)
|
||||
return NULL;
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<dt><code>VIR_AUTOUNREF</code></dt>
|
||||
<dd>The GLib macros <code>g_autoptr</code> and <code>G_DEFINE_AUTOPTR_CLEANUP_FUNC</code>
|
||||
should be used to manage autoclean of virObject classes.
|
||||
This matches usage with GObject classes.</dd>
|
||||
<li><p>To re-allocate the array of domains to be 1 element
|
||||
longer (however, note that repeatedly expanding an array by 1
|
||||
scales quadratically, so this is recommended only for smaller
|
||||
arrays):</p>
|
||||
<pre>
|
||||
virDomainPtr domains;
|
||||
size_t ndomains = 0;
|
||||
|
||||
<dt><code>VIR_STRDUP</code>, <code>VIR_STRNDUP</code></dt>
|
||||
<dd>Prefer the GLib APIs <code>g_strdup</code> and <code>g_strndup</code>.</dd>
|
||||
</dl>
|
||||
<table class="top_table">
|
||||
<tr><th>deleted version</th><th>GLib version</th><th>Notes</th></tr>
|
||||
<tr><td><code>VIR_AUTOPTR</code></td><td><code>g_autoptr</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_AUTOCLEAN</code></td><td><code>g_auto</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_AUTOFREE</code></td><td><code>g_autofree</code></td><td>The GLib version does not use parentheses</td></tr>
|
||||
<tr><td><code>VIR_AUTOUNREF</code></td><td><code>g_autoptr</code></td><td>The cleanup function needs to be defined</td></tr>
|
||||
<tr><td><code>VIR_DEFINE_AUTOPTR_FUNC</code></td><td><code>G_DEFINE_AUTOPTR_CLEANUP_FUNC</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_DEFINE_AUTOCLEAN_FUNC</code></td><td><code>G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_STEAL_PTR</code></td><td><code>g_steal_pointer</code></td>
|
||||
<td><code>a = f(&b)</code> instead of <code>f(a, b)</code></td></tr>
|
||||
<tr><td><code>VIR_RETURN_PTR</code></td><td><code>return g_steal_pointer</code></td><td></td></tr>
|
||||
<tr><td><code>ARRAY_CARDINALITY</code></td><td><code>G_N_ELEMENTS</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_FALLTHROUGH</code></td><td><code>G_GNUC_FALLTHROUGH</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_FMT_PRINTF</code></td><td><code>G_GNUC_PRINTF</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_NOINLINE</code></td><td><code>G_GNUC_NO_INLINE</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_NORETURN</code></td><td><code>G_GNUC_NORETURN</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_RETURN_CHECK</code></td><td><code>G_GNUC_WARN_UNUSED_RESULT</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_SENTINEL</code></td><td><code>G_GNUC_NULL_TERMINATED</code></td><td></td></tr>
|
||||
<tr><td><code>ATTRIBUTE_UNUSED</code></td><td><code>G_GNUC_UNUSED</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_STRDUP</code></td><td><code>g_strdup</code></td><td></td></tr>
|
||||
<tr><td><code>VIR_STRNDUP</code></td><td><code>g_strndup</code></td><td></td></tr>
|
||||
</table>
|
||||
if (VIR_EXPAND_N(domains, ndomains, 1) < 0)
|
||||
return NULL;
|
||||
domains[ndomains - 1] = domain;
|
||||
</pre></li>
|
||||
|
||||
<li><p>To ensure an array has room to hold at least one more
|
||||
element (this approach scales better, but requires tracking
|
||||
allocation separately from usage)</p>
|
||||
|
||||
<pre>
|
||||
virDomainPtr domains;
|
||||
size_t ndomains = 0;
|
||||
size_t ndomains_max = 0;
|
||||
|
||||
if (VIR_RESIZE_N(domains, ndomains_max, ndomains, 1) < 0)
|
||||
return NULL;
|
||||
domains[ndomains++] = domain;
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
<li><p>To trim an array of domains from its allocated size down
|
||||
to the actual used size:</p>
|
||||
|
||||
<pre>
|
||||
virDomainPtr domains;
|
||||
size_t ndomains = x;
|
||||
size_t ndomains_max = y;
|
||||
|
||||
VIR_SHRINK_N(domains, ndomains_max, ndomains_max - ndomains);
|
||||
</pre></li>
|
||||
|
||||
<li><p>To free an array of domains:</p>
|
||||
<pre>
|
||||
virDomainPtr domains;
|
||||
size_t ndomains = x;
|
||||
size_t ndomains_max = y;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < ndomains; i++)
|
||||
VIR_FREE(domains[i]);
|
||||
VIR_FREE(domains);
|
||||
ndomains_max = ndomains = 0;
|
||||
</pre>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h2><a id="file_handling">File handling</a></h2>
|
||||
|
||||
@@ -1269,14 +1159,18 @@ BAD:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
dst = g_strdup(src);
|
||||
dst = g_strndup(src, n);
|
||||
VIR_STRDUP(char *dst, const char *src);
|
||||
VIR_STRNDUP(char *dst, const char *src, size_t n);
|
||||
</pre>
|
||||
<p>
|
||||
You should avoid using strdup or strndup directly as they do not handle
|
||||
out-of-memory errors, and do not allow a NULL source.
|
||||
Use <code>g_strdup</code> and <code>g_strndup</code> from GLib which
|
||||
abort on OOM and handle NULL source by returning NULL.
|
||||
You should avoid using strdup or strndup directly as they do not report
|
||||
out-of-memory error, and do not allow a NULL source. Use
|
||||
VIR_STRDUP or VIR_STRNDUP macros instead, which return 0 for
|
||||
NULL source, 1 for successful copy, and -1 for allocation
|
||||
failure with the error already reported. In very
|
||||
specific cases, when you don't want to report the out-of-memory error, you
|
||||
can use VIR_STRDUP_QUIET or VIR_STRNDUP_QUIET, but such usage is very rare
|
||||
and usually considered a flaw.
|
||||
</p>
|
||||
|
||||
<h2><a id="strbuf">Variable length string buffer</a></h2>
|
||||
@@ -1284,11 +1178,7 @@ BAD:
|
||||
<p>
|
||||
If there is a need for complex string concatenations, avoid using
|
||||
the usual sequence of malloc/strcpy/strcat/snprintf functions and
|
||||
make use of either the
|
||||
<a href="https://developer.gnome.org/glib/stable/glib-Strings.html">GString</a>
|
||||
type from GLib or the virBuffer API.
|
||||
If formatting XML or QEMU command line is needed, use the virBuffer
|
||||
API described in virbuffer.h, since it has helper functions for those.
|
||||
make use of the virBuffer API described in virbuffer.h
|
||||
</p>
|
||||
|
||||
<p>Typical usage is as follows:</p>
|
||||
@@ -1297,14 +1187,12 @@ BAD:
|
||||
char *
|
||||
somefunction(...)
|
||||
{
|
||||
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
...
|
||||
|
||||
virBufferAddLit(&buf, "<domain>\n");
|
||||
virBufferAsprintf(&buf, " <memory>%d</memory>\n", memory);
|
||||
if (some_error)
|
||||
return NULL; /* g_auto will free the memory used so far */
|
||||
...
|
||||
virBufferAddLit(&buf, "</domain>\n");
|
||||
|
||||
@@ -1373,12 +1261,12 @@ BAD:
|
||||
Whenever you add a new printf-style function, i.e., one with a format
|
||||
string argument and following "..." in its prototype, be sure to use
|
||||
gcc's printf attribute directive in the prototype. For example, here's
|
||||
the one for virCommandAddEnvFormat in vircommand.h:
|
||||
the one for virAsprintf, in util.h:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
void virCommandAddEnvFormat(virCommandPtr cmd, const char *format, ...)
|
||||
G_GNUC_PRINTF(2, 3);
|
||||
int virAsprintf(char **strp, const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 2, 3);
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
@@ -1388,40 +1276,14 @@ BAD:
|
||||
</p>
|
||||
|
||||
<p>
|
||||
When printing to a string, consider using GString or virBuffer for
|
||||
incremental allocations, g_strdup_printf for a one-shot allocation,
|
||||
and g_snprintf for fixed-width buffers. Only use g_sprintf,
|
||||
if you can prove the buffer won't overflow.
|
||||
When printing to a string, consider using virBuffer for
|
||||
incremental allocations, virAsprintf for a one-shot allocation,
|
||||
and snprintf for fixed-width buffers. Do not use sprintf, even
|
||||
if you can prove the buffer won't overflow, since gnulib does
|
||||
not provide the same portability guarantees for sprintf as it
|
||||
does for snprintf.
|
||||
</p>
|
||||
|
||||
<h2><a id="errors">Error message format</a></h2>
|
||||
|
||||
<p>
|
||||
Error messages visible to the user should be short and descriptive. All
|
||||
error messages are translated using gettext and thus must be wrapped in
|
||||
<code>_()</code> macro. To simplify the translation work, the error message
|
||||
must not be concatenated from various parts. To simplify searching for
|
||||
the error message in the code the strings should not be broken even
|
||||
if they result into a line longer than 80 columns and any formatting
|
||||
modifier should be enclosed by quotes or other obvious separator.
|
||||
If a string used with <code>%s</code> can be NULL the NULLSTR macro must
|
||||
be used.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
GOOD: virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to connect to remote host '%s'"), hostname)
|
||||
|
||||
BAD: virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to %s to remote host '%s'"),
|
||||
"connect", hostname);
|
||||
|
||||
BAD: virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to connect "
|
||||
"to remote host '%s'),
|
||||
hostname);
|
||||
</pre>
|
||||
|
||||
<h2><a id="goto">Use of goto</a></h2>
|
||||
|
||||
<p>
|
||||
@@ -1441,16 +1303,11 @@ BAD:
|
||||
single label at the end of the function. It's almost always ok
|
||||
to use this style. In particular, if the cleanup code only
|
||||
involves free'ing memory, then having multiple labels is
|
||||
overkill. g_free() and most of the functions named XXXFree() in
|
||||
libvirt is required to handle NULL as its arg. This does not
|
||||
apply to libvirt's public APIs. Thus you can
|
||||
overkill. VIR_FREE() and every function named XXXFree() in
|
||||
libvirt is required to handle NULL as its arg. Thus you can
|
||||
safely call free on all the variables even if they were not yet
|
||||
allocated (yes they have to have been initialized to NULL).
|
||||
This is much simpler and clearer than having multiple labels.
|
||||
Note that most of libvirt's type declarations can be marked with
|
||||
either <code>g_autofree</code> or <code>g_autoptr</code> which uses
|
||||
the compiler's <code>__attribute__((cleanup))</code> that calls
|
||||
the appropriate free function when the variable goes out of scope.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -1527,7 +1384,14 @@ int foo()
|
||||
how things work, it's better
|
||||
to wait for a more authoritative feedback though. Before committing, please
|
||||
also rebuild locally, run 'make check syntax-check', and make sure you
|
||||
don't raise errors.
|
||||
don't raise errors. Try to look for warnings too; for example,
|
||||
configure with
|
||||
</p>
|
||||
<pre>
|
||||
--enable-compile-warnings=error
|
||||
</pre>
|
||||
<p>
|
||||
which adds -Werror to compile flags, so no warnings get missed
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -1547,10 +1411,35 @@ int foo()
|
||||
fixes for documentation and code comments can be managed
|
||||
in the same way, but still make sure they get reviewed if non-trivial.
|
||||
</li>
|
||||
<li>(ir)regular pulls from other repositories or automated updates, such
|
||||
as the keycodemap submodule updates, pulling in new translations or updating
|
||||
the container images for the CI system
|
||||
</li>
|
||||
</ul>
|
||||
<h2><a id="coverage">Code coverage reports</a></h2>
|
||||
|
||||
<p>
|
||||
Code coverage HTML reports can be generated with:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
make coverage
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Reports will be generated in the <code>cov/</code> directory. Point a
|
||||
web browser at <code>cov/index.html</code> for the full report.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The <code>make coverage</code> target is provided by <code>gnulib</code>.
|
||||
It is a convenience helper for calling the following 3 targets in order.
|
||||
It may be useful to occasionally call these directly.
|
||||
|
||||
<ul>
|
||||
<li><code>make init-coverage</code>: run <code>make clean</code> and
|
||||
remove all code coverage counter files (*.gcno, etc.)</li>
|
||||
<li><code>make build-coverage</code>: run <code>make</code> and
|
||||
<code>make check</code> with <code>CFLAGS</code> filled in with
|
||||
necessary coverage flags</li>
|
||||
<li><code>make gen-coverage</code>: generate the HTML report</li>
|
||||
</ul>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -91,8 +91,10 @@
|
||||
</network>
|
||||
</hookData></pre>
|
||||
|
||||
<p>In the case of an network port being created / deleted, the network
|
||||
XML will be followed with the full XML description of the port:</p>
|
||||
<p>In the case of an interface
|
||||
being plugged/unplugged to/from the network, the network XML will be
|
||||
followed with the full XML description of the domain containing the
|
||||
interface that is being plugged/unplugged:</p>
|
||||
|
||||
<pre><hookData>
|
||||
<network>
|
||||
@@ -100,11 +102,11 @@
|
||||
<uuid>afca425a-2c3a-420c-b2fb-dd7b4950d722</uuid>
|
||||
...
|
||||
</network>
|
||||
<networkport>
|
||||
<uuid>5d744f21-ba4a-4d6e-bdb2-30a35ff3207d</uuid>
|
||||
...
|
||||
<plug type='direct' dev='ens3' mode='vepa'/>
|
||||
</networkport>
|
||||
<domain type='$domain_type' id='$domain_id'>
|
||||
<name>$domain_name</name>
|
||||
<uuid>afca425a-2c3a-420c-b2fb-dd7b4950d722</uuid>
|
||||
...
|
||||
</domain>
|
||||
</hookData></pre>
|
||||
|
||||
<p>Please note that this approach is different from other cases such as
|
||||
@@ -294,15 +296,15 @@
|
||||
<pre>/etc/libvirt/hooks/network network_name stopped end -</pre></li>
|
||||
<li>Later, when network is started and there's an interface from a
|
||||
domain to be plugged into the network, the hook script is called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name port-created begin -</pre>
|
||||
<pre>/etc/libvirt/hooks/network network_name plugged begin -</pre>
|
||||
Please note, that in this case, the script is passed both network and
|
||||
port XMLs on its stdin.</li>
|
||||
domain XMLs on its stdin.</li>
|
||||
<li>When network is updated, the hook script is called as:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name updated begin -</pre></li>
|
||||
<li>When the domain from previous case is shutting down, the interface
|
||||
is unplugged. This leads to another script invocation:<br/>
|
||||
<pre>/etc/libvirt/hooks/network network_name port-deleted begin -</pre>
|
||||
And again, as in previous case, both network and port XMLs are passed
|
||||
<pre>/etc/libvirt/hooks/network network_name unplugged begin -</pre>
|
||||
And again, as in previous case, both network and domain XMLs are passed
|
||||
onto script's stdin.</li>
|
||||
</ul>
|
||||
|
||||
|
437
docs/hvsupport.pl
Executable file
437
docs/hvsupport.pl
Executable file
@@ -0,0 +1,437 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use File::Find;
|
||||
|
||||
die "syntax: $0 SRCDIR\n" unless int(@ARGV) == 1;
|
||||
|
||||
my $srcdir = shift @ARGV;
|
||||
|
||||
my $symslibvirt = "$srcdir/libvirt_public.syms";
|
||||
my $symsqemu = "$srcdir/libvirt_qemu.syms";
|
||||
my $symslxc = "$srcdir/libvirt_lxc.syms";
|
||||
my @drivertable = (
|
||||
"$srcdir/driver-hypervisor.h",
|
||||
"$srcdir/driver-interface.h",
|
||||
"$srcdir/driver-network.h",
|
||||
"$srcdir/driver-nodedev.h",
|
||||
"$srcdir/driver-nwfilter.h",
|
||||
"$srcdir/driver-secret.h",
|
||||
"$srcdir/driver-state.h",
|
||||
"$srcdir/driver-storage.h",
|
||||
"$srcdir/driver-stream.h",
|
||||
);
|
||||
|
||||
my %groupheaders = (
|
||||
"virHypervisorDriver" => "Hypervisor APIs",
|
||||
"virNetworkDriver" => "Virtual Network APIs",
|
||||
"virInterfaceDriver" => "Host Interface APIs",
|
||||
"virNodeDeviceDriver" => "Host Device APIs",
|
||||
"virStorageDriver" => "Storage Pool APIs",
|
||||
"virSecretDriver" => "Secret APIs",
|
||||
"virNWFilterDriver" => "Network Filter APIs",
|
||||
);
|
||||
|
||||
|
||||
my @srcs;
|
||||
find({
|
||||
wanted => sub {
|
||||
if (m!$srcdir/.*/\w+_(driver|common|tmpl|monitor|hal|udev)\.c$!) {
|
||||
push @srcs, $_ if $_ !~ /vbox_driver\.c/;
|
||||
}
|
||||
}, no_chdir => 1}, $srcdir);
|
||||
|
||||
# Map API functions to the header and documentation files they're in
|
||||
# so that we can generate proper hyperlinks to their documentation.
|
||||
#
|
||||
# The function names are grep'd from the XML output of apibuild.py.
|
||||
sub getAPIFilenames {
|
||||
my $filename = shift;
|
||||
|
||||
my %files;
|
||||
my $line;
|
||||
|
||||
open FILE, "<", $filename or die "cannot read $filename: $!";
|
||||
|
||||
while (defined($line = <FILE>)) {
|
||||
if ($line =~ /function name='([^']+)' file='([^']+)'/) {
|
||||
$files{$1} = $2;
|
||||
}
|
||||
}
|
||||
|
||||
close FILE;
|
||||
|
||||
if (keys %files == 0) {
|
||||
die "No functions found in $filename. Has the apibuild.py output changed?";
|
||||
}
|
||||
return \%files;
|
||||
}
|
||||
|
||||
sub parseSymsFile {
|
||||
my $apisref = shift;
|
||||
my $prefix = shift;
|
||||
my $filename = shift;
|
||||
my $xmlfilename = shift;
|
||||
|
||||
my $line;
|
||||
my $vers;
|
||||
my $prevvers;
|
||||
|
||||
my $filenames = getAPIFilenames($xmlfilename);
|
||||
|
||||
open FILE, "<$filename"
|
||||
or die "cannot read $filename: $!";
|
||||
|
||||
while (defined($line = <FILE>)) {
|
||||
chomp $line;
|
||||
next if $line =~ /^\s*#/;
|
||||
next if $line =~ /^\s*$/;
|
||||
next if $line =~ /^\s*(global|local):/;
|
||||
if ($line =~ /^\s*${prefix}_(\d+\.\d+\.\d+)\s*{\s*$/) {
|
||||
if (defined $vers) {
|
||||
die "malformed syms file";
|
||||
}
|
||||
$vers = $1;
|
||||
} elsif ($line =~ /\s*}\s*;\s*$/) {
|
||||
if (defined $prevvers) {
|
||||
die "malformed syms file";
|
||||
}
|
||||
$prevvers = $vers;
|
||||
$vers = undef;
|
||||
} elsif ($line =~ /\s*}\s*${prefix}_(\d+\.\d+\.\d+)\s*;\s*$/) {
|
||||
if ($1 ne $prevvers) {
|
||||
die "malformed syms file $1 != $vers";
|
||||
}
|
||||
$prevvers = $vers;
|
||||
$vers = undef;
|
||||
} elsif ($line =~ /\s*(\w+)\s*;\s*$/) {
|
||||
$$apisref{$1} = {};
|
||||
$$apisref{$1}->{vers} = $vers;
|
||||
$$apisref{$1}->{file} = $$filenames{$1};
|
||||
} else {
|
||||
die "unexpected data $line\n";
|
||||
}
|
||||
}
|
||||
|
||||
close FILE;
|
||||
}
|
||||
|
||||
my %apis;
|
||||
# Get the list of all public APIs and their corresponding version
|
||||
parseSymsFile(\%apis, "LIBVIRT", $symslibvirt, "$srcdir/../docs/libvirt-api.xml");
|
||||
|
||||
# And the same for the QEMU specific APIs
|
||||
parseSymsFile(\%apis, "LIBVIRT_QEMU", $symsqemu, "$srcdir/../docs/libvirt-qemu-api.xml");
|
||||
|
||||
# And the same for the LXC specific APIs
|
||||
parseSymsFile(\%apis, "LIBVIRT_LXC", $symslxc, "$srcdir/../docs/libvirt-lxc-api.xml");
|
||||
|
||||
|
||||
# Some special things which aren't public APIs,
|
||||
# but we want to report
|
||||
$apis{virConnectSupportsFeature}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePerform}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigrateFinish}->{vers} = "0.3.2";
|
||||
$apis{virDomainMigratePrepare2}->{vers} = "0.5.0";
|
||||
$apis{virDomainMigrateFinish2}->{vers} = "0.5.0";
|
||||
$apis{virDomainMigratePrepareTunnel}->{vers} = "0.7.2";
|
||||
|
||||
$apis{virDomainMigrateBegin3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePrepare3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePrepareTunnel3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigratePerform3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigrateFinish3}->{vers} = "0.9.2";
|
||||
$apis{virDomainMigrateConfirm3}->{vers} = "0.9.2";
|
||||
|
||||
$apis{virDomainMigrateBegin3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePrepare3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePrepareTunnel3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigratePerform3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigrateFinish3Params}->{vers} = "1.1.0";
|
||||
$apis{virDomainMigrateConfirm3Params}->{vers} = "1.1.0";
|
||||
|
||||
|
||||
|
||||
# Now we want to get the mapping between public APIs
|
||||
# and driver struct fields. This lets us later match
|
||||
# update the driver impls with the public APis.
|
||||
|
||||
my $line;
|
||||
|
||||
# Group name -> hash of APIs { fields -> api name }
|
||||
my %groups;
|
||||
my $ingrp;
|
||||
foreach my $drivertable (@drivertable) {
|
||||
open FILE, "<$drivertable"
|
||||
or die "cannot read $drivertable: $!";
|
||||
|
||||
while (defined($line = <FILE>)) {
|
||||
if ($line =~ /struct _(vir\w*Driver)/) {
|
||||
my $grp = $1;
|
||||
if ($grp ne "virStateDriver" &&
|
||||
$grp ne "virStreamDriver") {
|
||||
$ingrp = $grp;
|
||||
$groups{$ingrp} = { apis => {}, drivers => {} };
|
||||
}
|
||||
} elsif ($ingrp) {
|
||||
if ($line =~ /^\s*vir(?:Drv)(\w+)\s+(\w+);\s*$/) {
|
||||
my $field = $2;
|
||||
my $name = $1;
|
||||
|
||||
my $api;
|
||||
if (exists $apis{"vir$name"}) {
|
||||
$api = "vir$name";
|
||||
} elsif ($name =~ /\w+(Open|Close|URIProbe)/) {
|
||||
next;
|
||||
} else {
|
||||
die "driver $name does not have a public API";
|
||||
}
|
||||
$groups{$ingrp}->{apis}->{$field} = $api;
|
||||
} elsif ($line =~ /};/) {
|
||||
$ingrp = undef;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close FILE;
|
||||
}
|
||||
|
||||
|
||||
# Finally, we read all the primary driver files and extract
|
||||
# the driver API tables from each one.
|
||||
|
||||
foreach my $src (@srcs) {
|
||||
open FILE, "<$src" or
|
||||
die "cannot read $src: $!";
|
||||
|
||||
my $groups_regex = join("|", keys %groups);
|
||||
$ingrp = undef;
|
||||
my $impl;
|
||||
while (defined($line = <FILE>)) {
|
||||
if (!$ingrp) {
|
||||
# skip non-matching lines early to save time
|
||||
next if not $line =~ /$groups_regex/;
|
||||
|
||||
if ($line =~ /^\s*(?:static\s+)?($groups_regex)\s+(\w+)\s*=\s*{/ ||
|
||||
$line =~ /^\s*(?:static\s+)?($groups_regex)\s+NAME\(\w+\)\s*=\s*{/) {
|
||||
$ingrp = $1;
|
||||
$impl = $src;
|
||||
|
||||
if ($impl =~ m,.*/node_device_(\w+)\.c,) {
|
||||
$impl = $1;
|
||||
} else {
|
||||
$impl =~ s,.*/(\w+?)_((\w+)_)?(\w+)\.c,$1,;
|
||||
}
|
||||
|
||||
if ($groups{$ingrp}->{drivers}->{$impl}) {
|
||||
die "Group $ingrp already contains $impl";
|
||||
}
|
||||
|
||||
$groups{$ingrp}->{drivers}->{$impl} = {};
|
||||
}
|
||||
|
||||
} else {
|
||||
if ($line =~ m!\s*\.(\w+)\s*=\s*(\w+)\s*,?\s*(?:/\*\s*(\d+\.\d+\.\d+)\s*\*/\s*)?$!) {
|
||||
my $api = $1;
|
||||
my $meth = $2;
|
||||
my $vers = $3;
|
||||
|
||||
next if $api eq "no" || $api eq "name";
|
||||
|
||||
die "Method $meth in $src is missing version" unless defined $vers || $api eq "connectURIProbe";
|
||||
|
||||
die "Driver method for $api is NULL in $src" if $meth eq "NULL";
|
||||
|
||||
if (!exists($groups{$ingrp}->{apis}->{$api})) {
|
||||
next if $api =~ /\w(Open|Close|URIProbe)/;
|
||||
|
||||
die "Found unexpected method $api in $ingrp\n";
|
||||
}
|
||||
|
||||
$groups{$ingrp}->{drivers}->{$impl}->{$api} = $vers;
|
||||
if ($api eq "domainMigratePrepare" ||
|
||||
$api eq "domainMigratePrepare2" ||
|
||||
$api eq "domainMigratePrepare3") {
|
||||
$groups{$ingrp}->{drivers}->{$impl}->{"domainMigrate"} = $vers
|
||||
unless $groups{$ingrp}->{drivers}->{$impl}->{"domainMigrate"};
|
||||
}
|
||||
|
||||
} elsif ($line =~ /}/) {
|
||||
$ingrp = undef;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close FILE;
|
||||
}
|
||||
|
||||
|
||||
# The '.open' driver method is used for 3 public APIs, so we
|
||||
# have a bit of manual fixup todo with the per-driver versioning
|
||||
# and support matrix
|
||||
|
||||
$groups{virHypervisorDriver}->{apis}->{"openAuth"} = "virConnectOpenAuth";
|
||||
$groups{virHypervisorDriver}->{apis}->{"openReadOnly"} = "virConnectOpenReadOnly";
|
||||
$groups{virHypervisorDriver}->{apis}->{"domainMigrate"} = "virDomainMigrate";
|
||||
|
||||
my $openAuthVers = (0 * 1000 * 1000) + (4 * 1000) + 0;
|
||||
|
||||
foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
|
||||
my $openVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
my $openVers;
|
||||
if ($openVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
|
||||
$openVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
|
||||
}
|
||||
|
||||
# virConnectOpenReadOnly always matches virConnectOpen version
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenReadOnly"} =
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpen"};
|
||||
|
||||
# virConnectOpenAuth is always 0.4.0 if the driver existed
|
||||
# before this time, otherwise it matches the version of
|
||||
# the driver's virConnectOpen entry
|
||||
if ($openVersStr eq "Y" ||
|
||||
$openVers >= $openAuthVers) {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = $openVersStr;
|
||||
} else {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"connectOpenAuth"} = "0.4.0";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Another special case for the virDomainCreateLinux which was replaced
|
||||
# with virDomainCreateXML
|
||||
$groups{virHypervisorDriver}->{apis}->{"domainCreateLinux"} = "virDomainCreateLinux";
|
||||
|
||||
my $createAPIVers = (0 * 1000 * 1000) + (0 * 1000) + 3;
|
||||
|
||||
foreach my $drv (keys %{$groups{"virHypervisorDriver"}->{drivers}}) {
|
||||
my $createVersStr = $groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateXML"};
|
||||
next unless defined $createVersStr;
|
||||
my $createVers;
|
||||
if ($createVersStr =~ /(\d+)\.(\d+)\.(\d+)/) {
|
||||
$createVers = ($1 * 1000 * 1000) + ($2 * 1000) + $3;
|
||||
}
|
||||
|
||||
# virCreateLinux is always 0.0.3 if the driver existed
|
||||
# before this time, otherwise it matches the version of
|
||||
# the driver's virCreateXML entry
|
||||
if ($createVersStr eq "Y" ||
|
||||
$createVers >= $createAPIVers) {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = $createVersStr;
|
||||
} else {
|
||||
$groups{"virHypervisorDriver"}->{drivers}->{$drv}->{"domainCreateLinux"} = "0.0.3";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Finally we generate the HTML file with the tables
|
||||
|
||||
print <<EOF;
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body class="hvsupport">
|
||||
<h1>libvirt API support matrix</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
This page documents which <a href="html/">libvirt calls</a> work on
|
||||
which libvirt drivers / hypervisors, and which version the API appeared
|
||||
in.
|
||||
</p>
|
||||
|
||||
EOF
|
||||
|
||||
foreach my $grp (sort { $a cmp $b } keys %groups) {
|
||||
print "<h2><a name=\"$grp\">", $groupheaders{$grp}, "</a></h2>\n";
|
||||
print <<EOF;
|
||||
<table class="top_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>API</th>
|
||||
<th>Version</th>
|
||||
EOF
|
||||
|
||||
foreach my $drv (sort { $a cmp $b } keys %{$groups{$grp}->{drivers}}) {
|
||||
print " <th>$drv</th>\n";
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
EOF
|
||||
|
||||
my $row = 0;
|
||||
foreach my $field (sort {
|
||||
$groups{$grp}->{apis}->{$a}
|
||||
cmp
|
||||
$groups{$grp}->{apis}->{$b}
|
||||
} keys %{$groups{$grp}->{apis}}) {
|
||||
my $api = $groups{$grp}->{apis}->{$field};
|
||||
my $vers = $apis{$api}->{vers};
|
||||
my $htmlgrp = $apis{$api}->{file};
|
||||
print <<EOF;
|
||||
<tr>
|
||||
<td>
|
||||
EOF
|
||||
|
||||
if (defined $htmlgrp) {
|
||||
print <<EOF;
|
||||
<a href=\"html/libvirt-$htmlgrp.html#$api\">$api</a>
|
||||
EOF
|
||||
|
||||
} else {
|
||||
print $api;
|
||||
}
|
||||
print <<EOF;
|
||||
</td>
|
||||
<td>$vers</td>
|
||||
EOF
|
||||
|
||||
foreach my $drv (sort {$a cmp $b } keys %{$groups{$grp}->{drivers}}) {
|
||||
if (exists $groups{$grp}->{drivers}->{$drv}->{$field}) {
|
||||
print "<td>", $groups{$grp}->{drivers}->{$drv}->{$field}, "</td>\n";
|
||||
} else {
|
||||
print "<td></td>\n";
|
||||
}
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</tr>
|
||||
EOF
|
||||
|
||||
$row++;
|
||||
if (($row % 15) == 0) {
|
||||
print <<EOF;
|
||||
<tr>
|
||||
<th>API</th>
|
||||
<th>Version</th>
|
||||
EOF
|
||||
|
||||
foreach my $drv (sort { $a cmp $b } keys %{$groups{$grp}->{drivers}}) {
|
||||
print " <th>$drv</th>\n";
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</tr>
|
||||
EOF
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</tbody>
|
||||
</table>
|
||||
EOF
|
||||
}
|
||||
|
||||
print <<EOF;
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
@@ -2,9 +2,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<script type="text/javascript" src="js/jquery-3.1.1.min.js"> </script>
|
||||
<script type="text/javascript" src="js/moment.min.js"> </script>
|
||||
<script type="text/javascript" src="js/jquery.rss.min.js"> </script>
|
||||
|
||||
<script type="text/javascript">
|
||||
<!--
|
||||
window.addEventListener("load", function() { fetchRSS() });
|
||||
jQuery(function($) {
|
||||
$("#planet").rss("http://planet.virt-tools.org/atom.xml", {
|
||||
ssl: true,
|
||||
layoutTemplate: '<dl>{entries}</dl>',
|
||||
entryTemplate: '<dt><a href="{url}">{title}</a></dt><dd>by {author} on {date}</li>',
|
||||
dateFormat: 'DD MMM YYYY'
|
||||
})
|
||||
})
|
||||
// -->
|
||||
</script>
|
||||
</head>
|
||||
@@ -58,9 +69,7 @@
|
||||
<a href="formatstoragecaps.html">storage pool capabilities</a>,
|
||||
<a href="formatnode.html">node devices</a>,
|
||||
<a href="formatsecret.html">secrets</a>,
|
||||
<a href="formatsnapshot.html">snapshots</a>,
|
||||
<a href="formatcheckpoint.html">checkpoints</a>,
|
||||
<a href="formatbackup.html">backup jobs</a></dd>
|
||||
<a href="formatsnapshot.html">snapshots</a></dd>
|
||||
<dt><a href="http://wiki.libvirt.org">Wiki</a></dt>
|
||||
<dd>Read further community contributed content</dd>
|
||||
</dl>
|
||||
|
1266
docs/index.py
Executable file
1266
docs/index.py
Executable file
File diff suppressed because it is too large
Load Diff
213
docs/internals/oomtesting.html.in
Normal file
213
docs/internals/oomtesting.html.in
Normal file
@@ -0,0 +1,213 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Out of memory testing</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
|
||||
<p>
|
||||
This page describes how to use the test suite todo out of memory
|
||||
testing.
|
||||
</p>
|
||||
|
||||
<h2>Building with OOM testing</h2>
|
||||
|
||||
<p>
|
||||
Since OOM testing requires hooking into the malloc APIs, it is
|
||||
not enabled by default. The flag <code>--enable-test-oom</code>
|
||||
must be given to <code>configure</code>. When this is done the
|
||||
libvirt allocation APIs will have some hooks enabled.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ ./configure --enable-test-oom
|
||||
</pre>
|
||||
|
||||
|
||||
<h2><a id="basicoom">Basic OOM testing support</a></h2>
|
||||
|
||||
<p>
|
||||
The first step in validating OOM usage is to run a test suite
|
||||
with full OOM testing enabled. This is done by setting the
|
||||
<code>VIR_TEST_OOM=1</code> environment variable. The way this
|
||||
works is that it runs the test once normally to "prime" any
|
||||
static memory allocations. Then it runs it once more counting
|
||||
the total number of memory allocations. Then it runs it in a
|
||||
loop failing a different memory allocation each time. For every
|
||||
memory allocation failure triggered, it expects the test case
|
||||
to return an error. OOM testing is quite slow requiring each
|
||||
test case to be executed O(n) times, where 'n' is the total
|
||||
number of memory allocations. This results in a total number
|
||||
of memory allocations of '(n * (n + 1) ) / 2'
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM=1 ./qemuxml2argvtest
|
||||
1) QEMU XML-2-ARGV minimal ... OK
|
||||
Test OOM for nalloc=42 .......................................... OK
|
||||
2) QEMU XML-2-ARGV minimal-s390 ... OK
|
||||
Test OOM for nalloc=28 ............................ OK
|
||||
3) QEMU XML-2-ARGV machine-aliases1 ... OK
|
||||
Test OOM for nalloc=38 ...................................... OK
|
||||
4) QEMU XML-2-ARGV machine-aliases2 ... OK
|
||||
Test OOM for nalloc=38 ...................................... OK
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 ..................................... OK
|
||||
...snip...
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
In this output, the first line shows the normal execution and
|
||||
the test number, and the second line shows the total number
|
||||
of memory allocations from that test case.
|
||||
</p>
|
||||
|
||||
<h3><a id="valgrind">Tracking failures with valgrind</a></h3>
|
||||
|
||||
<p>
|
||||
The test suite should obviously *not* crash during OOM testing.
|
||||
If it does crash, then to assist in tracking down the problem
|
||||
it is worth using valgrind and only running a single test case.
|
||||
For example, supposing test case 5 crashed. Then re-run the
|
||||
test with
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM=1 VIR_TEST_RANGE=5 ../run valgrind ./qemuxml2argvtest
|
||||
...snip...
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 ..................................... OK
|
||||
...snip...
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Valgrind should report the cause of the crash - for example a
|
||||
double free or use of uninitialized memory or NULL pointer
|
||||
access.
|
||||
</p>
|
||||
|
||||
<h3><a id="stacktraces">Tracking failures with stack traces</a></h3>
|
||||
|
||||
<p>
|
||||
With some really difficult bugs valgrind is not sufficient to
|
||||
identify the cause. In this case, it is useful to identify the
|
||||
precise allocation which was failed, to allow the code path
|
||||
to the error to be traced. The <code>VIR_TEST_OOM</code>
|
||||
env variable can be given a range of memory allocations to
|
||||
test. So if a test case has 150 allocations, it can be told
|
||||
to only test allocation numbers 7-10. The <code>VIR_TEST_OOM_TRACE</code>
|
||||
variable can be used to print out stack traces.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ VIR_TEST_OOM_TRACE=2 VIR_TEST_OOM=1:7-10 VIR_TEST_RANGE=5 \
|
||||
../run valgrind ./qemuxml2argvtest
|
||||
5) QEMU XML-2-ARGV machine-core-on ... OK
|
||||
Test OOM for nalloc=37 !virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11786 (discriminator 1)
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAlloc
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:133
|
||||
virDomainDiskDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:4790
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11797
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virXPathNodeSet
|
||||
/home/berrange/src/virt/libvirt/src/util/virxml.c:609
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11805
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
!virAllocN
|
||||
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
|
||||
virDomainDefParseXML
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11808 (discriminator 1)
|
||||
virDomainDefParseNode
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12677
|
||||
virDomainDefParse
|
||||
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12621
|
||||
testCompareXMLToArgvFiles
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:107
|
||||
virtTestRun
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:266
|
||||
mymain
|
||||
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:388 (discriminator 2)
|
||||
virtTestMain
|
||||
/home/berrange/src/virt/libvirt/tests/testutils.c:791
|
||||
__libc_start_main
|
||||
??:?
|
||||
_start
|
||||
??:?
|
||||
</pre>
|
||||
|
||||
<h3><a id="noncrash">Non-crash related problems</a></h3>
|
||||
|
||||
<p>
|
||||
Not all memory allocation bugs result in code crashing. Sometimes
|
||||
the code will be silently ignoring the allocation failure, resulting
|
||||
in incorrect data being produced. For example the XML parser may
|
||||
mistakenly treat an allocation failure as indicating that an XML
|
||||
attribute was not set in the input document. It is hard to identify
|
||||
these problems from the test suite automatically. For this, the
|
||||
test suites should be run with <code>VIR_TEST_DEBUG=1</code> set
|
||||
and then stderr analysed for any unexpected data. For example,
|
||||
the XML conversion may show an embedded "(null)" literal, or the
|
||||
test suite might complain about missing elements / attributes
|
||||
in the actual vs expected data. These are all signs of bugs in
|
||||
OOM handling. In the future the OOM tests will be enhanced to
|
||||
validate that an error VIR_ERR_NO_MEMORY is returned for each
|
||||
allocation failed, rather than some other error.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@@ -539,6 +539,13 @@ C <-- |32| 8 | 1 | 3 | 1 | 1 | 0 | .o.oOo | <-- S (reply)
|
||||
be part of the underlying server.
|
||||
</dd>
|
||||
|
||||
<dt><code>virNetServerMDNSPtr</code> (virnetservermdns.h)</dt>
|
||||
<dd>The virNetServerMDNS APIs are used to advertise a server
|
||||
across the local network, enabling clients to automatically
|
||||
detect the existence of remote services. This is done by
|
||||
interfacing with the Avahi mDNS advertisement service.
|
||||
</dd>
|
||||
|
||||
<dt><code>virNetServerClientPtr</code> (virnetserverclient.h)</dt>
|
||||
<dd>The virNetServerClient APIs are used to manage I/O related
|
||||
to a single client network connection. It handles initial
|
||||
|
4
docs/js/jquery-3.1.1.min.js
vendored
Normal file
4
docs/js/jquery-3.1.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
docs/js/jquery.rss.min.js
vendored
Normal file
11
docs/js/jquery.rss.min.js
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
(function(d){var e=function(a,b,c,f){this.target=a;this.url=b;this.html=[];this.effectQueue=[];this.options=d.extend({ssl:!1,host:"www.feedrapp.info",limit:null,key:null,layoutTemplate:"<ul>{entries}</ul>",entryTemplate:'<li><a href="{url}">[{author}@{date}] {title}</a><br/>{shortBodyPlain}</li>',tokens:{},outputMode:"json",dateFormat:"dddd MMM Do",dateLocale:"en",effect:"show",offsetStart:!1,offsetEnd:!1,error:function(){console.log("jQuery RSS: url doesn't link to RSS-Feed")},onData:function(){},
|
||||
success:function(){}},c||{});this.options.ssl&&"www.feedrapp.info"===this.options.host&&(this.options.host="feedrapp.herokuapp.com");this.callback=f||this.options.success};e.htmlTags="doctype,html,head,title,base,link,meta,style,script,noscript,body,article,nav,aside,section,header,footer,h1-h6,hgroup,address,p,hr,pre,blockquote,ol,ul,li,dl,dt,dd,figure,figcaption,div,table,caption,thead,tbody,tfoot,tr,th,td,col,colgroup,form,fieldset,legend,label,input,button,select,datalist,optgroup,option,textarea,keygen,output,progress,meter,details,summary,command,menu,del,ins,img,iframe,embed,object,param,video,audio,source,canvas,track,map,area,a,em,strong,i,b,u,s,small,abbr,q,cite,dfn,sub,sup,time,code,kbd,samp,var,mark,bdi,bdo,ruby,rt,rp,span,br,wbr".split(",");
|
||||
e.prototype.load=function(a){var b="http"+(this.options.ssl?"s":"")+"://"+this.options.host+"?callback=?&q="+encodeURIComponent(this.url);this.options.offsetStart&&this.options.offsetEnd&&(this.options.limit=this.options.offsetEnd);null!==this.options.limit&&(b+="&num="+this.options.limit);null!==this.options.key&&(b+="&key="+this.options.key);d.getJSON(b,a)};e.prototype.render=function(){var a=this;this.load(function(b){try{a.feed=b.responseData.feed,a.entries=b.responseData.feed.entries}catch(c){return a.entries=
|
||||
[],a.feed=null,a.options.error.call(a)}b=a.generateHTMLForEntries();a.target.append(b.layout);if(0!==b.entries.length){d.isFunction(a.options.onData)&&a.options.onData.call(a);var f=d(b.layout).is("entries")?b.layout:d("entries",b.layout);a.appendEntriesAndApplyEffects(f,b.entries)}0<a.effectQueue.length?a.executeEffectQueue(a.callback):d.isFunction(a.callback)&&a.callback.call(a)})};e.prototype.appendEntriesAndApplyEffects=function(a,b){var c=this;d.each(b,function(b,e){var d=c.wrapContent(e);"show"===
|
||||
c.options.effect?a.before(d):(d.css({display:"none"}),a.before(d),c.applyEffect(d,c.options.effect))});a.remove()};e.prototype.generateHTMLForEntries=function(){var a=this,b={entries:[],layout:null};d(this.entries).each(function(){var c=a.options.offsetStart,f=a.options.offsetEnd;c&&f?index>=c&&index<=f&&a.isRelevant(this,b.entries)&&(c=a.evaluateStringForEntry(a.options.entryTemplate,this),b.entries.push(c)):a.isRelevant(this,b.entries)&&(c=a.evaluateStringForEntry(a.options.entryTemplate,this),
|
||||
b.entries.push(c))});b.layout=this.options.entryTemplate?this.wrapContent(this.options.layoutTemplate.replace("{entries}","<entries></entries>")):this.wrapContent("<div><entries></entries></div>");return b};e.prototype.wrapContent=function(a){return 0!==d.trim(a).indexOf("<")?d("<div>"+a+"</div>"):d(a)};e.prototype.applyEffect=function(a,b,c){switch(b){case "slide":a.slideDown("slow",c);break;case "slideFast":a.slideDown(c);break;case "slideSynced":this.effectQueue.push({element:a,effect:"slide"});
|
||||
break;case "slideFastSynced":this.effectQueue.push({element:a,effect:"slideFast"})}};e.prototype.executeEffectQueue=function(a){var b=this;this.effectQueue.reverse();var c=function(){var f=b.effectQueue.pop();f?b.applyEffect(f.element,f.effect,c):a&&a()};c()};e.prototype.evaluateStringForEntry=function(a,b){var c=a,f=this;d(a.match(/(\{.*?\})/g)).each(function(){var a=this.toString();c=c.replace(a,f.getValueForToken(a,b))});return c};e.prototype.isRelevant=function(a,b){var c=this.getTokenMap(a);
|
||||
return this.options.filter?this.options.filterLimit&&this.options.filterLimit===b.length?!1:this.options.filter(a,c):!0};e.prototype.getFormattedDate=function(a){if(this.options.dateFormatFunction)return this.options.dateFormatFunction(a);return"undefined"!==typeof moment?(a=moment(new Date(a)),a=a.locale?a.locale(this.options.dateLocale):a.lang(this.options.dateLocale),a.format(this.options.dateFormat)):a};e.prototype.getTokenMap=function(a){if(!this.feedTokens){var b=JSON.parse(JSON.stringify(this.feed));
|
||||
delete b.entries;this.feedTokens=b}return d.extend({feed:this.feedTokens,url:a.link,author:a.author,date:this.getFormattedDate(a.publishedDate),title:a.title,body:a.content,shortBody:a.contentSnippet,bodyPlain:function(a){for(var a=a.content.replace(/<script[\\r\\\s\S]*<\/script>/mgi,"").replace(/<\/?[^>]+>/gi,""),b=0;b<e.htmlTags.length;b++)a=a.replace(RegExp("<"+e.htmlTags[b],"gi"),"");return a}(a),shortBodyPlain:a.contentSnippet.replace(/<\/?[^>]+>/gi,""),index:d.inArray(a,this.entries),totalEntries:this.entries.length,
|
||||
teaserImage:function(a){try{return a.content.match(/(<img.*?>)/gi)[0]}catch(b){return""}}(a),teaserImageUrl:function(a){try{return a.content.match(/(<img.*?>)/gi)[0].match(/src="(.*?)"/)[1]}catch(b){return""}}(a)},this.options.tokens)};e.prototype.getValueForToken=function(a,b){var c=this.getTokenMap(b),d=a.replace(/[\{\}]/g,""),d=c[d];if("undefined"!==typeof d)return"function"===typeof d?d(b,c):d;throw Error("Unknown token: "+a+", url:"+this.url);};d.fn.rss=function(a,b,c){(new e(this,a,b,c)).render();
|
||||
return this}})(jQuery);
|
141
docs/js/main.js
141
docs/js/main.js
@@ -1,141 +0,0 @@
|
||||
"use strict";
|
||||
|
||||
function pageload() {
|
||||
window.addEventListener("scroll", function(e){
|
||||
var distanceY = window.pageYOffset || document.documentElement.scrollTop;
|
||||
var shrinkOn = 94;
|
||||
var home = document.getElementById("home");
|
||||
var links = document.getElementById("jumplinks");
|
||||
var search = document.getElementById("search");
|
||||
var body = document.getElementById("body");
|
||||
if (distanceY > shrinkOn) {
|
||||
if (home.className != "navhide") {
|
||||
body.className = "navhide";
|
||||
home.className = "navhide";
|
||||
links.className = "navhide";
|
||||
search.className = "navhide";
|
||||
}
|
||||
} else {
|
||||
if (home.className == "navhide") {
|
||||
body.className = "";
|
||||
home.className = "";
|
||||
links.className = "";
|
||||
search.className = "";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/* Setting this class makes the advanced search options visible */
|
||||
var advancedSearch = document.getElementById("advancedsearch");
|
||||
advancedSearch.className = "advancedsearch";
|
||||
|
||||
var simpleSearch = document.getElementById("simplesearch");
|
||||
simpleSearch.addEventListener("submit", advancedsearch);
|
||||
}
|
||||
|
||||
function advancedsearch(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
var form = document.createElement("form");
|
||||
form.setAttribute("method", "get");
|
||||
|
||||
var newq = document.createElement("input");
|
||||
newq.setAttribute("type", "hidden");
|
||||
form.appendChild(newq);
|
||||
|
||||
var q = document.getElementById("searchq");
|
||||
var whats = document.getElementsByName("what");
|
||||
var what = "website";
|
||||
for (var i = 0; i < whats.length; i++) {
|
||||
if (whats[i].checked) {
|
||||
what = whats[i].value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (what == "website") {
|
||||
form.setAttribute("action", "https://google.com/search");
|
||||
newq.setAttribute("name", "q");
|
||||
newq.value = "site:libvirt.org " + q.value;
|
||||
} else if (what == "wiki") {
|
||||
form.setAttribute("action", "https://wiki.libvirt.org/index.php");
|
||||
newq.setAttribute("name", "search");
|
||||
newq.value = q.value;
|
||||
} else if (what == "devs") {
|
||||
form.setAttribute("action", "https://google.com/search");
|
||||
newq.setAttribute("name", "q");
|
||||
newq.value = "site:redhat.com/archives/libvir-list " + q.value;
|
||||
} else if (what == "users") {
|
||||
form.setAttribute("action", "https://google.com/search");
|
||||
newq.setAttribute("name", "q");
|
||||
newq.value = "site:redhat.com/archives/libvirt-users " + q.value;
|
||||
}
|
||||
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function fetchRSS() {
|
||||
if (document.location.protocol == "file:")
|
||||
return;
|
||||
|
||||
var planet = document.getElementById("planet");
|
||||
if (planet === null)
|
||||
return;
|
||||
|
||||
var req = new XMLHttpRequest();
|
||||
req.open("GET", "https://planet.virt-tools.org/atom.xml");
|
||||
req.setRequestHeader("Accept", "application/atom+xml, text/xml");
|
||||
req.onerror = function(e) {
|
||||
if (this.statusText != "")
|
||||
console.error(this);
|
||||
};
|
||||
req.onload = function(e) {
|
||||
if (this.readyState !== 4)
|
||||
return;
|
||||
|
||||
if (this.status != 200) {
|
||||
console.error(this.statusText);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.responseXML === null) {
|
||||
console.error("Atom response is not an XML");
|
||||
return;
|
||||
}
|
||||
|
||||
var dl = document.createElement("dl");
|
||||
var dateOpts = { day: "numeric", month: "short", year: "numeric"};
|
||||
|
||||
var entries = this.responseXML.querySelectorAll("feed > entry:not(:nth-of-type(1n+5))");
|
||||
|
||||
entries.forEach(function(e) {
|
||||
var name = e.querySelector("author > name").textContent;
|
||||
var title = e.querySelector("title").textContent;
|
||||
var updated = e.querySelector("updated").textContent;
|
||||
var link = e.querySelector("link").attributes.href.textContent;
|
||||
|
||||
var a = document.createElement("a");
|
||||
a.href = link;
|
||||
a.innerText = title;
|
||||
|
||||
var dt = document.createElement("dt");
|
||||
dt.appendChild(a);
|
||||
dl.appendChild(dt);
|
||||
|
||||
var date = new Date(updated);
|
||||
date = date.toLocaleDateString("default", dateOpts);
|
||||
|
||||
var dd = document.createElement("dd");
|
||||
dd.innerText = ` by ${name} on ${date}`;
|
||||
|
||||
dl.appendChild(dd);
|
||||
});
|
||||
|
||||
planet.appendChild(dl);
|
||||
};
|
||||
req.send();
|
||||
}
|
7
docs/js/moment.min.js
vendored
Normal file
7
docs/js/moment.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body class="docs">
|
||||
<h2>Knowledge base</h2>
|
||||
|
||||
<div class="panel">
|
||||
<dl>
|
||||
<dt><a href="kbase/locking.html">Disk locking</a></dt>
|
||||
<dd>Ensuring exclusive guest access to disks with
|
||||
<a href="kbase/locking-lockd.html">virtlockd</a> or
|
||||
<a href="kbase/locking-sanlock.html">Sanlock</a></dd>
|
||||
|
||||
<dt><a href="kbase/secureusage.html">Secure usage</a></dt>
|
||||
<dd>Secure usage of the libvirt APIs</dd>
|
||||
|
||||
<dt><a href="kbase/launch_security_sev.html">Launch security</a></dt>
|
||||
<dd>Securely launching VMs with AMD SEV</dd>
|
||||
|
||||
<dt><a href="kbase/domainstatecapture.html">Domain state
|
||||
capture</a></dt>
|
||||
<dd>Comparison between different methods of capturing domain
|
||||
state</dd>
|
||||
|
||||
<dt><a href="kbase/rpm-deployment.html">RPM deployment</a></dt>
|
||||
<dd>Explanation of the different RPM packages and illustration of
|
||||
which to pick for installation</dd>
|
||||
|
||||
<dt><a href="kbase/backing_chains.html">Backing chain management</a></dt>
|
||||
<dd>Explanation of how disk backing chain specification impacts libvirt's
|
||||
behaviour and basic troubleshooting steps of disk problems.</dd>
|
||||
|
||||
<dt><a href="kbase/qemu-passthrough-security.html">Security with QEMU passthrough</a></dt>
|
||||
<dd>Examination of the security protections used for QEMU and how they need
|
||||
configuring to allow use of QEMU passthrough with host files/devices.</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<br class="clear"/>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -1,212 +0,0 @@
|
||||
=================
|
||||
Disk image chains
|
||||
=================
|
||||
|
||||
Modern disk image formats allow users to create an overlay on top of an
|
||||
existing image which will be the target of the new guest writes. This allows us
|
||||
to do snapshots of the disk state of a VM efficiently. The following text
|
||||
describes how libvirt manages such image chains and some problems which can
|
||||
occur. Note that many of the cases mentioned below are currently only relevant
|
||||
for the qemu driver.
|
||||
|
||||
.. contents::
|
||||
|
||||
Domain XML image and chain specification
|
||||
========================================
|
||||
|
||||
Disk image chains can be partially or fully configured in the domain XML. The
|
||||
basic approach is to use the ``<backingStore>`` elements in the configuration.
|
||||
|
||||
The ``<backingStore>`` elements present in the live VM xml represent the actual
|
||||
topology that libvirt knows of.
|
||||
|
||||
Basic disk setup
|
||||
----------------
|
||||
|
||||
Any default configuration or example usually refers only to the top (active)
|
||||
image of the backing chain.
|
||||
|
||||
::
|
||||
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2'/>
|
||||
<source file='/tmp/pull4.qcow2'/>
|
||||
<target dev='vda' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
|
||||
</disk>
|
||||
|
||||
This configuration will prompt libvirt to detect the backing image of the source
|
||||
image and recursively do the same thing until the end of the chain.
|
||||
|
||||
Importance of properly setup backing chain
|
||||
------------------------------------------
|
||||
|
||||
The disk image locations are used by libvirt to properly setup the security
|
||||
system used on the host so that the hypervisor can access the files and possibly
|
||||
also directly to configure the hypervisor to use the appropriate images. Thus
|
||||
it's important to properly setup the formats and paths of the backing images.
|
||||
|
||||
Any externally created image should always use the -F switch of ``qemu-img``
|
||||
to specify the format of the backing file to avoid probing.
|
||||
|
||||
Image detection caveats
|
||||
-----------------------
|
||||
|
||||
Detection of the backing chain requires libvirt to read and understand the
|
||||
``backing file`` field recorded in the image metadata and also being able to
|
||||
recurse and read the backing file. Due to security implications libvirt
|
||||
will refuse to use backing images of any image whose format was not specified
|
||||
explicitly in the XML or the overlay image itself.
|
||||
|
||||
Libvirt also might lack support for a network disk storage technology and thus
|
||||
may be unable to visit and detect backing chains on such storage. This may
|
||||
result in the backing chain present in the live XML to look incomplete or some
|
||||
operations not being possible. To prevent this it's possible to specify the
|
||||
image metadata explicitly in the XML.
|
||||
|
||||
Advanced backing chain specifications
|
||||
-------------------------------------
|
||||
|
||||
To specify the topology of disk images explicitly the following XML
|
||||
specification can be used:
|
||||
|
||||
::
|
||||
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2'/>
|
||||
<source file='/tmp/pull4.qcow2'/>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/tmp/pull3.qcow2'/>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/tmp/pull2.qcow2'/>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/tmp/pull1.qcow2'/>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/tmp/pull0.qcow2'/>
|
||||
<backingStore/>
|
||||
</backingStore>
|
||||
</backingStore>
|
||||
</backingStore>
|
||||
</backingStore>
|
||||
<target dev='vda' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
|
||||
</disk>
|
||||
|
||||
This makes libvirt follow the settings as configured in the XML. Note that this
|
||||
is supported only when the https://libvirt.org/formatdomaincaps.html#featureBackingStoreInput
|
||||
capability is present.
|
||||
|
||||
An empty ``<backingStore/>`` element signals the end of the chain. Using this
|
||||
will prevent libvirt or qemu from probing the backing chain.
|
||||
|
||||
Note that it's also possible to partially specify the chain in the XML but omit
|
||||
the terminating element. This will result into probing from the last specified
|
||||
``<backingStore>``
|
||||
|
||||
Any image specified explicitly will not be probed for backing file or format.
|
||||
|
||||
|
||||
Manual image creation
|
||||
=====================
|
||||
|
||||
When creating disk images manually outside of libvirt it's important to create
|
||||
them properly so that they work with libvirt as expected. The created disk
|
||||
images must contain the format of the backing image in the metadata. This
|
||||
means that the **-F** parameter of ``qemu-img`` must always be used.
|
||||
|
||||
::
|
||||
|
||||
qemu-img -f qcow2 -F qcow2 -b /path/to/backing /path/to/overlay
|
||||
|
||||
Note that if '/path/to/backing' is relative the path is considered relative to
|
||||
the location of '/path/to/overlay'.
|
||||
|
||||
Troubleshooting
|
||||
===============
|
||||
|
||||
A few common problems which occur when managing chains of disk images.
|
||||
|
||||
VM refuses to start due to misconfigured backing store format
|
||||
-------------------------------------------------------------
|
||||
|
||||
This problem happens on VMs where the backing chain was created manually outside
|
||||
of libvirt and can have multiple symptoms:
|
||||
|
||||
- permission denied error reported on a backing image
|
||||
- ``format of backing image '%s' of image '%s' was not specified in the image metadata`` error reported
|
||||
- disk image looking corrupt inside the guest
|
||||
|
||||
The cause of the above problem is that the image metadata does not record the
|
||||
format of the backing image along with the location of the image. When the
|
||||
format is not specified libvirt or qemu would have to do image format probing
|
||||
which is insecure to do as a malicious guest could rewrite the header of the
|
||||
disk leading to access of host files. Libvirt thus does not try to assume
|
||||
the format of the backing image. The following command can be used to check if
|
||||
the image has a backing image format specified:
|
||||
|
||||
::
|
||||
|
||||
$ qemu-img info /tmp/copy4.qcow2
|
||||
image: /tmp/copy4.qcow2
|
||||
file format: qcow2
|
||||
virtual size: 10 MiB (10485760 bytes)
|
||||
disk size: 196 KiB
|
||||
cluster_size: 65536
|
||||
backing file: copy3.qcow2 (actual path: /tmp/copy3.qcow2)
|
||||
backing file format: qcow2
|
||||
Format specific information:
|
||||
compat: 1.1
|
||||
lazy refcounts: false
|
||||
refcount bits: 16
|
||||
corrupt: false
|
||||
|
||||
If the ``backing file format:`` field is missing above the format was not
|
||||
specified properly. The image can be fixed by the following command:
|
||||
|
||||
::
|
||||
|
||||
qemu-img rebase -f $IMAGE_FORMAT -F $BACKING_IMAGE_FORMAT -b $BACKING_IMAGE_PATH $IMAGE_PATH
|
||||
|
||||
It is important to fill out ``$BACKING_IMAGE_FORMAT`` and ``$IMAGE_FORMAT``
|
||||
properly. ``$BACKING_IMAGE_PATH`` should be specified as a full absolute path.
|
||||
If relative referencing of the backing image is desired, the path must be
|
||||
relative to the location of image described by ``$IMAGE_PATH``.
|
||||
|
||||
**Important:** If the ``$BACKING_IMAGE_FORMAT`` is not known it can be queried
|
||||
using ``qemu-img info $BACKING_IMAGE_PATH`` and looking for the ``file format:``
|
||||
field, but for security reasons should be used *only* if at least one of the
|
||||
following criteria is met:
|
||||
|
||||
- ``file format`` is ``raw``
|
||||
- ``backing file`` is NOT present
|
||||
- ``backing file`` is present AND is correct/trusted
|
||||
|
||||
Note that the last criteria may require manual inspection and thus should not
|
||||
be scripted unless the trust for the image can be expressed programatically.
|
||||
|
||||
Also note that the above steps may need to be repeated recursively for any
|
||||
subsequent backing images.
|
||||
|
||||
Missing images reported after after moving disk images into a different path
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
The path to the backing image which is recorded in the image metadata often
|
||||
contains a full path to the backing image. This is the default libvirt-created
|
||||
image configuration. When such images are moved to a different location the
|
||||
top image will no longer point to the correct image.
|
||||
|
||||
To fix such issue you can either fully specify the image chain in the domain XML
|
||||
as pointed out above or the following ``qemu-img`` command can be used:
|
||||
|
||||
::
|
||||
|
||||
qemu-img rebase -u -f $IMAGE_FORMAT -F $BACKING_IMAGE_FORMAT -b $BACKING_IMAGE_PATH $IMAGE_PATH
|
||||
|
||||
It is important to fill out ``$BACKING_IMAGE_FORMAT`` and ``$IMAGE_FORMAT``
|
||||
properly. ``$BACKING_IMAGE_PATH`` should be specified as a full absolute path.
|
||||
If relative referencing of the backing image is desired, the path must be
|
||||
relative to the location of image described by ``$IMAGE_PATH``.
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user