mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-04-06 18:50:25 +03:00
Compare commits
34 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
008ccd3518 | ||
|
b065df3d04 | ||
|
3dae81c8d7 | ||
|
6e147f6eac | ||
|
410dfde9bb | ||
|
312088d9b6 | ||
|
d7492f5225 | ||
|
60b37479f8 | ||
|
4c5e3b1ca0 | ||
|
ad22460a75 | ||
|
9d6e2d127e | ||
|
e677faa11e | ||
|
38d47345e2 | ||
|
edc541129f | ||
|
31896db4d5 | ||
|
4d548a2458 | ||
|
62d6794827 | ||
|
8c2872d72c | ||
|
e2c6f436dc | ||
|
eb768a556d | ||
|
2e014dfae6 | ||
|
5da6b62419 | ||
|
ee49106dbf | ||
|
081f3ec3dd | ||
|
aa3c1de260 | ||
|
93ecaec845 | ||
|
7d4de62cfa | ||
|
904b5e9d06 | ||
|
5ed5673ebf | ||
|
2c46d5c216 | ||
|
b8b60c4bee | ||
|
933494237a | ||
|
21b7b02b72 | ||
|
52638fb16a |
21
NEWS.rst
21
NEWS.rst
@ -8,6 +8,27 @@ the changes introduced by each of them.
|
||||
For a more fine-grained view, use the `git log`_.
|
||||
|
||||
|
||||
v11.3.0 (unreleased)
|
||||
====================
|
||||
|
||||
* **Security**
|
||||
|
||||
* **Removed features**
|
||||
|
||||
* Support for AppArmor versions prior to 3.0.0 has been dropped.
|
||||
|
||||
* **New features**
|
||||
|
||||
* xen: Support configuration of ``<hyperv/>`` flags for Xen domains.
|
||||
|
||||
The following flags are now configurable for Xen: ``vapic``, ``synic``,
|
||||
``stimer``, ``frequencies``, ``tlbflush`` and ``ipi``.
|
||||
|
||||
* **Improvements**
|
||||
|
||||
* **Bug fixes**
|
||||
|
||||
|
||||
v11.2.0 (2025-04-01)
|
||||
====================
|
||||
|
||||
|
@ -1,3 +1,5 @@
|
||||
.. role:: since
|
||||
|
||||
Backup XML format
|
||||
=================
|
||||
|
||||
@ -42,6 +44,25 @@ were supplied). The following child elements and attributes are supported:
|
||||
necessary to set up an NBD server that exposes the content of each disk at
|
||||
the time the backup is started.
|
||||
|
||||
In addition to the above the NBD server used for backups allows using
|
||||
``transport='fd' fdgroup='NAME'`` where ``NAME`` is the name used with
|
||||
``virDomainFDAssociate()`` to pass a pre-opened server socket file descriptor
|
||||
to qemu. :since:`Since 11.3.0`
|
||||
|
||||
Example code to pass a socket with libvirt-python bindings::
|
||||
|
||||
import socket
|
||||
import libvirt
|
||||
|
||||
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||
s.bind("/path/to/socket")
|
||||
|
||||
fdlist = [ s.fileno() ]
|
||||
|
||||
conn = libvirt.open()
|
||||
dom = conn.lookupByName("VMNAME")
|
||||
dom.FDAssociate("NAME", fdlist)
|
||||
|
||||
Note that for the QEMU hypervisor the TLS environment in controlled using
|
||||
``backup_tls_x509_cert_dir``, ``backup_tls_x509_verify``, and
|
||||
``backup_tls_x509_secret_uuid`` properties in ``/etc/libvirt/qemu.conf``.
|
||||
|
@ -2132,32 +2132,34 @@ are:
|
||||
based virtualization drivers, such as LXC.
|
||||
``hyperv``
|
||||
Enable various features improving behavior of guests running Microsoft
|
||||
Windows.
|
||||
Windows. :since:`Since 11.3.0` some of these flags are also available for
|
||||
Xen domains running Microsoft Windows.
|
||||
|
||||
=============== ====================================================================== ============================================ ========================================================================
|
||||
Feature Description Value Since
|
||||
=============== ====================================================================== ============================================ ========================================================================
|
||||
relaxed Relax constraints on timers on, off :since:`1.0.0 (QEMU 2.0)`
|
||||
vapic Enable virtual APIC on, off :since:`1.1.0 (QEMU 2.0)`
|
||||
relaxed Relax constraints on timers on, off :since:`1.0.0 (QEMU 2.0), 11.3.0 (Xen, always on)`
|
||||
vapic Enable virtual APIC on, off :since:`1.1.0 (QEMU 2.0), 11.3.0 (Xen)`
|
||||
spinlocks Enable spinlock support on, off; retries - at least 4095 :since:`1.1.0 (QEMU 2.0)`
|
||||
vpindex Virtual processor index on, off :since:`1.3.3 (QEMU 2.5)`
|
||||
vpindex Virtual processor index on, off :since:`1.3.3 (QEMU 2.5), 11.3.0 (Xen, always on)`
|
||||
runtime Processor time spent on running guest code and on behalf of guest code on, off :since:`1.3.3 (QEMU 2.5)`
|
||||
synic Enable Synthetic Interrupt Controller (SynIC) on, off :since:`1.3.3 (QEMU 2.6)`
|
||||
stimer Enable SynIC timers, optionally with Direct Mode support on, off; direct - on,off :since:`1.3.3 (QEMU 2.6), direct mode 5.7.0 (QEMU 4.1)`
|
||||
synic Enable Synthetic Interrupt Controller (SynIC) on, off :since:`1.3.3 (QEMU 2.6), 11.3.0 (Xen)`
|
||||
stimer Enable SynIC timers, optionally with Direct Mode support on, off; direct - on,off :since:`1.3.3 (QEMU 2.6), direct mode 5.7.0 (QEMU 4.1), 11.3.0 (Xen, on/off only)`
|
||||
reset Enable hypervisor reset on, off :since:`1.3.3 (QEMU 2.5)`
|
||||
vendor_id Set hypervisor vendor id on, off; value - string, up to 12 characters :since:`1.3.3 (QEMU 2.5)`
|
||||
frequencies Expose frequency MSRs on, off :since:`4.7.0 (QEMU 2.12)`
|
||||
frequencies Expose frequency MSRs on, off :since:`4.7.0 (QEMU 2.12), 11.3.0 (Xen)`
|
||||
reenlightenment Enable re-enlightenment notification on migration on, off :since:`4.7.0 (QEMU 3.0)`
|
||||
tlbflush Enable PV TLB flush support on, off; direct - on,off; extended - on,off :since:`4.7.0 (QEMU 3.0), direct and extended modes 11.0.0 (QEMU 7.1.0)`
|
||||
ipi Enable PV IPI support on, off :since:`4.10.0 (QEMU 3.1)`
|
||||
tlbflush Enable PV TLB flush support on, off; direct - on,off; extended - on,off :since:`4.7.0 (QEMU 3.0), direct and extended modes 11.0.0 (QEMU 7.1.0), 11.3.0 (Xen, on/off only)`
|
||||
ipi Enable PV IPI support on, off :since:`4.10.0 (QEMU 3.1), 11.3.0 (Xen)`
|
||||
evmcs Enable Enlightened VMCS on, off :since:`4.10.0 (QEMU 3.1)`
|
||||
avic Enable use Hyper-V SynIC with hardware APICv/AVIC on, off :since:`8.10.0 (QEMU 6.2)`
|
||||
emsr_bitmap Avoid unnecessary updates to L2 MSR Bitmap upon vmexits. on, off :since:`10.7.0 (QEMU 7.1)`
|
||||
xmm_input Enable XMM Fast Hypercall Input on, off :since:`10.7.0 (QEMU 7.1)`
|
||||
=============== ====================================================================== ============================================ ========================================================================
|
||||
|
||||
:since:`Since 8.0.0`, the hypervisor can be configured further by setting
|
||||
the ``mode`` attribute to one of the following values:
|
||||
:since:`Since 8.0.0 (QEMU) Since 11.3.0 (Xen)`, the hypervisor can be
|
||||
configured further by setting the ``mode`` attribute to one of the following
|
||||
values:
|
||||
|
||||
``custom``
|
||||
Set exactly the specified features.
|
||||
@ -5244,15 +5246,7 @@ network address by including an ``ip`` element specifying an IPv4
|
||||
address in its one mandatory attribute, ``address``. Optionally, a
|
||||
second ``ip`` element with a ``family`` attribute set to "ipv6" can be
|
||||
specified to add an IPv6 address to the interface. ``address``.
|
||||
Optionally, an address ``prefix`` can be specified. These settings are
|
||||
surprisingly **not** used by SLIRP to set the exact IP address;
|
||||
instead they are used to determine what network/subnet the guest's IP
|
||||
address should be on, and the guest will be given an address in that
|
||||
subnet, but the host portion of the address will still be "2.15". In
|
||||
the example below, for example, the guest will be given the IP address
|
||||
172.17.2.15 (**note that the '1.1' in the host portion of the address
|
||||
has been ignored**), default route of 172.17.2.2, and DNS server
|
||||
172.17.2.3.
|
||||
Optionally, an address ``prefix`` can be specified.
|
||||
|
||||
::
|
||||
|
||||
@ -5268,6 +5262,59 @@ has been ignored**), default route of 172.17.2.2, and DNS server
|
||||
</devices>
|
||||
...
|
||||
|
||||
These settings are surprisingly **not** used by SLIRP to set the exact
|
||||
IP address; instead they are used to determine what **network/subnet**
|
||||
the guest's IP address should be on, and the guest will be given an
|
||||
address in that subnet, but the host portion of the address will still
|
||||
be the host portion of "10.0.2.15" (based on the configured prefix (or
|
||||
a prefix of 24 if no prefix is specified). The DNS and default gateway
|
||||
addresses given to the guest will be similarly based on the network
|
||||
portion of the configuration-provided <ip> combined with the host
|
||||
portion of SLIRPs default settings for DNS/gateway
|
||||
(10.0.2.3/10.0.2.2). To help resolve the confusion of the previous
|
||||
sentences, the table below shows examples of the settings that will be
|
||||
provided to the guest (via a DHCP response) to use for its interface
|
||||
config (ip/prefix, DNS, default gateway) for various settings of <ip>
|
||||
element address and prefix in libvirt's <interface type='user'>
|
||||
config:
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
|
||||
* - libvirt <ip> element
|
||||
- guest ip/prefix
|
||||
- guest DNS
|
||||
- guest default gateway
|
||||
|
||||
* - (unspecified)
|
||||
- 10.0.2.15/24
|
||||
- 10.0.2.3
|
||||
- 10.0.2.2
|
||||
|
||||
* - address='172.17.1.1'
|
||||
prefix='16'
|
||||
- 172.17.2.15/16
|
||||
- 172.17.2.3
|
||||
- 172.17.2.2
|
||||
|
||||
* - address='172.17.1.1'
|
||||
prefix='24'
|
||||
- 172.17.1.15/24
|
||||
- 172.17.1.3
|
||||
- 172.17.1.2
|
||||
|
||||
* - address='172.17.1.1'
|
||||
prefix='8'
|
||||
- 172.0.2.15/16
|
||||
- 172.0.2.3
|
||||
- 172.0.2.2
|
||||
|
||||
* - address='172.17.1.1'
|
||||
prefix='23'
|
||||
- 172.17.0.15/23
|
||||
- 172.17.0.3
|
||||
- 172.17.0.2
|
||||
|
||||
Userspace connection using passt
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
@ -5309,8 +5356,10 @@ any conflict).
|
||||
Also different from SLIRP's behavior: if you do specify IP
|
||||
address(es), the exact address and netmask/prefix you specify will be
|
||||
provided to the guest (i.e. passt doesn't interpret the <ip> settings
|
||||
as a network address like SLIRP does, but as a host address). In
|
||||
example given above, the guest IP would be set to exactly 172.17.1.1.
|
||||
as a network address like SLIRP does, but as a host address). In the
|
||||
table of examples given above, the guest IP would be set to exactly
|
||||
172.17.1.1 in all cases (the DNS and default gateway will be set
|
||||
the same as they are on the host).
|
||||
|
||||
Just as with SLIRP, though, once traffic from the guest leaves the
|
||||
host towards the rest of the network, it will always appear as if it
|
||||
|
@ -1,6 +1,6 @@
|
||||
project(
|
||||
'libvirt', 'c',
|
||||
version: '11.2.0',
|
||||
version: '11.3.0',
|
||||
license: 'LGPLv2+',
|
||||
meson_version: '>= 0.56.0',
|
||||
default_options: [
|
||||
@ -926,12 +926,11 @@ if acl_dep.found()
|
||||
conf.set('WITH_LIBACL', 1)
|
||||
endif
|
||||
|
||||
apparmor_dep = dependency('libapparmor', required: get_option('apparmor'))
|
||||
apparmor_version = '3.0.0'
|
||||
apparmor_dep = dependency('libapparmor', version: '>=' + apparmor_version,
|
||||
required: get_option('apparmor'))
|
||||
if apparmor_dep.found()
|
||||
conf.set('WITH_APPARMOR', 1)
|
||||
if apparmor_dep.version().version_compare('>=3.0.0')
|
||||
conf.set('WITH_APPARMOR_3', 1)
|
||||
endif
|
||||
conf.set_quoted('APPARMOR_DIR', sysconfdir / 'apparmor.d')
|
||||
conf.set_quoted('APPARMOR_PROFILES_PATH', '/sys/kernel/security/apparmor/profiles')
|
||||
endif
|
||||
|
@ -188,7 +188,6 @@ src/qemu/qemu_migration_cookie.c
|
||||
src/qemu/qemu_migration_params.c
|
||||
src/qemu/qemu_monitor.c
|
||||
src/qemu/qemu_monitor_json.c
|
||||
src/qemu/qemu_monitor_text.c
|
||||
src/qemu/qemu_namespace.c
|
||||
src/qemu/qemu_nbdkit.c
|
||||
src/qemu/qemu_passt.c
|
||||
|
197
po/uk.po
197
po/uk.po
@ -16,7 +16,7 @@ msgstr ""
|
||||
"Project-Id-Version: libvirt 6.0.0\n"
|
||||
"Report-Msgid-Bugs-To: https://libvirt.org/bugs.html\n"
|
||||
"POT-Creation-Date: 2025-03-25 10:52+0000\n"
|
||||
"PO-Revision-Date: 2025-02-25 14:49+0000\n"
|
||||
"PO-Revision-Date: 2025-04-03 11:20+0000\n"
|
||||
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
|
||||
"Language-Team: Ukrainian <https://translate.fedoraproject.org/projects/"
|
||||
"libvirt/libvirt/uk/>\n"
|
||||
@ -26,7 +26,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 5.10\n"
|
||||
"X-Generator: Weblate 5.10.4\n"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
@ -1306,7 +1306,7 @@ msgstr "«%1$s» не є придатним допоміжним засобом
|
||||
|
||||
#, c-format
|
||||
msgid "'%1$s' is not a suitable qemu-rdp helper name"
|
||||
msgstr ""
|
||||
msgstr "«%1$s» не є придатним до використання допоміжним засобом qemu-rdp"
|
||||
|
||||
#, c-format
|
||||
msgid "'%1$s' is not supported in this QEMU binary"
|
||||
@ -1336,7 +1336,7 @@ msgstr "«%1$s» починаючи з %2$llu має лише %3$zd доступ
|
||||
|
||||
#, c-format
|
||||
msgid "'%1$s' vanished unexpectedly"
|
||||
msgstr ""
|
||||
msgstr "«%1$s» неочікувано зник"
|
||||
|
||||
msgid ""
|
||||
"'--copy-storage-synchronous-writes' requires one of '--copy-storage-all', '--"
|
||||
@ -1574,6 +1574,8 @@ msgstr "пропущено член 'return'"
|
||||
|
||||
msgid "'sheepdog' protocol is no longer supported by any hypervisor driver"
|
||||
msgstr ""
|
||||
"Підтримки протоколу «sheepdog» більше не передбачено у жодному драйвері "
|
||||
"гіпервізора"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -1994,11 +1996,11 @@ msgstr "На цій архітектурі ACPI потребує UEFI"
|
||||
|
||||
#, c-format
|
||||
msgid "ACPI table type '%1$s' is not supported"
|
||||
msgstr ""
|
||||
msgstr "Підтримки таблиць ACPI типу «%1$s» не передбачено"
|
||||
|
||||
#, c-format
|
||||
msgid "ACPI table type '%1$s' may only appear once"
|
||||
msgstr ""
|
||||
msgstr "Таблиця ACPI типу «%1$s» може з'являтися лише раз"
|
||||
|
||||
#, c-format
|
||||
msgid "AES256CBC encryption invalid keylen=%1$zu"
|
||||
@ -2120,10 +2122,10 @@ msgid "Add or remove vcpus"
|
||||
msgstr "Додати або вилучити віртуальні процесори"
|
||||
|
||||
msgid "Add or update a throttling group."
|
||||
msgstr ""
|
||||
msgstr "Додати або оновити групу регулювання."
|
||||
|
||||
msgid "Add or updte a throttling group."
|
||||
msgstr ""
|
||||
msgstr "Додати або оновити групу регулювання."
|
||||
|
||||
msgid "Added"
|
||||
msgstr "Додано"
|
||||
@ -2348,7 +2350,7 @@ msgid "Autostart"
|
||||
msgstr "Автозапуск"
|
||||
|
||||
msgid "Autostart Once:"
|
||||
msgstr ""
|
||||
msgstr "Одноразовий автозапуск:"
|
||||
|
||||
msgid "Autostart:"
|
||||
msgstr "Автозапуск:"
|
||||
@ -3261,6 +3263,8 @@ msgstr "Не вдалося знайти «iothread»: %1$u"
|
||||
#, c-format
|
||||
msgid "Cannot find CPU model with PVR 0x%1$03llx, vendor id 0x%2$02llx"
|
||||
msgstr ""
|
||||
"Не вдалося знайти модель процесора з PVR 0x%1$03llx, ідентифікатор виробника "
|
||||
"0x%2$02llx"
|
||||
|
||||
#, c-format
|
||||
msgid "Cannot find CPU model with PVR 0x%1$08x"
|
||||
@ -5760,7 +5764,7 @@ msgid "Delete a given vol."
|
||||
msgstr "Вилучити вказаний том."
|
||||
|
||||
msgid "Delete a throttling group."
|
||||
msgstr ""
|
||||
msgstr "Вилучити групу регулювання."
|
||||
|
||||
msgid "Delete an IOThread from the guest domain."
|
||||
msgstr "Вилучити потік введення-виведення з гостьового домену."
|
||||
@ -6234,7 +6238,7 @@ msgstr "Домен «%1$s» позначений як домен з автоза
|
||||
|
||||
#, c-format
|
||||
msgid "Domain '%1$s' marked as autostarted on next boot\n"
|
||||
msgstr ""
|
||||
msgstr "Домен «%1$s» позначено на автозапуск при наступному завантаженні\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Domain '%1$s' resumed\n"
|
||||
@ -6266,7 +6270,7 @@ msgstr "Домен «%1$s» не позначений як домен з авт
|
||||
|
||||
#, c-format
|
||||
msgid "Domain '%1$s' unmarked as autostarted on next boot\n"
|
||||
msgstr ""
|
||||
msgstr "Позначення «%1$s» для автозапуску знято для наступного завантаження\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Domain '%1$s' was reset\n"
|
||||
@ -7407,7 +7411,7 @@ msgstr "Не вдалося з'єднати сокет з «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Failed to connect to dbus-daemon: %1$s"
|
||||
msgstr ""
|
||||
msgstr "Не вдалося встановити з'єднання з dbus-daemon: %1$s"
|
||||
|
||||
msgid "Failed to connect to mon socket"
|
||||
msgstr "Не вдалося встановити з'єднання з сокетом mon"
|
||||
@ -7601,7 +7605,7 @@ msgstr "Не вдалося створити резервне сховище н
|
||||
|
||||
#, c-format
|
||||
msgid "Failed to create rdp state dir %1$s"
|
||||
msgstr ""
|
||||
msgstr "Не вдалося створити каталог стану rdp %1$s"
|
||||
|
||||
msgid "Failed to create reboot thread, killing domain"
|
||||
msgstr ""
|
||||
@ -8378,6 +8382,7 @@ msgstr "Помилка позначення домену «%1$s» як доме
|
||||
#, c-format
|
||||
msgid "Failed to mark domain '%1$s' as autostarted on next boot"
|
||||
msgstr ""
|
||||
"Не вдалося позначити домен «%1$s» для автозапуску при наступному завантаженні"
|
||||
|
||||
#, c-format
|
||||
msgid "Failed to mkdir %1$s"
|
||||
@ -9348,6 +9353,8 @@ msgstr "Помилка зняття позначки домену «%1$s» як
|
||||
#, c-format
|
||||
msgid "Failed to unmark domain '%1$s' as autostarted on next boot"
|
||||
msgstr ""
|
||||
"Не вдалося зняти позначення домену «%1$s» для автозапуску при наступному "
|
||||
"завантаженні"
|
||||
|
||||
#, c-format
|
||||
msgid "Failed to unmarshall reply: %1$s"
|
||||
@ -9738,7 +9745,7 @@ msgid "GNUTLS call error"
|
||||
msgstr "помилка виклику GNUTLS"
|
||||
|
||||
msgid "Get a throttling group."
|
||||
msgstr ""
|
||||
msgstr "Отримати групу регулювання."
|
||||
|
||||
msgid "Get block device size info for a domain."
|
||||
msgstr "Отримати дані щодо розміру блокового пристрою для домену."
|
||||
@ -9817,7 +9824,7 @@ msgid "Get the CPU models for an arch."
|
||||
msgstr "Отримати дані щодо моделей процесорів для архітектури."
|
||||
|
||||
msgid "Get the CPU models reported by the hypervisor."
|
||||
msgstr ""
|
||||
msgstr "Отримати моделі процесорів, про які повідомляє гіпервізор."
|
||||
|
||||
msgid "Get the launch security parameters for a guest domain"
|
||||
msgstr "Отримати параметри безпеки запуску для гостьового домену"
|
||||
@ -9840,7 +9847,7 @@ msgid "Get the summary of block devices for a domain."
|
||||
msgstr "Отримати резюме щодо блокових пристроїв для домену."
|
||||
|
||||
msgid "Get the summary of throttle groups for a domain."
|
||||
msgstr ""
|
||||
msgstr "Отримати резюме груп регулювання для домену."
|
||||
|
||||
msgid "Get the summary of virtual interfaces for a domain."
|
||||
msgstr "Отримати резюме щодо віртуальних інтерфейсів домену."
|
||||
@ -10101,7 +10108,7 @@ msgstr ""
|
||||
"машини «%2$s»"
|
||||
|
||||
msgid "Hypervisor reported CPU models"
|
||||
msgstr ""
|
||||
msgstr "Гіпервізор повідомив про моделі процесорів"
|
||||
|
||||
msgid "I/O Error"
|
||||
msgstr "Помилка в/в"
|
||||
@ -10226,6 +10233,8 @@ msgid ""
|
||||
"IOThread mapping for virtio-scsi controllers is not available with this QEMU "
|
||||
"binary"
|
||||
msgstr ""
|
||||
"Прив'язка IOThread для контролерів virtio-scsi є недоступною для цього "
|
||||
"виконуваного файла QEMU"
|
||||
|
||||
msgid "IOThread to be used by supported device"
|
||||
msgstr "IOThread, який буде використано підтримуваним пристроєм"
|
||||
@ -10879,7 +10888,7 @@ msgstr "Некоректний тип драйвера: %1$d"
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid dump_image_format '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Некоректне значення dump_image_format «%1$s»"
|
||||
|
||||
msgid "Invalid duration"
|
||||
msgstr "Неприпустиме значення тривалості"
|
||||
@ -10961,7 +10970,7 @@ msgstr "Некоректний метод перевірки ключів осн
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid host_data provided. Expected '%1$ld' bytes"
|
||||
msgstr ""
|
||||
msgstr "Надано некоректне значення host_data. Мало бути «%1$ld» байтів"
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid hostdev protocol '%1$s'"
|
||||
@ -10969,7 +10978,7 @@ msgstr "Некоректний протокол пристрою основно
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid image_format '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Некоректне значення image_format «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid integer value '%1$s' in file '%2$s'"
|
||||
@ -11195,7 +11204,7 @@ msgstr "Некоректний засіб спостереження resctrl"
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid save_image_format '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Некоректне значення save_image_format «%1$s»"
|
||||
|
||||
msgid "Invalid secret"
|
||||
msgstr "Некоректний ключ"
|
||||
@ -11221,7 +11230,7 @@ msgstr "Некоректне значення для можливості pserie
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid snapshot_image_format '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Некоректне значення snapshot_image_format «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Invalid source mode: %1$s"
|
||||
@ -11524,7 +11533,7 @@ msgid "Kernel image path in this domain is not defined"
|
||||
msgstr "Шлях до образу ядра у цьому домені не визначено"
|
||||
|
||||
msgid "Kernel image path is not defined. With sev_snp=on, pass an igvm path"
|
||||
msgstr ""
|
||||
msgstr "Шлях до образу ядра не визначено. З sev_snp=on передано шлях igvm"
|
||||
|
||||
msgid "Key file path must be provided for private key authentication"
|
||||
msgstr ""
|
||||
@ -12367,7 +12376,7 @@ msgstr "Не вказано типу можливості"
|
||||
|
||||
#, c-format
|
||||
msgid "Missing certificate file '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Не вистачає файла сертифіката «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Missing check/@partial in CPU model %1$s"
|
||||
@ -12448,7 +12457,7 @@ msgstr "У документі JSON не вистачає даних keepaliveInt
|
||||
|
||||
#, c-format
|
||||
msgid "Missing key file '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Не вистачає файла ключа «%1$s»"
|
||||
|
||||
msgid "Missing listen element"
|
||||
msgstr "Пропущено елемент listen"
|
||||
@ -12633,7 +12642,7 @@ msgid "Missing ownerUUID data in JSON document"
|
||||
msgstr "У документі JSON не вистачає даних щодо UUID власника (ownerUUID)"
|
||||
|
||||
msgid "Missing password"
|
||||
msgstr ""
|
||||
msgstr "Не вистачає пароля"
|
||||
|
||||
msgid "Missing path or lockspace for lease resource"
|
||||
msgstr "Не вистачає шляху або простору блокування для ресурсу надання"
|
||||
@ -13869,7 +13878,7 @@ msgid "Only VNC supported"
|
||||
msgstr "Передбачено підтримку лише VNC"
|
||||
|
||||
msgid "Only a single ACPI table is supported"
|
||||
msgstr ""
|
||||
msgstr "Передбачено підтримку лише єдиної таблиці ACPI"
|
||||
|
||||
msgid "Only a single IDE controller is supported for this machine type"
|
||||
msgstr "Для цього типу архітектури передбачено лише один контролер IDE"
|
||||
@ -14329,6 +14338,8 @@ msgstr "Номер паралельного порту, %1$d, не лежить
|
||||
|
||||
msgid "Parallel save is only supported with the 'sparse' save image format"
|
||||
msgstr ""
|
||||
"Підтримку паралельного збереження передбачено лише для формату образів "
|
||||
"збереження «sparse»"
|
||||
|
||||
#, c-format
|
||||
msgid "Parameter '%1$s' is not a string"
|
||||
@ -14707,6 +14718,8 @@ msgstr "на сервері NBD QEMU не передбачено підтрим
|
||||
#, c-format
|
||||
msgid "QEMU agent command '%1$s' returned neither error nor success"
|
||||
msgstr ""
|
||||
"Команда агента QEMU «%1$s» не повернула ні повідомлення про помилку, ні "
|
||||
"повідомлення про успіх"
|
||||
|
||||
#, c-format
|
||||
msgid "QEMU binary %1$s is not executable"
|
||||
@ -14857,13 +14870,13 @@ msgstr ""
|
||||
"розширених можливостей і створення смуг"
|
||||
|
||||
msgid "RDP doesn't support 'multiUser'"
|
||||
msgstr ""
|
||||
msgstr "У RDP не передбачено підтримки «multiUser»"
|
||||
|
||||
msgid "RDP doesn't support 'replaceUser'"
|
||||
msgstr ""
|
||||
msgstr "У RDP не передбачено підтримки «replaceUser»"
|
||||
|
||||
msgid "RDP password expiration isn't supported"
|
||||
msgstr ""
|
||||
msgstr "Підтримки завершення строку дії пароля RDP не передбачено"
|
||||
|
||||
msgid "RDT Memory Bandwidth allocation unsupported"
|
||||
msgstr "Підтримки розподілу ширини каналу пам'яті RDT не передбачено"
|
||||
@ -17778,6 +17791,8 @@ msgid ""
|
||||
"The 'dev' attribute of the <source> element can only be used with "
|
||||
"<interface> type='user' or type='vhostuser' if the <backend> type='passt'"
|
||||
msgstr ""
|
||||
"Атрибут «dev» елемента <source> можна використовувати лише з <interface> "
|
||||
"type='user' або type='vhostuser', якщо для <backend> type='passt'"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -18355,10 +18370,10 @@ msgid "Thread(s) per core:"
|
||||
msgstr "Потоків на ядро:"
|
||||
|
||||
msgid "Throttle group deleted successfully\n"
|
||||
msgstr ""
|
||||
msgstr "Групу регулювання успішно вилучено\n"
|
||||
|
||||
msgid "Throttle group set successfully\n"
|
||||
msgstr ""
|
||||
msgstr "Групу регулювання успішно встановлено\n"
|
||||
|
||||
#, c-format
|
||||
msgid "Time '%1$lld' is too big for guest agent"
|
||||
@ -20236,7 +20251,7 @@ msgstr "Не вдалося прочитати файл pid «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Unable to read qemu-rdp pidfile '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "Не вдалося прочитати файл PID qemu-rdp «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "Unable to read slirp pidfile '%1$s'"
|
||||
@ -20650,7 +20665,7 @@ msgid "Unable to set thread local variable"
|
||||
msgstr "Не вдалося встановити локальний змінну потоку виконання"
|
||||
|
||||
msgid "Unable to set throttle group"
|
||||
msgstr ""
|
||||
msgstr "Не вдалося встановити групу регулювання"
|
||||
|
||||
#, c-format
|
||||
msgid "Unable to set vlan configuration on port %1$s: %2$s"
|
||||
@ -21740,7 +21755,7 @@ msgid "Unsupported object type %1$d"
|
||||
msgstr "Підтримки типів об'єктів %1$d не передбачено"
|
||||
|
||||
msgid "Unsupported qemu-rdp listen type"
|
||||
msgstr ""
|
||||
msgstr "Непідтримуваний тип очікування qemu-rdp"
|
||||
|
||||
msgid "Unsupported resctrl monitor type"
|
||||
msgstr "Непідтримуваний тип монітора resctrl"
|
||||
@ -23177,11 +23192,15 @@ msgstr "блок"
|
||||
msgid ""
|
||||
"block 'iotune' can't be used together with 'throttlefilters' for disk '%1$s'"
|
||||
msgstr ""
|
||||
"блок «iotune» не можна використовувати разом із «throttlefilters» для диска "
|
||||
"«%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
"block 'throttlefilters' can't be used together with 'iotune' for disk '%1$s'"
|
||||
msgstr ""
|
||||
"блок «throttlefilters» не можна використовувати разом із «iotune» для диска "
|
||||
"«%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "block I/O throttle limit must be no more than %1$llu using QEMU"
|
||||
@ -23567,7 +23586,7 @@ msgid "can't manipulate inactive snapshots of disk '%1$s'"
|
||||
msgstr "неможлива робота із неактивними знімками диска «%1$s»"
|
||||
|
||||
msgid "can't open log context"
|
||||
msgstr ""
|
||||
msgstr "не вдалося відкрити контекст журналу"
|
||||
|
||||
#, c-format
|
||||
msgid "can't open session to the domain with id %1$d"
|
||||
@ -23812,7 +23831,7 @@ msgid "cannot change persistent config of a transient network"
|
||||
msgstr "не можна змінювати сталі налаштування тимчасової мережі"
|
||||
|
||||
msgid "cannot change port settings on rdp graphics"
|
||||
msgstr ""
|
||||
msgstr "не вдалося змінити параметри порту для графіки rdp"
|
||||
|
||||
msgid "cannot change port settings on spice graphics"
|
||||
msgstr "не вдалося змінити параметри порту графічної системи SPICE"
|
||||
@ -25172,7 +25191,7 @@ msgid "cd: %1$s: %2$s"
|
||||
msgstr "cd: %1$s: %2$s"
|
||||
|
||||
msgid "cdrom device with throttle filters isn't supported"
|
||||
msgstr ""
|
||||
msgstr "підтримки пристрою cdrom з фільтрами регулювання не передбачено"
|
||||
|
||||
msgid "cdrom device with virtio bus isn't supported"
|
||||
msgstr "підтримки пристроїв cdrom з каналом virtio не передбачено"
|
||||
@ -25466,7 +25485,7 @@ msgstr ""
|
||||
"нульовим виявленням"
|
||||
|
||||
msgid "comma separated list of throttle groups to be applied"
|
||||
msgstr ""
|
||||
msgstr "список відокремлених комами груп регулювання, які буде застосовано"
|
||||
|
||||
msgid "command"
|
||||
msgstr "команда"
|
||||
@ -25683,7 +25702,7 @@ msgid "control domain's outgoing traffics"
|
||||
msgstr "керування вихідними даними домену"
|
||||
|
||||
msgid "control next boot state"
|
||||
msgstr ""
|
||||
msgstr "керувати станом наступного завантаження"
|
||||
|
||||
msgid "control or query domain emulator affinity"
|
||||
msgstr "вказати або визначити прив'язку у емуляторі домену"
|
||||
@ -25699,6 +25718,8 @@ msgid ""
|
||||
"controller driver 'iothread' attribute can't be used together with "
|
||||
"'iothreads' subelement"
|
||||
msgstr ""
|
||||
"атрибут «iothread» драйвера контролера не можна використовувати з разом із "
|
||||
"піделементом «iothreads»"
|
||||
|
||||
#, c-format
|
||||
msgid "controller index='%1$d' already exists"
|
||||
@ -26411,6 +26432,8 @@ msgid ""
|
||||
"dbus-daemon died and reported:\n"
|
||||
"%1$s"
|
||||
msgstr ""
|
||||
"dbus-daemon завершив роботу і повідомив:\n"
|
||||
"%1$s"
|
||||
|
||||
msgid "default"
|
||||
msgstr "типовий"
|
||||
@ -27510,11 +27533,11 @@ msgstr "дублювання домену «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "duplicate filter name '%1$s' found"
|
||||
msgstr ""
|
||||
msgstr "виявлено дублювання назви фільтра «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "duplicate group name '%1$s' found"
|
||||
msgstr ""
|
||||
msgstr "виявлено дублювання назви групи «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "duplicate iothread id '%1$u' found"
|
||||
@ -28031,6 +28054,10 @@ msgid ""
|
||||
"oldMAC: %3$s\n"
|
||||
"newMAC: %4$s\n"
|
||||
msgstr ""
|
||||
"подія «nic-mac-change» для домену «%1$s»:\n"
|
||||
"альтернатива: %2$s\n"
|
||||
"стара-MAC: %3$s\n"
|
||||
"нова-MAC: %4$s\n"
|
||||
|
||||
#, c-format
|
||||
msgid "event 'rtc-change' for domain '%1$s': %2$lld\n"
|
||||
@ -28736,7 +28763,7 @@ msgid "failed to get hostname"
|
||||
msgstr "помилка отримання назви вузла гіпервізора"
|
||||
|
||||
msgid "failed to get hypervisor CPU model names"
|
||||
msgstr ""
|
||||
msgstr "не вдалося отримати назви моделей процесорів гіпервізора"
|
||||
|
||||
msgid "failed to get hypervisor type"
|
||||
msgstr "помилка отримання типа гіпервізора"
|
||||
@ -29307,7 +29334,7 @@ msgid "failed to seek in log file %1$s"
|
||||
msgstr "не вдалося виконати позиціювання у файлі журналу %1$s"
|
||||
|
||||
msgid "failed to seek on file descriptor"
|
||||
msgstr ""
|
||||
msgstr "не вдалося виконати позиціювання на дескрипторі файла"
|
||||
|
||||
#, c-format
|
||||
msgid "failed to seek to end of %1$s"
|
||||
@ -29884,7 +29911,7 @@ msgid "format of the destination file"
|
||||
msgstr "формат файла призначення"
|
||||
|
||||
msgid "format of the save image file"
|
||||
msgstr ""
|
||||
msgstr "формат збереження файла образу"
|
||||
|
||||
#, c-format
|
||||
msgid "formatter for %1$s %2$s reported error"
|
||||
@ -30142,26 +30169,28 @@ msgstr ""
|
||||
"вистачає: %1$s"
|
||||
|
||||
msgid "guest agent command failed"
|
||||
msgstr ""
|
||||
msgstr "помилка команди агента гостьової системи"
|
||||
|
||||
#, c-format
|
||||
msgid "guest agent command failed: %1$s"
|
||||
msgstr ""
|
||||
msgstr "помилка команди агента гостьової системи: %1$s"
|
||||
|
||||
msgid "guest agent command timed out"
|
||||
msgstr ""
|
||||
msgstr "перевищено час очікування на виконання команди агента гостьової системи"
|
||||
|
||||
#, c-format
|
||||
msgid "guest agent command timed out: %1$s"
|
||||
msgstr ""
|
||||
"перевищено час очікування на виконання команди агента гостьової системи: %1$s"
|
||||
|
||||
#, c-format
|
||||
msgid "guest agent didn't respond to command within '%1$d' seconds"
|
||||
msgstr ""
|
||||
msgstr "агент гостьової системи не відповів на команду за «%1$d» секунд"
|
||||
|
||||
#, c-format
|
||||
msgid "guest agent didn't respond to synchronization within '%1$d' seconds"
|
||||
msgstr ""
|
||||
"агент гостьової системи не відповів на синхронізацію протягом %1$d секунд"
|
||||
|
||||
msgid "guest agent replied with wrong id to guest-sync command"
|
||||
msgstr ""
|
||||
@ -30632,7 +30661,7 @@ msgid "inbound rate larger than maximum %1$u"
|
||||
msgstr "вхідна швидкість перевищує максимальну, %1$u"
|
||||
|
||||
msgid "include all CPU models known to the hypervisor for the architecture"
|
||||
msgstr ""
|
||||
msgstr "включити усі моделі процесорів, відомі гіпервізору для архітектури"
|
||||
|
||||
msgid "include backup size estimate in XML dump"
|
||||
msgstr "включити оцінку розміру резервної копії до дампу XML"
|
||||
@ -32066,7 +32095,7 @@ msgid "list all domain blocks"
|
||||
msgstr "показати список всіх блоків"
|
||||
|
||||
msgid "list all domain throttlegroups."
|
||||
msgstr ""
|
||||
msgstr "вивести усі групи регулювання домену."
|
||||
|
||||
msgid "list all domain virtual interfaces"
|
||||
msgstr "список всіх віртуальних інтерфейсів домену"
|
||||
@ -32694,6 +32723,7 @@ msgstr "помилкове форматування слоту у даних щ
|
||||
|
||||
msgid "managed save cannot be requested for transient domains"
|
||||
msgstr ""
|
||||
"запит щодо керованого збереження не можна надсилати для тимчасових доменів"
|
||||
|
||||
msgid "managed save of a domain state"
|
||||
msgstr "кероване збереження стану домену"
|
||||
@ -33617,7 +33647,7 @@ msgid "missing gluster volume name for path '%1$s'"
|
||||
msgstr "не вказано назви тому gluster для шляху «%1$s»"
|
||||
|
||||
msgid "missing group name"
|
||||
msgstr ""
|
||||
msgstr "не вистачає назви групи"
|
||||
|
||||
#, c-format
|
||||
msgid "missing group_device value for '%1$s'"
|
||||
@ -33712,7 +33742,7 @@ msgid "missing listen element"
|
||||
msgstr "пропущено елемент listen"
|
||||
|
||||
msgid "missing listen element for VNC graphics"
|
||||
msgstr ""
|
||||
msgstr "пропущено елемент listen для графіки VNC"
|
||||
|
||||
msgid "missing listen element for spice graphics"
|
||||
msgstr "пропущено елемент очікування (listen) для графіки spice"
|
||||
@ -34790,7 +34820,7 @@ msgid "no CPUs given"
|
||||
msgstr "не вказано процесори"
|
||||
|
||||
msgid "no D-Bus address"
|
||||
msgstr ""
|
||||
msgstr "немає адреси D-Bus"
|
||||
|
||||
msgid "no FLR, PM reset or bus reset available"
|
||||
msgstr "немає FLR, доступне скидання PM чи шини"
|
||||
@ -35465,9 +35495,13 @@ msgstr "numad є недоступним для цього вузла"
|
||||
|
||||
msgid "number of IO channels to use for parallel restore"
|
||||
msgstr ""
|
||||
"кількість каналів введення-виведення для використання при паралельному "
|
||||
"відновленні"
|
||||
|
||||
msgid "number of IO channels to use for parallel save"
|
||||
msgstr ""
|
||||
"кількість каналів введення-виведення для використання при паралельному "
|
||||
"збереженні"
|
||||
|
||||
msgid "number of bytes read:"
|
||||
msgstr "кількість прочитаних байтів:"
|
||||
@ -35498,7 +35532,7 @@ msgstr ""
|
||||
"переходу до стану бездіяльності"
|
||||
|
||||
msgid "number of parallel save channels cannot be less than 1"
|
||||
msgstr ""
|
||||
msgstr "кількість каналів паралельного збереження не може бути меншою за 1"
|
||||
|
||||
msgid "number of read operations:"
|
||||
msgstr "кількість дій з читання:"
|
||||
@ -35653,6 +35687,8 @@ msgid ""
|
||||
"only 1 graphics device of each type (sdl, vnc, spice, headless, dbus, rdp) "
|
||||
"is supported"
|
||||
msgstr ""
|
||||
"передбачено підтримку лише 1 графічного пристрою кожного типу (sdl, vnc, "
|
||||
"spice, headless, dbus, rdp)"
|
||||
|
||||
msgid "only JSON objects can be top level"
|
||||
msgstr "на верхньому рівні можуть бути лише об'єкти JSON"
|
||||
@ -36060,7 +36096,7 @@ msgstr "значення параметра %1$s є занадто велики
|
||||
|
||||
#, c-format
|
||||
msgid "parameter '%1$s' is missing in reply of guest-get-load"
|
||||
msgstr ""
|
||||
msgstr "у відповіді guest-get-load не визначає параметра «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "parameter '%1$s' not supported"
|
||||
@ -36550,7 +36586,7 @@ msgid "preserve sparseness of volume"
|
||||
msgstr "зберегти розрідженість тому"
|
||||
|
||||
msgid "preserve state before shutting down"
|
||||
msgstr ""
|
||||
msgstr "зберегти стан до вимикання"
|
||||
|
||||
msgid "pretty-print any JSON output"
|
||||
msgstr "форматоване виведення для усіх виведених даних JSON"
|
||||
@ -36739,7 +36775,7 @@ msgid "qemu agent didn't return an array of keys"
|
||||
msgstr "Агентом qemu не повернуто масиву ключів"
|
||||
|
||||
msgid "qemu agent didn't return an array of loads"
|
||||
msgstr ""
|
||||
msgstr "агент qemu не повернув масиву навантажень"
|
||||
|
||||
#, c-format
|
||||
msgid "qemu didn't report thread id for vcpu '%1$zu'"
|
||||
@ -36815,18 +36851,23 @@ msgid ""
|
||||
"qemu-rdp died and reported:\n"
|
||||
"%1$s"
|
||||
msgstr ""
|
||||
"qemu-rdp завершив роботу і повернув:\n"
|
||||
"%1$s"
|
||||
|
||||
msgid "qemu-rdp does not support multiple listens for one graphics device."
|
||||
msgstr ""
|
||||
"у qemu-rdp не передбачено підтримки декількох каналів очікування для одного "
|
||||
"графічного пристрою."
|
||||
|
||||
msgid "qemu-rdp doesn't support the 'multiUser' attribute."
|
||||
msgstr ""
|
||||
msgstr "у qemu-rdp не передбачено підтримки атрибута «multiUser»."
|
||||
|
||||
msgid "qemu-rdp doesn't support the 'replaceUser' attribute."
|
||||
msgstr ""
|
||||
msgstr "у qemu-rdp не передбачено підтримки атрибута «replaceUser»."
|
||||
|
||||
msgid "qemu-rdp support requires a D-Bus bus graphics device."
|
||||
msgstr ""
|
||||
"для підтримки qemu-rdp потрібен графічний пристрій із підтримкою шини D-Bus."
|
||||
|
||||
#, c-format
|
||||
msgid "qom-get invalid object property type %1$d"
|
||||
@ -37086,11 +37127,11 @@ msgid "rawio is only supported for scsi host device"
|
||||
msgstr "підтримку rawio передбачено лише для пристроїв scsi основної системи"
|
||||
|
||||
msgid "rdp"
|
||||
msgstr ""
|
||||
msgstr "rdp"
|
||||
|
||||
#, c-format
|
||||
msgid "rdp_tls_x509_cert_dir directory '%1$s' does not exist"
|
||||
msgstr ""
|
||||
msgstr "каталогу rdp_tls_x509_cert_dir «%1$s» не існує"
|
||||
|
||||
msgid "re-initialize NVRAM from its pristine template"
|
||||
msgstr "повторно ініціалізувати NVRAM з її початкового шаблона"
|
||||
@ -37386,7 +37427,7 @@ msgid "report interface information"
|
||||
msgstr "вивести звіт щодо інтерфейсу"
|
||||
|
||||
msgid "report load averages information"
|
||||
msgstr ""
|
||||
msgstr "повідомити дані щодо середнього навантаження"
|
||||
|
||||
msgid "report only stats that are accessible instantly"
|
||||
msgstr "звітувати лише про статистичні дані, які негайно доступні"
|
||||
@ -37713,6 +37754,8 @@ msgstr "збереження скасовано"
|
||||
#, c-format
|
||||
msgid "save image format %1$s is not supported by this QEMU binary"
|
||||
msgstr ""
|
||||
"підтримки формату образу збереження «%1$s» у цьому виконуваному файлі QEMU "
|
||||
"не передбачено"
|
||||
|
||||
msgid "save image is incomplete"
|
||||
msgstr "збережений образ є неповним"
|
||||
@ -38119,10 +38162,10 @@ msgid "shares '%1$llu' must be in range [%2$llu, %3$llu]"
|
||||
msgstr "shares «%1$llu» має перебувати у діапазоні [%2$llu, %3$llu]"
|
||||
|
||||
msgid "shim is not supported by this QEMU binary"
|
||||
msgstr ""
|
||||
msgstr "підтримки shim у цьому виконуваному файлі QEMU не передбачено"
|
||||
|
||||
msgid "shim only allowed with kernel option"
|
||||
msgstr ""
|
||||
msgstr "shim можна використовувати лише з параметром ядра"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -38351,6 +38394,8 @@ msgid ""
|
||||
"source disk for '%1$s' is not a regular file, reverting to snapshot is not "
|
||||
"supported"
|
||||
msgstr ""
|
||||
"початковий диск для «%1$s» не є звичайним файлом, повернення до знімка не "
|
||||
"передбачено"
|
||||
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -38513,7 +38558,7 @@ msgid "status mismatch in event (actual 0x%1$x, expected 0x%2$x)"
|
||||
msgstr "невідповідність станів у події (маємо 0x%1$x, мало бути 0x%2$x)"
|
||||
|
||||
msgid "stop the daemon"
|
||||
msgstr ""
|
||||
msgstr "зупинити фонову службу"
|
||||
|
||||
msgid "stopped, with no saved guests"
|
||||
msgstr "зупинено без збережених гостьових систем"
|
||||
@ -39242,18 +39287,18 @@ msgstr "порогове значення як масштабоване числ
|
||||
|
||||
#, c-format
|
||||
msgid "throttle group '%1$s' is still being used by disk %2$s"
|
||||
msgstr ""
|
||||
msgstr "група регулювання «%1$s» усе ще використовує диск %2$s"
|
||||
|
||||
#, c-format
|
||||
msgid "throttle group '%1$s' not found"
|
||||
msgstr ""
|
||||
msgstr "групи регулювання «%1$s» не знайдено"
|
||||
|
||||
#, c-format
|
||||
msgid "throttle group field '%1$s' must be an integer"
|
||||
msgstr ""
|
||||
msgstr "поле групи регулювання «%1$s» має бути цілим"
|
||||
|
||||
msgid "throttle group name"
|
||||
msgstr ""
|
||||
msgstr "назва групи регулювання"
|
||||
|
||||
msgid "time to set"
|
||||
msgstr "час, який слід встановити"
|
||||
@ -40558,7 +40603,7 @@ msgstr "неочікуваний тип файлової системи %1$d"
|
||||
|
||||
#, c-format
|
||||
msgid "unexpected graphics type '%1$d'"
|
||||
msgstr ""
|
||||
msgstr "неочікуваний тип графіки «%1$d»"
|
||||
|
||||
#, c-format
|
||||
msgid "unexpected host-model CPU for %1$s architecture"
|
||||
@ -40851,15 +40896,15 @@ msgstr "невідомий тип розпізнавання %1$s"
|
||||
|
||||
#, c-format
|
||||
msgid "unknown auto_shutdown_poweroff '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "невідоме значення auto_shutdown_poweroff «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "unknown auto_shutdown_try_save '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "невідоме значення auto_shutdown_try_save «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "unknown auto_shutdown_try_shutdown '%1$s'"
|
||||
msgstr ""
|
||||
msgstr "невідоме значення auto_shutdown_try_shutdown «%1$s»"
|
||||
|
||||
#, c-format
|
||||
msgid "unknown backend source type '%1$s' for external TPM"
|
||||
@ -41439,7 +41484,7 @@ msgid "unsupported disk driver %1$s"
|
||||
msgstr "непідтримуваний драйвер диска, %1$s"
|
||||
|
||||
msgid "unsupported disk protocol"
|
||||
msgstr ""
|
||||
msgstr "непідтримуваний протокол роботи з диском"
|
||||
|
||||
#, c-format
|
||||
msgid "unsupported disk snapshot type '%1$s'"
|
||||
|
@ -68,6 +68,7 @@ virCHDomainObjPrivateFree(void *data)
|
||||
virBitmapFree(priv->autoCpuset);
|
||||
virBitmapFree(priv->autoNodeset);
|
||||
virCgroupFree(priv->cgroup);
|
||||
g_free(priv->pidfile);
|
||||
g_free(priv);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@ struct _virCHDomainObjPrivate {
|
||||
virBitmap *autoCpuset;
|
||||
virBitmap *autoNodeset;
|
||||
virCgroup *cgroup;
|
||||
char *pidfile;
|
||||
};
|
||||
|
||||
#define CH_DOMAIN_PRIVATE(vm) \
|
||||
|
@ -54,10 +54,10 @@ static int
|
||||
virCHEventStopProcess(virDomainObj *vm,
|
||||
virDomainShutoffReason reason)
|
||||
{
|
||||
virCHDriver *driver = ((virCHDomainObjPrivate *)vm->privateData)->driver;
|
||||
virCHDriver *driver = CH_DOMAIN_PRIVATE(vm)->driver;
|
||||
|
||||
virObjectLock(vm);
|
||||
if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY))
|
||||
if (virDomainObjBeginJob(vm, VIR_JOB_DESTROY))
|
||||
return -1;
|
||||
virCHProcessStop(driver, vm, reason);
|
||||
virDomainObjEndJob(vm);
|
||||
@ -97,7 +97,6 @@ virCHProcessEvent(virCHMonitor *mon,
|
||||
case VIR_CH_EVENT_VM_BOOTING:
|
||||
case VIR_CH_EVENT_VM_BOOTED:
|
||||
case VIR_CH_EVENT_VM_REBOOTING:
|
||||
case VIR_CH_EVENT_VM_REBOOTED:
|
||||
case VIR_CH_EVENT_VM_PAUSING:
|
||||
case VIR_CH_EVENT_VM_PAUSED:
|
||||
case VIR_CH_EVENT_VM_RESUMING:
|
||||
@ -109,15 +108,16 @@ virCHProcessEvent(virCHMonitor *mon,
|
||||
case VIR_CH_EVENT_VM_DELETED:
|
||||
break;
|
||||
case VIR_CH_EVENT_VMM_SHUTDOWN:
|
||||
case VIR_CH_EVENT_VM_SHUTDOWN:
|
||||
if (virCHEventStopProcess(vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN)) {
|
||||
VIR_WARN("Failed to mark the VM(%s) as SHUTDOWN!",
|
||||
vm->def->name);
|
||||
ret = -1;
|
||||
}
|
||||
break;
|
||||
case VIR_CH_EVENT_VM_SHUTDOWN:
|
||||
case VIR_CH_EVENT_VM_REBOOTED:
|
||||
virObjectLock(vm);
|
||||
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
|
||||
virCHProcessUpdateInfo(vm);
|
||||
virObjectUnlock(vm);
|
||||
break;
|
||||
case VIR_CH_EVENT_LAST:
|
||||
@ -297,7 +297,7 @@ int
|
||||
virCHStartEventHandler(virCHMonitor *mon)
|
||||
{
|
||||
g_autofree char *name = NULL;
|
||||
name = g_strdup_printf("ch-evt-%d", mon->pid);
|
||||
name = g_strdup_printf("ch-evt-%d", mon->vm->pid);
|
||||
|
||||
virObjectRef(mon);
|
||||
if (virThreadCreateFull(&mon->event_handler_thread,
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
#include "datatypes.h"
|
||||
#include "ch_conf.h"
|
||||
#include "ch_domain.h"
|
||||
#include "ch_events.h"
|
||||
#include "ch_interface.h"
|
||||
#include "ch_monitor.h"
|
||||
@ -37,6 +38,7 @@
|
||||
#include "virfile.h"
|
||||
#include "virjson.h"
|
||||
#include "virlog.h"
|
||||
#include "virpidfile.h"
|
||||
#include "virstring.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_CH
|
||||
@ -154,7 +156,7 @@ virCHMonitorBuildPayloadJson(virJSONValue *content, virDomainDef *vmdef)
|
||||
buf = g_base64_decode(vmdef->sec->data.sev_snp.host_data, &len);
|
||||
if (len != host_data_len) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Invalid host_data provided. Expected '%1$ld' bytes"),
|
||||
_("Invalid host_data provided. Expected '%1$zu' bytes"),
|
||||
host_data_len);
|
||||
return -1;
|
||||
}
|
||||
@ -582,10 +584,12 @@ chMonitorCreateSocket(const char *socket_path)
|
||||
virCHMonitor *
|
||||
virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile)
|
||||
{
|
||||
virCHDomainObjPrivate *priv = vm->privateData;
|
||||
g_autoptr(virCHMonitor) mon = NULL;
|
||||
g_autoptr(virCommand) cmd = NULL;
|
||||
int socket_fd = 0;
|
||||
int event_monitor_fd;
|
||||
int rv;
|
||||
|
||||
if (virCHMonitorInitialize() < 0)
|
||||
return NULL;
|
||||
@ -644,6 +648,7 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile)
|
||||
virCommandSetErrorFD(cmd, &logfile);
|
||||
virCommandNonblockingFDs(cmd);
|
||||
virCommandSetUmask(cmd, 0x002);
|
||||
|
||||
socket_fd = chMonitorCreateSocket(mon->socketpath);
|
||||
if (socket_fd < 0) {
|
||||
virReportSystemError(errno,
|
||||
@ -655,13 +660,26 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg, int logfile)
|
||||
virCommandAddArg(cmd, "--api-socket");
|
||||
virCommandAddArgFormat(cmd, "fd=%d", socket_fd);
|
||||
virCommandPassFD(cmd, socket_fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
|
||||
|
||||
virCommandAddArg(cmd, "--event-monitor");
|
||||
virCommandAddArgFormat(cmd, "path=%s", mon->eventmonitorpath);
|
||||
virCommandSetPidFile(cmd, priv->pidfile);
|
||||
virCommandDaemonize(cmd);
|
||||
|
||||
/* launch Cloud-Hypervisor socket */
|
||||
if (virCommandRunAsync(cmd, &mon->pid) < 0)
|
||||
if (virCommandRun(cmd, NULL) < 0) {
|
||||
VIR_DEBUG("CH vm=%p name=%s failed to spawn",
|
||||
vm, vm->def->name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((rv = virPidFileReadPath(priv->pidfile, &vm->pid)) < 0) {
|
||||
virReportSystemError(-rv,
|
||||
_("Domain %1$s didn't show up"),
|
||||
vm->def->name);
|
||||
return NULL;
|
||||
}
|
||||
VIR_DEBUG("CH vm=%p name=%s running with pid=%lld",
|
||||
vm, vm->def->name, (long long)vm->pid);
|
||||
|
||||
/* open the reader end of fifo before start Event Handler */
|
||||
while ((event_monitor_fd = open(mon->eventmonitorpath, O_RDONLY)) < 0) {
|
||||
@ -709,12 +727,6 @@ void virCHMonitorClose(virCHMonitor *mon)
|
||||
if (!mon)
|
||||
return;
|
||||
|
||||
if (mon->pid > 0) {
|
||||
/* try cleaning up the Cloud-Hypervisor process */
|
||||
virProcessAbort(mon->pid);
|
||||
mon->pid = 0;
|
||||
}
|
||||
|
||||
if (mon->handle)
|
||||
curl_easy_cleanup(mon->handle);
|
||||
|
||||
@ -1127,7 +1139,7 @@ virCHMonitorBuildRestoreJson(virDomainDef *vmdef,
|
||||
g_autoptr(virJSONValue) nets = virJSONValueNewArray();
|
||||
for (i = 0; i < vmdef->nnets; i++) {
|
||||
g_autoptr(virJSONValue) net_json = virJSONValueNewObject();
|
||||
g_autofree char *id = g_strdup_printf("%s_%ld", CH_NET_ID_PREFIX, i);
|
||||
g_autofree char *id = g_strdup_printf("%s_%zu", CH_NET_ID_PREFIX, i);
|
||||
if (virJSONValueObjectAppendString(net_json, "id", id) < 0)
|
||||
return -1;
|
||||
if (virJSONValueObjectAppendNumberInt(net_json, "num_fds", vmdef->nets[i]->driver.virtio.queues))
|
||||
|
@ -108,8 +108,6 @@ struct _virCHMonitor {
|
||||
size_t buf_fill_sz;
|
||||
} event_buffer;
|
||||
|
||||
pid_t pid;
|
||||
|
||||
virDomainObj *vm;
|
||||
|
||||
size_t nthreads;
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "virjson.h"
|
||||
#include "virlog.h"
|
||||
#include "virnuma.h"
|
||||
#include "virpidfile.h"
|
||||
#include "virstring.h"
|
||||
#include "ch_interface.h"
|
||||
#include "ch_hostdev.h"
|
||||
@ -130,7 +131,7 @@ virCHProcessUpdateConsole(virDomainObj *vm,
|
||||
virCHProcessUpdateConsoleDevice(vm, config, "serial");
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
virCHProcessUpdateInfo(virDomainObj *vm)
|
||||
{
|
||||
g_autoptr(virJSONValue) info = NULL;
|
||||
@ -429,8 +430,8 @@ virCHProcessSetupVcpus(virDomainObj *vm)
|
||||
size_t i;
|
||||
|
||||
if ((vm->def->cputune.period || vm->def->cputune.quota) &&
|
||||
!virCgroupHasController(((virCHDomainObjPrivate *) vm->privateData)->
|
||||
cgroup, VIR_CGROUP_CONTROLLER_CPU)) {
|
||||
!virCgroupHasController(CH_DOMAIN_PRIVATE(vm)->cgroup,
|
||||
VIR_CGROUP_CONTROLLER_CPU)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("cgroup cpu is required for scheduler tuning"));
|
||||
return -1;
|
||||
@ -700,7 +701,7 @@ chProcessAddNetworkDevices(virCHDriver *driver,
|
||||
VIR_DEBUG("payload sent with net-add request to CH = %s", payload);
|
||||
|
||||
virBufferAsprintf(&buf, "%s", virBufferCurrentContent(&http_headers));
|
||||
virBufferAsprintf(&buf, "Content-Length: %ld\r\n\r\n", strlen(payload));
|
||||
virBufferAsprintf(&buf, "Content-Length: %zu\r\n\r\n", strlen(payload));
|
||||
virBufferAsprintf(&buf, "%s", payload);
|
||||
payload_len = virBufferUse(&buf);
|
||||
payload = virBufferContentAndReset(&buf);
|
||||
@ -850,6 +851,21 @@ virCHProcessPrepareHost(virCHDriver *driver, virDomainObj *vm)
|
||||
if (virCHHostdevPrepareDomainDevices(driver, vm->def, hostdev_flags) < 0)
|
||||
return -1;
|
||||
|
||||
VIR_FREE(priv->pidfile);
|
||||
if (!(priv->pidfile = virPidFileBuildPath(cfg->stateDir, vm->def->name))) {
|
||||
virReportSystemError(errno, "%s",
|
||||
_("Failed to build pidfile path."));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlink(priv->pidfile) < 0 &&
|
||||
errno != ENOENT) {
|
||||
virReportSystemError(errno,
|
||||
_("Cannot remove stale PID file %1$s"),
|
||||
priv->pidfile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Ensure no historical cgroup for this VM is lying around */
|
||||
VIR_DEBUG("Ensuring no historical cgroup is lying around");
|
||||
virDomainCgroupRemoveCgroup(vm, priv->cgroup, priv->machineName);
|
||||
@ -941,7 +957,6 @@ virCHProcessStart(virCHDriver *driver,
|
||||
}
|
||||
}
|
||||
|
||||
vm->pid = priv->monitor->pid;
|
||||
vm->def->id = vm->pid;
|
||||
priv->machineName = virCHDomainGetMachineName(vm);
|
||||
|
||||
@ -1008,6 +1023,7 @@ virCHProcessStop(virCHDriver *driver,
|
||||
virErrorPreserveLast(&orig_err);
|
||||
|
||||
if (priv->monitor) {
|
||||
virProcessAbort(vm->pid);
|
||||
g_clear_pointer(&priv->monitor, virCHMonitorClose);
|
||||
}
|
||||
|
||||
@ -1035,6 +1051,15 @@ virCHProcessStop(virCHDriver *driver,
|
||||
vm->def->id = -1;
|
||||
g_clear_pointer(&priv->machineName, g_free);
|
||||
|
||||
if (priv->pidfile) {
|
||||
if (unlink(priv->pidfile) < 0 &&
|
||||
errno != ENOENT)
|
||||
VIR_WARN("Failed to remove PID file for %s: %s",
|
||||
vm->def->name, g_strerror(errno));
|
||||
|
||||
g_clear_pointer(&priv->pidfile, g_free);
|
||||
}
|
||||
|
||||
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
|
||||
|
||||
virHostdevReAttachDomainDevices(driver->hostdevMgr, CH_DRIVER_NAME, def,
|
||||
@ -1092,7 +1117,6 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
|
||||
}
|
||||
}
|
||||
|
||||
vm->pid = priv->monitor->pid;
|
||||
vm->def->id = vm->pid;
|
||||
priv->machineName = virCHDomainGetMachineName(vm);
|
||||
|
||||
@ -1106,7 +1130,7 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
|
||||
virBufferAddLit(&http_headers, "Host: localhost\r\n");
|
||||
virBufferAddLit(&http_headers, "Content-Type: application/json\r\n");
|
||||
virBufferAsprintf(&buf, "%s", virBufferCurrentContent(&http_headers));
|
||||
virBufferAsprintf(&buf, "Content-Length: %ld\r\n\r\n", strlen(payload));
|
||||
virBufferAsprintf(&buf, "Content-Length: %zu\r\n\r\n", strlen(payload));
|
||||
virBufferAsprintf(&buf, "%s", payload);
|
||||
payload_len = virBufferUse(&buf);
|
||||
payload = virBufferContentAndReset(&buf);
|
||||
|
@ -36,3 +36,5 @@ int virCHProcessSetupVcpu(virDomainObj *vm,
|
||||
int virCHProcessStartRestore(virCHDriver *driver,
|
||||
virDomainObj *vm,
|
||||
const char *from);
|
||||
|
||||
int virCHProcessUpdateInfo(virDomainObj *vm);
|
||||
|
@ -228,7 +228,7 @@ virDomainBackupDefParseXML(xmlXPathContextPtr ctxt,
|
||||
|
||||
def->server = g_new0(virStorageNetHostDef, 1);
|
||||
|
||||
if (virDomainStorageNetworkParseHost(node, def->server) < 0)
|
||||
if (virDomainStorageNetworkParseHost(node, def->server, true) < 0)
|
||||
return NULL;
|
||||
|
||||
if (def->server->transport == VIR_STORAGE_NET_HOST_TRANS_RDMA) {
|
||||
@ -388,6 +388,7 @@ virDomainBackupDefFormat(virBuffer *buf,
|
||||
if (def->server->port)
|
||||
virBufferAsprintf(&serverAttrBuf, " port='%u'", def->server->port);
|
||||
virBufferEscapeString(&serverAttrBuf, " socket='%s'", def->server->socket);
|
||||
virBufferEscapeString(&serverAttrBuf, " fdgroup='%s'", def->server->fdgroup);
|
||||
}
|
||||
|
||||
virXMLFormatElement(&childBuf, "server", &serverAttrBuf, NULL);
|
||||
|
@ -6014,58 +6014,81 @@ virDomainHostdevSubsysPCIDefParseXML(xmlNodePtr node,
|
||||
|
||||
int
|
||||
virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
|
||||
virStorageNetHostDef *host)
|
||||
virStorageNetHostDef *host,
|
||||
bool allow_fd)
|
||||
{
|
||||
int ret = -1;
|
||||
g_autofree char *transport = NULL;
|
||||
g_autofree char *port = NULL;
|
||||
|
||||
memset(host, 0, sizeof(*host));
|
||||
g_autofree char *socket = NULL;
|
||||
|
||||
if (virXMLPropEnumDefault(hostnode, "transport",
|
||||
virStorageNetHostTransportTypeFromString,
|
||||
VIR_XML_PROP_NONE,
|
||||
&host->transport,
|
||||
VIR_STORAGE_NET_HOST_TRANS_TCP) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
VIR_STORAGE_NET_HOST_TRANS_TCP) < 0)
|
||||
return -1;
|
||||
|
||||
host->socket = virXMLPropString(hostnode, "socket");
|
||||
socket = virXMLPropString(hostnode, "socket");
|
||||
|
||||
if (host->transport == VIR_STORAGE_NET_HOST_TRANS_UNIX &&
|
||||
host->socket == NULL) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("missing socket for unix transport"));
|
||||
goto cleanup;
|
||||
}
|
||||
switch (host->transport) {
|
||||
case VIR_STORAGE_NET_HOST_TRANS_UNIX:
|
||||
if (!socket) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("missing socket for unix transport"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (host->transport != VIR_STORAGE_NET_HOST_TRANS_UNIX &&
|
||||
host->socket != NULL) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("transport '%1$s' does not support socket attribute"),
|
||||
transport);
|
||||
goto cleanup;
|
||||
}
|
||||
host->socket = g_steal_pointer(&socket);
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_TCP:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_RDMA: {
|
||||
g_autofree char *portstr = NULL;
|
||||
unsigned int port = 0;
|
||||
|
||||
if (socket) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("transport '%1$s' does not support socket attribute"),
|
||||
virStorageNetHostTransportTypeToString(host->transport));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((portstr = virXMLPropString(hostnode, "port")) &&
|
||||
virStringParsePort(portstr, &port) < 0)
|
||||
return -1;
|
||||
|
||||
if (host->transport != VIR_STORAGE_NET_HOST_TRANS_UNIX) {
|
||||
if (!(host->name = virXMLPropString(hostnode, "name"))) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("missing name for host"));
|
||||
goto cleanup;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((port = virXMLPropString(hostnode, "port"))) {
|
||||
if (virStringParsePort(port, &host->port) < 0)
|
||||
goto cleanup;
|
||||
host->port = port;
|
||||
}
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_FD:
|
||||
if (!allow_fd) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("transport 'fd' is now allowed"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (socket) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("transport '%1$s' does not support socket attribute"),
|
||||
virStorageNetHostTransportTypeToString(host->transport));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(host->fdgroup = virXMLPropStringRequired(hostnode, "fdgroup")))
|
||||
return -1;
|
||||
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_LAST:
|
||||
break;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
if (ret < 0)
|
||||
virStorageNetHostDefClear(host);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -6089,7 +6112,7 @@ virDomainStorageNetworkParseHosts(xmlNodePtr node,
|
||||
*nhosts = nhostnodes;
|
||||
|
||||
for (i = 0; i < nhostnodes; i++) {
|
||||
if (virDomainStorageNetworkParseHost(hostnodes[i], *hosts + i) < 0)
|
||||
if (virDomainStorageNetworkParseHost(hostnodes[i], *hosts + i, false) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -4024,7 +4024,8 @@ virDomainDiskByTarget(virDomainDef *def,
|
||||
|
||||
void virDomainDiskInsert(virDomainDef *def, virDomainDiskDef *disk);
|
||||
int virDomainStorageNetworkParseHost(xmlNodePtr hostnode,
|
||||
virStorageNetHostDef *host);
|
||||
virStorageNetHostDef *host,
|
||||
bool allow_fd);
|
||||
int virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt,
|
||||
virDomainDiskDef *def,
|
||||
const virDomainDef *vmdef);
|
||||
|
@ -562,7 +562,7 @@ virDomainDiskDefValidateSourceChainOne(const virStorageSource *src)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (src->dataFileStore->dataFileStore || src->backingStore) {
|
||||
if (src->dataFileStore->dataFileStore || src->dataFileStore->backingStore) {
|
||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||
_("The <source> of <dataStore> can't have another nested <dataStore> or <backingStore> element"));
|
||||
return -1;
|
||||
|
@ -90,6 +90,12 @@
|
||||
<ref name="absFilePath"/>
|
||||
</attribute>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name="transport">
|
||||
<value>fd</value>
|
||||
</attribute>
|
||||
<attribute name="fdgroup"/>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
<ref name="backupDisksPull"/>
|
||||
|
@ -97,6 +97,7 @@ VIR_ENUM_IMPL(virStorageNetHostTransport,
|
||||
"tcp",
|
||||
"unix",
|
||||
"rdma",
|
||||
"fd",
|
||||
);
|
||||
|
||||
|
||||
@ -141,17 +142,6 @@ virStorageSourceHasBacking(const virStorageSource *src)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
virStorageNetHostDefClear(virStorageNetHostDef *def)
|
||||
{
|
||||
if (!def)
|
||||
return;
|
||||
|
||||
VIR_FREE(def->name);
|
||||
VIR_FREE(def->socket);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
virStorageNetHostDefFree(size_t nhosts,
|
||||
virStorageNetHostDef *hosts)
|
||||
@ -161,8 +151,12 @@ virStorageNetHostDefFree(size_t nhosts,
|
||||
if (!hosts)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nhosts; i++)
|
||||
virStorageNetHostDefClear(&hosts[i]);
|
||||
for (i = 0; i < nhosts; i++) {
|
||||
g_free(hosts[i].name);
|
||||
g_free(hosts[i].socket);
|
||||
g_free(hosts[i].fdgroup);
|
||||
g_free(hosts[i].qemu_fdname);
|
||||
}
|
||||
|
||||
g_free(hosts);
|
||||
}
|
||||
|
@ -141,6 +141,7 @@ typedef enum {
|
||||
VIR_STORAGE_NET_HOST_TRANS_TCP,
|
||||
VIR_STORAGE_NET_HOST_TRANS_UNIX,
|
||||
VIR_STORAGE_NET_HOST_TRANS_RDMA,
|
||||
VIR_STORAGE_NET_HOST_TRANS_FD,
|
||||
|
||||
VIR_STORAGE_NET_HOST_TRANS_LAST
|
||||
} virStorageNetHostTransport;
|
||||
@ -154,6 +155,9 @@ struct _virStorageNetHostDef {
|
||||
unsigned int port;
|
||||
virStorageNetHostTransport transport;
|
||||
char *socket; /* path to unix socket */
|
||||
|
||||
char *fdgroup;
|
||||
char *qemu_fdname; /* name used with 'getfd' to pass to qemu - internal */
|
||||
};
|
||||
|
||||
|
||||
@ -502,9 +506,6 @@ virSecurityDeviceLabelDef *
|
||||
virStorageSourceGetSecurityLabelDef(virStorageSource *src,
|
||||
const char *model);
|
||||
|
||||
void
|
||||
virStorageNetHostDefClear(virStorageNetHostDef *def);
|
||||
|
||||
void
|
||||
virStorageNetHostDefFree(size_t nhosts,
|
||||
virStorageNetHostDef *hosts);
|
||||
|
@ -4792,18 +4792,20 @@ esxConnectListAllDomains(virConnectPtr conn,
|
||||
virtualMachine = virtualMachine->_next) {
|
||||
g_autofree char *name = NULL;
|
||||
|
||||
if (needIdentity) {
|
||||
if (esxVI_GetVirtualMachineIdentity(virtualMachine, &id,
|
||||
&name, uuid) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
/* If the lookup of the required properties fails for some of the machines
|
||||
* in the list it's preferrable to return the valid objects instead of
|
||||
* failing outright */
|
||||
if ((needIdentity && esxVI_GetVirtualMachineIdentity(virtualMachine, &id, &name, uuid) < 0) ||
|
||||
(needPowerState && esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0)) {
|
||||
|
||||
if (needPowerState) {
|
||||
if (esxVI_GetVirtualMachinePowerState(virtualMachine,
|
||||
&powerState) < 0) {
|
||||
/* Raise error only if we didn't successfuly fill any domain */
|
||||
if (count == 0 && !virtualMachine->_next)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* failure to fetch information of a single VM must not interrupt
|
||||
* the lookup of the rest */
|
||||
virResetLastError();
|
||||
continue;
|
||||
}
|
||||
|
||||
/* filter by active state */
|
||||
|
@ -1153,7 +1153,6 @@ virStorageFileFeatureTypeFromString;
|
||||
virStorageFileFeatureTypeToString;
|
||||
virStorageFileFormatTypeFromString;
|
||||
virStorageFileFormatTypeToString;
|
||||
virStorageNetHostDefClear;
|
||||
virStorageNetHostDefCopy;
|
||||
virStorageNetHostDefFree;
|
||||
virStorageNetHostTransportTypeFromString;
|
||||
|
@ -582,6 +582,107 @@ libxlMakeDomBuildInfo(virDomainDef *def,
|
||||
VIR_TRISTATE_SWITCH_ON);
|
||||
#endif
|
||||
|
||||
#ifdef LIBXL_HAVE_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE
|
||||
if (def->features[VIR_DOMAIN_FEATURE_HYPERV] != VIR_DOMAIN_HYPERV_MODE_NONE) {
|
||||
libxl_bitmap_alloc(ctx, &b_info->u.hvm.viridian_enable,
|
||||
LIBXL_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE_WIDTH);
|
||||
|
||||
switch ((virDomainHyperVMode) def->features[VIR_DOMAIN_FEATURE_HYPERV]) {
|
||||
case VIR_DOMAIN_HYPERV_MODE_CUSTOM:
|
||||
/* Base is required by Xen to enable any other flag */
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_BASE);
|
||||
/* Enable crash ctl register by default to allow guest logs to reach Xen */
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_CRASH_CTL);
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_MODE_PASSTHROUGH:
|
||||
libxl_bitmap_set_any(&b_info->u.hvm.viridian_enable);
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_MODE_NONE:
|
||||
case VIR_DOMAIN_HYPERV_MODE_LAST:
|
||||
default:
|
||||
virReportEnumRangeError(virDomainHyperVMode,
|
||||
def->features[VIR_DOMAIN_FEATURE_HYPERV]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < VIR_DOMAIN_HYPERV_LAST; i++) {
|
||||
switch ((virDomainHyperv) i) {
|
||||
case VIR_DOMAIN_HYPERV_VPINDEX:
|
||||
case VIR_DOMAIN_HYPERV_RELAXED:
|
||||
/* Already set by base flag */
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_SYNIC:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_SYNIC);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_STIMER:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
/* STIMER implies synic and clock features */
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_STIMER);
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_SYNIC);
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_TIME_REF_COUNT);
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_REFERENCE_TSC);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_VAPIC:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_APIC_ASSIST);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_FREQUENCIES:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_FREQ);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_TLBFLUSH:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_REMOTE_TLB_FLUSH);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_IPI:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
libxl_bitmap_set(&b_info->u.hvm.viridian_enable,
|
||||
LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_IPI);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_SPINLOCKS:
|
||||
case VIR_DOMAIN_HYPERV_VENDOR_ID:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
const char *name = virDomainHypervTypeToString(i);
|
||||
VIR_WARN("Hyper-v flag '%s' specified per-domain but is a global Xen setting and will be ignored.", name);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_RUNTIME:
|
||||
case VIR_DOMAIN_HYPERV_RESET:
|
||||
case VIR_DOMAIN_HYPERV_REENLIGHTENMENT:
|
||||
case VIR_DOMAIN_HYPERV_EVMCS:
|
||||
case VIR_DOMAIN_HYPERV_AVIC:
|
||||
case VIR_DOMAIN_HYPERV_EMSR_BITMAP:
|
||||
case VIR_DOMAIN_HYPERV_XMM_INPUT:
|
||||
if (def->hyperv_features[i] == VIR_TRISTATE_SWITCH_ON) {
|
||||
const char *name = virDomainHypervTypeToString(i);
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("Hyper-v enlightenment feature '%1$s' is not supported for Xen domains."), name);
|
||||
}
|
||||
break;
|
||||
case VIR_DOMAIN_HYPERV_LAST:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* copy the table path to acpi_firmware */
|
||||
if (def->os.nacpiTables)
|
||||
b_info->u.hvm.acpi_firmware = g_strdup(def->os.acpiTables[0]->path);
|
||||
|
@ -27,7 +27,6 @@ qemu_driver_sources = [
|
||||
'qemu_migration_params.c',
|
||||
'qemu_monitor.c',
|
||||
'qemu_monitor_json.c',
|
||||
'qemu_monitor_text.c',
|
||||
'qemu_namespace.c',
|
||||
'qemu_nbdkit.c',
|
||||
'qemu_passt.c',
|
||||
|
@ -87,6 +87,7 @@ qemuBackupPrepare(virDomainBackupDef *def)
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_RDMA:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_FD:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_LAST:
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("unexpected transport in <domainbackup>"));
|
||||
@ -760,6 +761,7 @@ qemuBackupBegin(virDomainObj *vm,
|
||||
bool reuse = (flags & VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL);
|
||||
int rc = 0;
|
||||
int ret = -1;
|
||||
g_autoptr(qemuFDPassDirect) fdpass = NULL;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_BACKUP_BEGIN_REUSE_EXTERNAL, -1);
|
||||
|
||||
@ -846,6 +848,29 @@ qemuBackupBegin(virDomainObj *vm,
|
||||
|
||||
priv->backup = g_steal_pointer(&def);
|
||||
|
||||
if (pull && priv->backup->server->fdgroup) {
|
||||
virStorageSourceFDTuple *fdt = NULL;
|
||||
VIR_AUTOCLOSE fdcopy = -1;
|
||||
|
||||
if (!(fdt = virHashLookup(priv->fds, priv->backup->server->fdgroup))) {
|
||||
virReportError(VIR_ERR_INVALID_ARG,
|
||||
_("file descriptor group '%1$s' was not associated with the domain"),
|
||||
priv->backup->server->fdgroup);
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (fdt->nfds != 1) {
|
||||
virReportError(VIR_ERR_INVALID_ARG,
|
||||
_("file descriptor group '%1$s' must contain only 1 file descriptor for NBD server"),
|
||||
priv->backup->server->fdgroup);
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
priv->backup->server->qemu_fdname = g_strdup("libvirt-backup-nbd");
|
||||
fdcopy = dup(fdt->fds[0]);
|
||||
fdpass = qemuFDPassDirectNew(priv->backup->server->qemu_fdname, &fdcopy);
|
||||
}
|
||||
|
||||
if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_BACKUP) < 0)
|
||||
goto endjob;
|
||||
|
||||
@ -856,6 +881,9 @@ qemuBackupBegin(virDomainObj *vm,
|
||||
if (rc == 0 && tlsProps)
|
||||
rc = qemuMonitorAddObject(priv->mon, &tlsProps, &tlsAlias);
|
||||
|
||||
if (rc == 0 && fdpass)
|
||||
rc = qemuFDPassDirectTransferMonitor(fdpass, priv->mon);
|
||||
|
||||
if (rc == 0) {
|
||||
if ((rc = qemuMonitorNBDServerStart(priv->mon, priv->backup->server, tlsAlias)) == 0)
|
||||
nbd_running = true;
|
||||
|
@ -266,6 +266,7 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDef *host)
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_RDMA:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_FD:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_LAST:
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("transport protocol '%1$s' is not yet supported"),
|
||||
|
@ -717,7 +717,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
|
||||
"machine-i8042-opt", /* QEMU_CAPS_MACHINE_I8042_OPT */
|
||||
|
||||
/* 465 */
|
||||
"snapshot-internal-qmp", /* QEMU_CAPS_SNAPSHOT_INTERNAL_QMP */
|
||||
"snapshot-internal-qmp", /* X_QEMU_CAPS_SNAPSHOT_INTERNAL_QMP */
|
||||
"chardev-reconnect-miliseconds", /* QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS */
|
||||
"virtio-ccw.loadparm", /* QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM */
|
||||
"netdev-stream-reconnect-miliseconds", /* QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS */
|
||||
@ -1251,7 +1251,6 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
|
||||
{ "query-stats", QEMU_CAPS_QUERY_STATS },
|
||||
{ "query-stats-schemas", QEMU_CAPS_QUERY_STATS_SCHEMAS },
|
||||
{ "display-reload", QEMU_CAPS_DISPLAY_RELOAD },
|
||||
{ "snapshot-save", QEMU_CAPS_SNAPSHOT_INTERNAL_QMP },
|
||||
{ "blockdev-set-active", QEMU_CAPS_BLOCKDEV_SET_ACTIVE },
|
||||
};
|
||||
|
||||
|
@ -698,7 +698,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
|
||||
QEMU_CAPS_MACHINE_I8042_OPT, /* -machine xxx,i8042=on/off; use virQEMUCapsSupportsI8042Toggle() to query this capability */
|
||||
|
||||
/* 465 */
|
||||
QEMU_CAPS_SNAPSHOT_INTERNAL_QMP, /* internal snapshot support via QMP commands 'snapshot-save'/'snapshot-delete' */
|
||||
X_QEMU_CAPS_SNAPSHOT_INTERNAL_QMP, /* internal snapshot support via QMP commands 'snapshot-save'/'snapshot-delete' */
|
||||
QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for chardevs supported */
|
||||
QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM, /* loadparm available on CCW device for multi device boot */
|
||||
QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for netdev stream supported */
|
||||
|
@ -10685,12 +10685,6 @@ qemuBuildCommandLine(virDomainObj *vm,
|
||||
if (qemuBuildSecCommandLine(vm, cmd, def->sec) < 0)
|
||||
return NULL;
|
||||
|
||||
/* Internal snapshot reversion happens via QMP command after startup if
|
||||
* supported */
|
||||
if (snapshot &&
|
||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP))
|
||||
virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
|
||||
|
||||
if (def->namespaceData) {
|
||||
qemuDomainXmlNsDef *qemuxmlns;
|
||||
GStrv n;
|
||||
|
@ -5321,8 +5321,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriver *driver,
|
||||
*/
|
||||
if (origCPU) {
|
||||
virCPUDefFree(def->cpu);
|
||||
if (!(def->cpu = virCPUDefCopy(origCPU)))
|
||||
return -1;
|
||||
def->cpu = virCPUDefCopy(origCPU);
|
||||
}
|
||||
|
||||
if (def->cpu &&
|
||||
@ -9354,8 +9353,8 @@ qemuDomainSaveCookieNew(virDomainObj *vm)
|
||||
if (!(cookie = virObjectNew(qemuDomainSaveCookieClass)))
|
||||
return NULL;
|
||||
|
||||
if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu)))
|
||||
return NULL;
|
||||
if (priv->origCPU)
|
||||
cookie->cpu = virCPUDefCopy(vm->def->cpu);
|
||||
|
||||
cookie->slirpHelper = qemuDomainGetSlirpHelperOk(vm);
|
||||
|
||||
|
@ -28,7 +28,6 @@
|
||||
|
||||
#include "qemu_alias.h"
|
||||
#include "qemu_monitor.h"
|
||||
#include "qemu_monitor_text.h"
|
||||
#include "qemu_monitor_json.h"
|
||||
#include "qemu_domain.h"
|
||||
#include "qemu_capabilities.h"
|
||||
@ -80,7 +79,7 @@ VIR_LOG_INIT("qemu.qemu_monitor");
|
||||
_("monitor must not be NULL")); \
|
||||
exit; \
|
||||
} \
|
||||
VIR_DEBUG("mon:%p vm:%p fd:%d", mon, mon->vm, mon->fd); \
|
||||
VIR_DEBUG("mon:%p vm:%p monfd:%d", mon, mon->vm, mon->fd); \
|
||||
} while (0)
|
||||
|
||||
/* Check monitor and return NULL on error */
|
||||
@ -2745,30 +2744,6 @@ qemuMonitorDelObject(qemuMonitor *mon,
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorCreateSnapshot(qemuMonitor *mon, const char *name)
|
||||
{
|
||||
VIR_DEBUG("name=%s", name);
|
||||
|
||||
QEMU_CHECK_MONITOR(mon);
|
||||
|
||||
/* there won't ever be a direct QMP replacement for this function */
|
||||
return qemuMonitorTextCreateSnapshot(mon, name);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name)
|
||||
{
|
||||
VIR_DEBUG("name=%s", name);
|
||||
|
||||
QEMU_CHECK_MONITOR(mon);
|
||||
|
||||
/* there won't ever be a direct QMP replacement for this function */
|
||||
return qemuMonitorTextDeleteSnapshot(mon, name);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorSnapshotSave(qemuMonitor *mon,
|
||||
const char *jobname,
|
||||
|
@ -976,9 +976,6 @@ int qemuMonitorDelObject(qemuMonitor *mon,
|
||||
const char *objalias,
|
||||
bool report_error);
|
||||
|
||||
int qemuMonitorCreateSnapshot(qemuMonitor *mon, const char *name);
|
||||
int qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name);
|
||||
|
||||
int qemuMonitorTransaction(qemuMonitor *mon, virJSONValue **actions)
|
||||
ATTRIBUTE_NONNULL(2);
|
||||
int qemuMonitorBlockdevMirror(qemuMonitor *mon,
|
||||
|
@ -6323,6 +6323,24 @@ qemuMonitorJSONBuildUnixSocketAddress(const char *path)
|
||||
}
|
||||
|
||||
|
||||
static virJSONValue *
|
||||
qemuMonitorJSONBuildFDSocketAddress(const char *name)
|
||||
{
|
||||
g_autoptr(virJSONValue) addr = NULL;
|
||||
g_autoptr(virJSONValue) data = NULL;
|
||||
|
||||
if (virJSONValueObjectAdd(&data, "s:str", name, NULL) < 0)
|
||||
return NULL;
|
||||
|
||||
if (virJSONValueObjectAdd(&addr,
|
||||
"s:type", "fd",
|
||||
"a:data", &data, NULL) < 0)
|
||||
return NULL;
|
||||
|
||||
return g_steal_pointer(&addr);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuMonitorJSONNBDServerStart(qemuMonitor *mon,
|
||||
const virStorageNetHostDef *server,
|
||||
@ -6341,6 +6359,9 @@ qemuMonitorJSONNBDServerStart(qemuMonitor *mon,
|
||||
case VIR_STORAGE_NET_HOST_TRANS_UNIX:
|
||||
addr = qemuMonitorJSONBuildUnixSocketAddress(server->socket);
|
||||
break;
|
||||
case VIR_STORAGE_NET_HOST_TRANS_FD:
|
||||
addr = qemuMonitorJSONBuildFDSocketAddress(server->qemu_fdname);
|
||||
break;
|
||||
case VIR_STORAGE_NET_HOST_TRANS_RDMA:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_LAST:
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
|
@ -1,88 +0,0 @@
|
||||
/*
|
||||
* qemu_monitor_text.c: interaction with QEMU monitor console
|
||||
*
|
||||
* Copyright (C) 2006-2014 Red Hat, Inc.
|
||||
* Copyright (C) 2006 Daniel P. Berrange
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
||||
#include "qemu_monitor_text.h"
|
||||
#include "qemu_monitor_json.h"
|
||||
#include "virlog.h"
|
||||
#include "virerror.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
||||
|
||||
VIR_LOG_INIT("qemu.qemu_monitor_text");
|
||||
|
||||
int
|
||||
qemuMonitorTextCreateSnapshot(qemuMonitor *mon,
|
||||
const char *name)
|
||||
{
|
||||
g_autofree char *cmd = NULL;
|
||||
g_autofree char *reply = NULL;
|
||||
|
||||
cmd = g_strdup_printf("savevm \"%s\"", name);
|
||||
|
||||
if (qemuMonitorJSONHumanCommand(mon, cmd, -1, &reply))
|
||||
return -1;
|
||||
|
||||
if (strstr(reply, "Error while creating snapshot") ||
|
||||
strstr(reply, "Could not open VM state file") ||
|
||||
strstr(reply, "State blocked by non-migratable device") ||
|
||||
strstr(reply, "Error: ") ||
|
||||
(strstr(reply, "Error") && strstr(reply, "while writing VM"))) {
|
||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||
_("Failed to take snapshot: %1$s"), reply);
|
||||
return -1;
|
||||
} else if (strstr(reply, "No block device can accept snapshots")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("this domain does not have a device to take snapshots"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qemuMonitorTextDeleteSnapshot(qemuMonitor *mon, const char *name)
|
||||
{
|
||||
g_autofree char *cmd = NULL;
|
||||
g_autofree char *reply = NULL;
|
||||
|
||||
cmd = g_strdup_printf("delvm \"%s\"", name);
|
||||
if (qemuMonitorJSONHumanCommand(mon, cmd, -1, &reply))
|
||||
return -1;
|
||||
|
||||
if (strstr(reply, "No block device supports snapshots")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||
_("this domain does not have a device to delete snapshots"));
|
||||
return -1;
|
||||
} else if (strstr(reply, "Snapshots not supported on device")) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s", reply);
|
||||
return -1;
|
||||
} else if (strstr(reply, "Error: ") ||
|
||||
(strstr(reply, "Error") &&
|
||||
strstr(reply, "while deleting snapshot"))) {
|
||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||
_("Failed to delete snapshot: %1$s"), reply);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* qemu_monitor_text.h: interaction with QEMU monitor console
|
||||
*
|
||||
* Copyright (C) 2006-2009, 2011-2012 Red Hat, Inc.
|
||||
* Copyright (C) 2006 Daniel P. Berrange
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#include "qemu_monitor.h"
|
||||
|
||||
int qemuMonitorTextCreateSnapshot(qemuMonitor *mon, const char *name);
|
||||
int qemuMonitorTextDeleteSnapshot(qemuMonitor *mon, const char *name);
|
@ -8239,8 +8239,7 @@ qemuProcessLaunch(virConnectPtr conn,
|
||||
|
||||
qemuDomainVcpuPersistOrder(vm->def);
|
||||
|
||||
if (snapshot &&
|
||||
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) {
|
||||
if (snapshot) {
|
||||
VIR_DEBUG("reverting internal snapshot via QMP");
|
||||
if (qemuSnapshotInternalRevert(vm, snapshot, asyncJob) < 0)
|
||||
goto cleanup;
|
||||
|
@ -554,12 +554,12 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
|
||||
virDomainMomentObj *snap,
|
||||
unsigned int flags)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
virObjectEvent *event = NULL;
|
||||
bool resume = false;
|
||||
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
|
||||
int ret = -1;
|
||||
int rv = 0;
|
||||
g_autoptr(qemuBlockJobData) job = NULL;
|
||||
|
||||
if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0))
|
||||
goto cleanup;
|
||||
@ -581,27 +581,11 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
|
||||
}
|
||||
}
|
||||
|
||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) {
|
||||
g_autoptr(qemuBlockJobData) job = NULL;
|
||||
if (!(job = qemuSnapshotCreateActiveInternalStart(vm, snapdef)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(job = qemuSnapshotCreateActiveInternalStart(vm, snapdef)))
|
||||
goto cleanup;
|
||||
|
||||
while ((rv = qemuSnapshotCreateActiveInternalDone(vm, job)) != 1) {
|
||||
if (rv < 0 || qemuDomainObjWait(vm) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
} else {
|
||||
if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) {
|
||||
resume = false;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name);
|
||||
qemuDomainObjExitMonitor(vm);
|
||||
if (ret < 0)
|
||||
while ((rv = qemuSnapshotCreateActiveInternalDone(vm, job)) != 1) {
|
||||
if (rv < 0 || qemuDomainObjWait(vm) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -617,6 +601,8 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver,
|
||||
resume = false;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
if (resume && virDomainObjIsActive(vm) &&
|
||||
qemuProcessStartCPUs(driver, vm,
|
||||
@ -943,7 +929,6 @@ qemuSnapshotPrepare(virDomainObj *vm,
|
||||
bool *has_manual,
|
||||
unsigned int *flags)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
size_t i;
|
||||
bool active = virDomainObjIsActive(vm);
|
||||
bool reuse = (*flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0;
|
||||
@ -1064,13 +1049,6 @@ qemuSnapshotPrepare(virDomainObj *vm,
|
||||
* varstore is in qcow2 format.
|
||||
*/
|
||||
if (active && found_internal) {
|
||||
if (virDomainDefHasOldStyleUEFI(vm->def) &&
|
||||
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) {
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||
_("internal snapshots of a VM with pflash based firmware are not supported with this qemu"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (vm->def->os.loader &&
|
||||
vm->def->os.loader->nvram &&
|
||||
vm->def->os.loader->nvram->format != VIR_STORAGE_FILE_QCOW2) {
|
||||
@ -4119,22 +4097,13 @@ qemuSnapshotDiscardImpl(virDomainObj *vm,
|
||||
return -1;
|
||||
} else {
|
||||
virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap);
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
|
||||
/* Similarly as internal snapshot creation we would use a regular job
|
||||
* here so set a mask to forbid any other job. */
|
||||
qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_NONE);
|
||||
|
||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) {
|
||||
if (qemuSnapshotDiscardActiveInternal(vm, snapdef) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0)
|
||||
return -1;
|
||||
/* we continue on even in the face of error */
|
||||
qemuMonitorDeleteSnapshot(qemuDomainGetMonitor(vm), snap->def->name);
|
||||
qemuDomainObjExitMonitor(vm);
|
||||
}
|
||||
if (qemuSnapshotDiscardActiveInternal(vm, snapdef) < 0)
|
||||
return -1;
|
||||
|
||||
qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_DEFAULT_MASK);
|
||||
}
|
||||
|
@ -117,6 +117,4 @@
|
||||
deny /sys/fs/cgroup?*{,/**} wklx,
|
||||
deny /sys/fs?*{,/**} wklx,
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <abstractions/libvirt-lxc.d>
|
||||
@END_APPARMOR_3@
|
@ -190,7 +190,6 @@
|
||||
/usr/{lib,lib64}/libswtpm_libtpms.so mr,
|
||||
/usr/lib/@{multiarch}/libswtpm_libtpms.so mr,
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
# support for passt network back-end
|
||||
/usr/bin/passt Cx -> passt,
|
||||
|
||||
@ -206,7 +205,6 @@
|
||||
|
||||
include if exists <abstractions/passt>
|
||||
}
|
||||
@END_APPARMOR_3@
|
||||
|
||||
# for save and resume
|
||||
/{usr/,}bin/dash rmix,
|
||||
@ -281,6 +279,4 @@
|
||||
owner /var/lib/libvirt/qemu/nvram/*_VARS.fd rwk,
|
||||
owner /var/lib/libvirt/qemu/nvram/*_VARS.ms.fd rwk,
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <abstractions/libvirt-qemu.d>
|
||||
@END_APPARMOR_3@
|
@ -5,11 +5,6 @@ apparmor_gen_profiles = [
|
||||
'usr.sbin.virtxend',
|
||||
]
|
||||
|
||||
apparmor_gen_abstractions = [
|
||||
'libvirt-qemu',
|
||||
'libvirt-lxc',
|
||||
]
|
||||
|
||||
apparmor_gen_profiles_conf = configuration_data({
|
||||
'sysconfdir': sysconfdir,
|
||||
'sbindir': sbindir,
|
||||
@ -19,41 +14,9 @@ apparmor_gen_profiles_conf = configuration_data({
|
||||
|
||||
apparmor_dir = sysconfdir / 'apparmor.d'
|
||||
|
||||
# Our profiles use some features that only work well on AppArmor 3.x,
|
||||
# specifically the 'include if exists' directive. In order to keep
|
||||
# supporting AppArmor 2.x, the bits that are version-specific are
|
||||
# enclosed in special markers and we decide which ones to include
|
||||
# based on the AppArmor version detected on the host.
|
||||
#
|
||||
# TODO: drop the additional complexity once we no longer target
|
||||
# distros that ship AppArmor 2.x (Debian 11, Ubuntu 20.04)
|
||||
if conf.has('WITH_APPARMOR_3')
|
||||
apparmor_gen_cmd = [
|
||||
'sed',
|
||||
'-e', '/[@]BEGIN_APPARMOR_3[@]/d',
|
||||
'-e', '/[@]END_APPARMOR_3[@]/d',
|
||||
'-e', '/[@]BEGIN_APPARMOR_2[@]/,/[@]END_APPARMOR_2[@]/d',
|
||||
'@INPUT@'
|
||||
]
|
||||
else
|
||||
apparmor_gen_cmd = [
|
||||
'sed',
|
||||
'-e', '/[@]BEGIN_APPARMOR_3[@]/,/[@]END_APPARMOR_3[@]/d',
|
||||
'-e', '/[@]BEGIN_APPARMOR_2[@]/d',
|
||||
'-e', '/[@]END_APPARMOR_2[@]/d',
|
||||
'@INPUT@'
|
||||
]
|
||||
endif
|
||||
|
||||
foreach name : apparmor_gen_profiles
|
||||
tmp = configure_file(
|
||||
input: '@0@.in'.format(name),
|
||||
output: '@0@.tmp'.format(name),
|
||||
command: apparmor_gen_cmd,
|
||||
capture: true,
|
||||
)
|
||||
configure_file(
|
||||
input: tmp,
|
||||
input: '@0@.in'.format(name),
|
||||
output: name,
|
||||
configuration: apparmor_gen_profiles_conf,
|
||||
install: true,
|
||||
@ -61,29 +24,12 @@ foreach name : apparmor_gen_profiles
|
||||
)
|
||||
endforeach
|
||||
|
||||
foreach name : apparmor_gen_abstractions
|
||||
configure_file(
|
||||
input: '@0@.in'.format(name),
|
||||
output: name,
|
||||
command: apparmor_gen_cmd,
|
||||
capture: true,
|
||||
install: true,
|
||||
install_dir: apparmor_dir / 'abstractions',
|
||||
)
|
||||
endforeach
|
||||
install_data(
|
||||
[ 'libvirt-qemu', 'libvirt-lxc' ],
|
||||
install_dir: apparmor_dir / 'abstractions',
|
||||
)
|
||||
|
||||
install_data(
|
||||
[ 'TEMPLATE.qemu', 'TEMPLATE.lxc' ],
|
||||
install_dir: apparmor_dir / 'libvirt',
|
||||
)
|
||||
|
||||
if not conf.has('WITH_APPARMOR_3')
|
||||
# We only install the empty local override for AppArmor 2.x. For
|
||||
# AppArmor 3.x, upstream's preference is to avoid creating these
|
||||
# files in order to limit the amount of filesystem clutter.
|
||||
install_data(
|
||||
'usr.lib.libvirt.virt-aa-helper.local',
|
||||
install_dir: apparmor_dir / 'local',
|
||||
rename: 'usr.lib.libvirt.virt-aa-helper',
|
||||
)
|
||||
endif
|
||||
|
@ -74,10 +74,5 @@ profile virt-aa-helper @libexecdir@/virt-aa-helper {
|
||||
/**.[iI][sS][oO] r,
|
||||
/**/disk{,.*} r,
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <local/usr.lib.libvirt.virt-aa-helper>
|
||||
@END_APPARMOR_3@
|
||||
@BEGIN_APPARMOR_2@
|
||||
#include <local/usr.lib.libvirt.virt-aa-helper>
|
||||
@END_APPARMOR_2@
|
||||
}
|
||||
|
@ -144,7 +144,5 @@ profile libvirtd @sbindir@/libvirtd flags=(attach_disconnected) {
|
||||
/usr/{lib,lib64,lib/qemu,libexec,libexec/qemu}/qemu-bridge-helper rmix,
|
||||
}
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <local/usr.sbin.libvirtd>
|
||||
@END_APPARMOR_3@
|
||||
}
|
||||
|
@ -136,7 +136,5 @@ profile virtqemud @sbindir@/virtqemud flags=(attach_disconnected) {
|
||||
/usr/{lib,lib64,lib/qemu,libexec,libexec/qemu}/qemu-bridge-helper rmix,
|
||||
}
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <local/usr.sbin.virtqemud>
|
||||
@END_APPARMOR_3@
|
||||
}
|
||||
|
@ -55,7 +55,5 @@ profile virtxend @sbindir@/virtxend flags=(attach_disconnected) {
|
||||
/etc/libvirt/hooks/** rmix,
|
||||
/etc/xen/scripts/** rmix,
|
||||
|
||||
@BEGIN_APPARMOR_3@
|
||||
include if exists <local/usr.sbin.virtxend>
|
||||
@END_APPARMOR_3@
|
||||
}
|
||||
|
@ -1560,13 +1560,8 @@ main(int argc, char **argv)
|
||||
|
||||
/* create the profile from TEMPLATE */
|
||||
if (ctl->cmd == 'c' || purged) {
|
||||
g_autofree char *tmp = NULL;
|
||||
#if defined(WITH_APPARMOR_3)
|
||||
const char *ifexists = "if exists ";
|
||||
#else
|
||||
const char *ifexists = "";
|
||||
#endif
|
||||
tmp = g_strdup_printf(" #include %s<libvirt/%s.files>\n", ifexists, ctl->uuid);
|
||||
g_autofree char *tmp = g_strdup_printf(
|
||||
" #include if exists <libvirt/%s.files>\n", ctl->uuid);
|
||||
|
||||
if (ctl->dryrun) {
|
||||
vah_info(profile);
|
||||
|
@ -74,6 +74,7 @@ virStorageFileBackendGlusterInitServer(virStorageFileBackendGlusterPriv *priv,
|
||||
hoststr = host->socket;
|
||||
break;
|
||||
|
||||
case VIR_STORAGE_NET_HOST_TRANS_FD:
|
||||
case VIR_STORAGE_NET_HOST_TRANS_LAST:
|
||||
break;
|
||||
}
|
||||
|
22
tests/domainbackupxml2xmlin/backup-pull-fd.xml
Normal file
22
tests/domainbackupxml2xmlin/backup-pull-fd.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<domainbackup mode='pull'>
|
||||
<incremental>1525889631</incremental>
|
||||
<server transport='fd' fdgroup='nbdfd'/>
|
||||
<disks>
|
||||
<disk name='vda' type='file'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='hda' backup='no'/>
|
||||
<disk name='vdc' type='file' backupmode='full'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vdd' type='file' backupmode='incremental'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vde' type='file' backupmode='incremental' incremental='blah'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vdf' type='file' incremental='bleh'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
</disks>
|
||||
</domainbackup>
|
23
tests/domainbackupxml2xmlout/backup-pull-fd.xml
Normal file
23
tests/domainbackupxml2xmlout/backup-pull-fd.xml
Normal file
@ -0,0 +1,23 @@
|
||||
<domainbackup mode='pull'>
|
||||
<incremental>1525889631</incremental>
|
||||
<server transport='fd' fdgroup='nbdfd'/>
|
||||
<disks>
|
||||
<disk name='vda' backup='yes' type='file' backupmode='incremental' incremental='1525889631'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='hda' backup='no'/>
|
||||
<disk name='vdc' backup='yes' type='file' backupmode='full'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vdd' backup='yes' type='file' backupmode='incremental' incremental='1525889631'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vde' backup='yes' type='file' backupmode='incremental' incremental='blah'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vdf' backup='yes' type='file' backupmode='incremental' incremental='bleh'>
|
||||
<scratch file='/path/to/file'/>
|
||||
</disk>
|
||||
<disk name='vdextradisk' backup='no'/>
|
||||
</disks>
|
||||
</domainbackup>
|
@ -245,6 +245,7 @@ mymain(void)
|
||||
DO_TEST_BACKUP("empty");
|
||||
DO_TEST_BACKUP("backup-pull");
|
||||
DO_TEST_BACKUP("backup-pull-unix");
|
||||
DO_TEST_BACKUP("backup-pull-fd");
|
||||
DO_TEST_BACKUP("backup-pull-seclabel");
|
||||
DO_TEST_BACKUP("backup-pull-encrypted");
|
||||
DO_TEST_BACKUP("backup-push");
|
||||
|
101
tests/libxlxml2domconfigdata/viridian-hvm-full.json
Normal file
101
tests/libxlxml2domconfigdata/viridian-hvm-full.json
Normal file
@ -0,0 +1,101 @@
|
||||
{
|
||||
"c_info": {
|
||||
"type": "hvm",
|
||||
"name": "test-hvm",
|
||||
"uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b"
|
||||
},
|
||||
"b_info": {
|
||||
"max_vcpus": 4,
|
||||
"avail_vcpus": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"max_memkb": 1048576,
|
||||
"target_memkb": 1048576,
|
||||
"video_memkb": 8192,
|
||||
"shadow_memkb": 1234,
|
||||
"device_model_version": "qemu_xen",
|
||||
"device_model": "/bin/true",
|
||||
"sched_params": {
|
||||
|
||||
},
|
||||
"apic": "True",
|
||||
"acpi": "True",
|
||||
"type.hvm": {
|
||||
"pae": "True",
|
||||
"viridian_enable": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9
|
||||
],
|
||||
"vga": {
|
||||
"kind": "cirrus"
|
||||
},
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
},
|
||||
"spice": {
|
||||
|
||||
},
|
||||
"boot": "c",
|
||||
"rdm": {
|
||||
|
||||
}
|
||||
},
|
||||
"arch_arm": {
|
||||
|
||||
}
|
||||
},
|
||||
"disks": [
|
||||
{
|
||||
"pdev_path": "/var/lib/xen/images/test-hvm.img",
|
||||
"vdev": "hda",
|
||||
"backend": "qdisk",
|
||||
"format": "raw",
|
||||
"removable": 1,
|
||||
"readwrite": 1
|
||||
}
|
||||
],
|
||||
"nics": [
|
||||
{
|
||||
"devid": 0,
|
||||
"mac": "00:16:3e:66:12:b4",
|
||||
"bridge": "br0",
|
||||
"script": "/etc/xen/scripts/vif-bridge",
|
||||
"nictype": "vif_ioemu"
|
||||
}
|
||||
],
|
||||
"vfbs": [
|
||||
{
|
||||
"devid": -1,
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
}
|
||||
}
|
||||
],
|
||||
"vkbs": [
|
||||
{
|
||||
"devid": -1
|
||||
}
|
||||
],
|
||||
"on_reboot": "restart"
|
||||
}
|
45
tests/libxlxml2domconfigdata/viridian-hvm-full.xml
Normal file
45
tests/libxlxml2domconfigdata/viridian-hvm-full.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<domain type='xen'>
|
||||
<name>test-hvm</name>
|
||||
<description>None</description>
|
||||
<uuid>2147d599-9cc6-c0dc-92ab-4064b5446e9b</uuid>
|
||||
<memory>1048576</memory>
|
||||
<currentMemory>1048576</currentMemory>
|
||||
<vcpu>4</vcpu>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<clock offset='utc'/>
|
||||
<os>
|
||||
<type>hvm</type>
|
||||
<loader>/usr/lib/xen/boot/hvmloader</loader>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<features>
|
||||
<apic/>
|
||||
<acpi/>
|
||||
<pae/>
|
||||
<hyperv>
|
||||
<vapic state='on'/>
|
||||
<vpindex state='on'/>
|
||||
<synic state='on'/>
|
||||
<stimer state='on'/>
|
||||
<frequencies state='on'/>
|
||||
<tlbflush state='on'/>
|
||||
<ipi state='on'/>
|
||||
</hyperv>
|
||||
</features>
|
||||
<devices>
|
||||
<emulator>/bin/true</emulator>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu'/>
|
||||
<source file='/var/lib/xen/images/test-hvm.img'/>
|
||||
<target dev='hda'/>
|
||||
</disk>
|
||||
<interface type='bridge'>
|
||||
<source bridge='br0'/>
|
||||
<mac address='00:16:3e:66:12:b4'/>
|
||||
<script path='/etc/xen/scripts/vif-bridge'/>
|
||||
</interface>
|
||||
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
|
||||
</devices>
|
||||
</domain>
|
99
tests/libxlxml2domconfigdata/viridian-hvm.json
Normal file
99
tests/libxlxml2domconfigdata/viridian-hvm.json
Normal file
@ -0,0 +1,99 @@
|
||||
{
|
||||
"c_info": {
|
||||
"type": "hvm",
|
||||
"name": "test-hvm",
|
||||
"uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b"
|
||||
},
|
||||
"b_info": {
|
||||
"max_vcpus": 4,
|
||||
"avail_vcpus": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"max_memkb": 1048576,
|
||||
"target_memkb": 1048576,
|
||||
"video_memkb": 8192,
|
||||
"shadow_memkb": 1234,
|
||||
"device_model_version": "qemu_xen",
|
||||
"device_model": "/bin/true",
|
||||
"sched_params": {
|
||||
|
||||
},
|
||||
"apic": "True",
|
||||
"acpi": "True",
|
||||
"type.hvm": {
|
||||
"pae": "True",
|
||||
"viridian_enable": [
|
||||
0,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9
|
||||
],
|
||||
"vga": {
|
||||
"kind": "cirrus"
|
||||
},
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
},
|
||||
"spice": {
|
||||
|
||||
},
|
||||
"boot": "c",
|
||||
"rdm": {
|
||||
|
||||
}
|
||||
},
|
||||
"arch_arm": {
|
||||
|
||||
}
|
||||
},
|
||||
"disks": [
|
||||
{
|
||||
"pdev_path": "/var/lib/xen/images/test-hvm.img",
|
||||
"vdev": "hda",
|
||||
"backend": "qdisk",
|
||||
"format": "raw",
|
||||
"removable": 1,
|
||||
"readwrite": 1
|
||||
}
|
||||
],
|
||||
"nics": [
|
||||
{
|
||||
"devid": 0,
|
||||
"mac": "00:16:3e:66:12:b4",
|
||||
"bridge": "br0",
|
||||
"script": "/etc/xen/scripts/vif-bridge",
|
||||
"nictype": "vif_ioemu"
|
||||
}
|
||||
],
|
||||
"vfbs": [
|
||||
{
|
||||
"devid": -1,
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
}
|
||||
}
|
||||
],
|
||||
"vkbs": [
|
||||
{
|
||||
"devid": -1
|
||||
}
|
||||
],
|
||||
"on_reboot": "restart"
|
||||
}
|
42
tests/libxlxml2domconfigdata/viridian-hvm.xml
Normal file
42
tests/libxlxml2domconfigdata/viridian-hvm.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<domain type='xen'>
|
||||
<name>test-hvm</name>
|
||||
<description>None</description>
|
||||
<uuid>2147d599-9cc6-c0dc-92ab-4064b5446e9b</uuid>
|
||||
<memory>1048576</memory>
|
||||
<currentMemory>1048576</currentMemory>
|
||||
<vcpu>4</vcpu>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<clock offset='utc'/>
|
||||
<os>
|
||||
<type>hvm</type>
|
||||
<loader>/usr/lib/xen/boot/hvmloader</loader>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<features>
|
||||
<apic/>
|
||||
<acpi/>
|
||||
<pae/>
|
||||
<hyperv mode="custom">
|
||||
<synic state='on'/>
|
||||
<stimer state='on'/>
|
||||
<tlbflush state='on'/>
|
||||
<ipi state='on'/>
|
||||
</hyperv>
|
||||
</features>
|
||||
<devices>
|
||||
<emulator>/bin/true</emulator>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu'/>
|
||||
<source file='/var/lib/xen/images/test-hvm.img'/>
|
||||
<target dev='hda'/>
|
||||
</disk>
|
||||
<interface type='bridge'>
|
||||
<source bridge='br0'/>
|
||||
<mac address='00:16:3e:66:12:b4'/>
|
||||
<script path='/etc/xen/scripts/vif-bridge'/>
|
||||
</interface>
|
||||
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
|
||||
</devices>
|
||||
</domain>
|
155
tests/libxlxml2domconfigdata/viridian-passthrough.json
Normal file
155
tests/libxlxml2domconfigdata/viridian-passthrough.json
Normal file
@ -0,0 +1,155 @@
|
||||
{
|
||||
"c_info": {
|
||||
"type": "hvm",
|
||||
"name": "test-hvm",
|
||||
"uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b"
|
||||
},
|
||||
"b_info": {
|
||||
"max_vcpus": 4,
|
||||
"avail_vcpus": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3
|
||||
],
|
||||
"max_memkb": 1048576,
|
||||
"target_memkb": 1048576,
|
||||
"video_memkb": 8192,
|
||||
"shadow_memkb": 1234,
|
||||
"device_model_version": "qemu_xen",
|
||||
"device_model": "/bin/true",
|
||||
"sched_params": {
|
||||
|
||||
},
|
||||
"apic": "True",
|
||||
"acpi": "True",
|
||||
"type.hvm": {
|
||||
"pae": "True",
|
||||
"viridian_enable": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
31,
|
||||
32,
|
||||
33,
|
||||
34,
|
||||
35,
|
||||
36,
|
||||
37,
|
||||
38,
|
||||
39,
|
||||
40,
|
||||
41,
|
||||
42,
|
||||
43,
|
||||
44,
|
||||
45,
|
||||
46,
|
||||
47,
|
||||
48,
|
||||
49,
|
||||
50,
|
||||
51,
|
||||
52,
|
||||
53,
|
||||
54,
|
||||
55,
|
||||
56,
|
||||
57,
|
||||
58,
|
||||
59,
|
||||
60,
|
||||
61,
|
||||
62,
|
||||
63
|
||||
],
|
||||
"vga": {
|
||||
"kind": "cirrus"
|
||||
},
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
},
|
||||
"spice": {
|
||||
|
||||
},
|
||||
"boot": "c",
|
||||
"rdm": {
|
||||
|
||||
}
|
||||
},
|
||||
"arch_arm": {
|
||||
|
||||
}
|
||||
},
|
||||
"disks": [
|
||||
{
|
||||
"pdev_path": "/var/lib/xen/images/test-hvm.img",
|
||||
"vdev": "hda",
|
||||
"backend": "qdisk",
|
||||
"format": "raw",
|
||||
"removable": 1,
|
||||
"readwrite": 1
|
||||
}
|
||||
],
|
||||
"nics": [
|
||||
{
|
||||
"devid": 0,
|
||||
"mac": "00:16:3e:66:12:b4",
|
||||
"bridge": "br0",
|
||||
"script": "/etc/xen/scripts/vif-bridge",
|
||||
"nictype": "vif_ioemu"
|
||||
}
|
||||
],
|
||||
"vfbs": [
|
||||
{
|
||||
"devid": -1,
|
||||
"vnc": {
|
||||
"enable": "True",
|
||||
"listen": "0.0.0.0",
|
||||
"findunused": "False"
|
||||
},
|
||||
"sdl": {
|
||||
"enable": "False"
|
||||
}
|
||||
}
|
||||
],
|
||||
"vkbs": [
|
||||
{
|
||||
"devid": -1
|
||||
}
|
||||
],
|
||||
"on_reboot": "restart"
|
||||
}
|
37
tests/libxlxml2domconfigdata/viridian-passthrough.xml
Normal file
37
tests/libxlxml2domconfigdata/viridian-passthrough.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<domain type='xen'>
|
||||
<name>test-hvm</name>
|
||||
<description>None</description>
|
||||
<uuid>2147d599-9cc6-c0dc-92ab-4064b5446e9b</uuid>
|
||||
<memory>1048576</memory>
|
||||
<currentMemory>1048576</currentMemory>
|
||||
<vcpu>4</vcpu>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<clock offset='utc'/>
|
||||
<os>
|
||||
<type>hvm</type>
|
||||
<loader>/usr/lib/xen/boot/hvmloader</loader>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<features>
|
||||
<apic/>
|
||||
<acpi/>
|
||||
<pae/>
|
||||
<hyperv mode="passthrough"/>
|
||||
</features>
|
||||
<devices>
|
||||
<emulator>/bin/true</emulator>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu'/>
|
||||
<source file='/var/lib/xen/images/test-hvm.img'/>
|
||||
<target dev='hda'/>
|
||||
</disk>
|
||||
<interface type='bridge'>
|
||||
<source bridge='br0'/>
|
||||
<mac address='00:16:3e:66:12:b4'/>
|
||||
<script path='/etc/xen/scripts/vif-bridge'/>
|
||||
</interface>
|
||||
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
|
||||
</devices>
|
||||
</domain>
|
@ -211,6 +211,14 @@ mymain(void)
|
||||
DO_TEST("single-serial");
|
||||
DO_TEST("multiple-serial");
|
||||
|
||||
# ifdef LIBXL_HAVE_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE
|
||||
DO_TEST("viridian-hvm");
|
||||
DO_TEST("viridian-hvm-full");
|
||||
# if LIBXL_BUILDINFO_HVM_VIRIDIAN_ENABLE_DISABLE_WIDTH == 64
|
||||
DO_TEST("viridian-passthrough");
|
||||
# endif
|
||||
# endif
|
||||
|
||||
unlink("libxl-driver.log");
|
||||
|
||||
testXLFreeDriver(driver);
|
||||
|
@ -128,7 +128,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='virtio-ccw.loadparm'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
|
@ -201,7 +201,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
|
@ -200,7 +200,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
|
@ -132,7 +132,6 @@
|
||||
<flag name='display-reload'/>
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>6002000</version>
|
||||
<microcodeVersion>42900244</microcodeVersion>
|
||||
<package>v6.2.0</package>
|
||||
|
@ -174,7 +174,6 @@
|
||||
<flag name='display-reload'/>
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>6002000</version>
|
||||
<microcodeVersion>43100244</microcodeVersion>
|
||||
<package>v6.2.0</package>
|
||||
|
@ -151,7 +151,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7000000</version>
|
||||
<microcodeVersion>42900243</microcodeVersion>
|
||||
<package>v7.0.0</package>
|
||||
|
@ -182,7 +182,6 @@
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7000000</version>
|
||||
<microcodeVersion>43100243</microcodeVersion>
|
||||
<package>v7.0.0</package>
|
||||
|
@ -152,7 +152,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7001000</version>
|
||||
<microcodeVersion>42900244</microcodeVersion>
|
||||
<package>v7.1.0</package>
|
||||
|
@ -187,7 +187,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7001000</version>
|
||||
<microcodeVersion>43100244</microcodeVersion>
|
||||
<package>v7.1.0</package>
|
||||
|
@ -147,7 +147,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7002000</version>
|
||||
<microcodeVersion>0</microcodeVersion>
|
||||
<package>qemu-7.2.0-6.fc37</package>
|
||||
|
@ -191,7 +191,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7002000</version>
|
||||
<microcodeVersion>43100245</microcodeVersion>
|
||||
<package>v7.2.0</package>
|
||||
|
@ -191,7 +191,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>7002000</version>
|
||||
<microcodeVersion>43100245</microcodeVersion>
|
||||
<package>v7.2.0</package>
|
||||
|
@ -195,7 +195,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8000000</version>
|
||||
<microcodeVersion>43100244</microcodeVersion>
|
||||
<package>v8.0.0</package>
|
||||
|
@ -115,7 +115,6 @@
|
||||
<flag name='display-reload'/>
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8001000</version>
|
||||
<microcodeVersion>39100245</microcodeVersion>
|
||||
<package>v8.1.0</package>
|
||||
|
@ -197,7 +197,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8001000</version>
|
||||
<microcodeVersion>43100245</microcodeVersion>
|
||||
<package>v8.1.0</package>
|
||||
|
@ -162,7 +162,6 @@
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8002000</version>
|
||||
<microcodeVersion>61700246</microcodeVersion>
|
||||
<package>v8.2.0</package>
|
||||
|
@ -169,7 +169,6 @@
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8002000</version>
|
||||
<microcodeVersion>0</microcodeVersion>
|
||||
<package>qemu-8.2.0-7.fc39</package>
|
||||
|
@ -152,7 +152,6 @@
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8002000</version>
|
||||
<microcodeVersion>106300246</microcodeVersion>
|
||||
<package>v8.2.0</package>
|
||||
|
@ -116,7 +116,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8002000</version>
|
||||
<microcodeVersion>39100246</microcodeVersion>
|
||||
<package>v8.2.0</package>
|
||||
|
@ -200,7 +200,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>8002000</version>
|
||||
<microcodeVersion>43100246</microcodeVersion>
|
||||
<package>v8.2.0</package>
|
||||
|
@ -72,7 +72,6 @@
|
||||
<flag name='blockjob.backing-mask-protocol'/>
|
||||
<flag name='display-reload'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>9000000</version>
|
||||
<microcodeVersion>0</microcodeVersion>
|
||||
<package>qemu-9.0.0-1.fc40</package>
|
||||
|
@ -202,7 +202,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<version>9000000</version>
|
||||
<microcodeVersion>43100245</microcodeVersion>
|
||||
<package>v9.0.0</package>
|
||||
|
@ -160,7 +160,6 @@
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
<flag name='machine.virt.aia'/>
|
||||
<version>9001000</version>
|
||||
|
@ -125,7 +125,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='query-cpu-model-expansion.deprecated-props'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
<version>9001000</version>
|
||||
|
@ -200,7 +200,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
<version>9001000</version>
|
||||
<microcodeVersion>43100246</microcodeVersion>
|
||||
|
@ -132,7 +132,6 @@
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
|
@ -125,7 +125,6 @@
|
||||
<flag name='usb-mtp'/>
|
||||
<flag name='virtio-sound'/>
|
||||
<flag name='netdev.user'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='virtio-ccw.loadparm'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
|
@ -202,7 +202,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
|
@ -200,7 +200,6 @@
|
||||
<flag name='acpi-erst'/>
|
||||
<flag name='intel-iommu.dma-translation'/>
|
||||
<flag name='machine-i8042-opt'/>
|
||||
<flag name='snapshot-internal-qmp'/>
|
||||
<flag name='chardev-reconnect-miliseconds'/>
|
||||
<flag name='netdev-stream-reconnect-miliseconds'/>
|
||||
<flag name='migrate-incoming.exit-on-error'/>
|
||||
|
@ -27,25 +27,32 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||
-no-shutdown \
|
||||
-boot strict=on \
|
||||
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
|
||||
-blockdev '{"driver":"file","filename":"/tmp/data-file-store","node-name":"libvirt-9-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock"},"export":"Volume2/Image","node-name":"libvirt-8-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"driver":"file","filename":"/tmp/data-file-store","node-name":"libvirt-13-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock"},"export":"Volume2/Image","node-name":"libvirt-12-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-12-format","read-only":false,"driver":"qcow2","data-file":"libvirt-13-storage","file":"libvirt-12-storage"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-12-format","id":"virtio-disk0","bootindex":1}' \
|
||||
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-11-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/var/run/nbdsock"},"export":"bar","node-name":"libvirt-10-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-10-format","read-only":false,"driver":"qcow2","data-file":"libvirt-11-storage","file":"libvirt-10-storage"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x3","drive":"libvirt-10-format","id":"virtio-disk1"}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock/datafile"},"export":"Volume2/ImageDataFile","node-name":"libvirt-9-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071879","node-name":"libvirt-8-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-8-format","read-only":false,"driver":"qcow2","data-file":"libvirt-9-storage","file":"libvirt-8-storage"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x2","drive":"libvirt-8-format","id":"virtio-disk0","bootindex":1}' \
|
||||
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-7-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/var/run/nbdsock"},"export":"bar","node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-6-format","read-only":false,"driver":"qcow2","data-file":"libvirt-7-storage","file":"libvirt-6-storage"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x3","drive":"libvirt-6-format","id":"virtio-disk1"}' \
|
||||
-blockdev '{"driver":"nbd","server":{"type":"unix","path":"/path/to/sock/datafile"},"export":"Volume2/ImageDataFile","node-name":"libvirt-5-storage","read-only":false}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071879","node-name":"libvirt-4-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-4-format","read-only":false,"driver":"qcow2","data-file":"libvirt-5-storage","file":"libvirt-4-storage"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x4","drive":"libvirt-4-format","id":"virtio-disk2"}' \
|
||||
-blockdev '{"driver":"file","filename":"/tmp/data-file-store-2","node-name":"libvirt-3-storage","read-only":true}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071877","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-2-format","read-only":true,"driver":"qcow2","data-file":"libvirt-3-storage","file":"libvirt-2-storage"}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071880","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"qcow2","file":"libvirt-1-storage","backing":"libvirt-2-format"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x5","drive":"libvirt-1-format","id":"virtio-disk3"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x4","drive":"libvirt-8-format","id":"virtio-disk2"}' \
|
||||
-blockdev '{"driver":"file","filename":"/tmp/data-file-store-2","node-name":"libvirt-7-storage","read-only":true}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071877","node-name":"libvirt-6-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-6-format","read-only":true,"driver":"qcow2","data-file":"libvirt-7-storage","file":"libvirt-6-storage"}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/rhel7.1484071880","node-name":"libvirt-5-storage","auto-read-only":true,"discard":"unmap"}' \
|
||||
-blockdev '{"node-name":"libvirt-5-format","read-only":false,"driver":"qcow2","file":"libvirt-5-storage","backing":"libvirt-6-format"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x5","drive":"libvirt-5-format","id":"virtio-disk3"}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/datastore_1","aio":"native","node-name":"libvirt-4-storage","read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false}}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/base-with-data-file.qcow","aio":"native","node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false}}' \
|
||||
-blockdev '{"node-name":"libvirt-3-format","read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false},"driver":"qcow2","data-file":"libvirt-4-storage","file":"libvirt-3-storage"}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/datastore_2","aio":"native","node-name":"libvirt-2-storage","read-only":false,"discard":"unmap","cache":{"direct":true,"no-flush":false}}' \
|
||||
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/images/datastore.qcow2","aio":"native","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false}}' \
|
||||
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"discard":"unmap","cache":{"direct":true,"no-flush":false},"driver":"qcow2","data-file":"libvirt-2-storage","file":"libvirt-1-storage","backing":"libvirt-3-format"}' \
|
||||
-device '{"driver":"virtio-blk-pci","bus":"pci.0","addr":"0x6","drive":"libvirt-1-format","id":"virtio-disk4","write-cache":"on"}' \
|
||||
-audiodev '{"id":"audio1","driver":"none"}' \
|
||||
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x6"}' \
|
||||
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x7"}' \
|
||||
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
|
||||
-msg timestamp=on
|
||||
|
@ -69,6 +69,26 @@
|
||||
<target dev='vdd' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
|
||||
</disk>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2' cache='none' io='native' discard='unmap'/>
|
||||
<source file='/var/lib/libvirt/images/datastore.qcow2'>
|
||||
<dataStore type='file'>
|
||||
<format type='raw'/>
|
||||
<source file='/var/lib/libvirt/images/datastore_2'/>
|
||||
</dataStore>
|
||||
</source>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/var/lib/libvirt/images/base-with-data-file.qcow'>
|
||||
<dataStore type='file'>
|
||||
<format type='raw'/>
|
||||
<source file='/var/lib/libvirt/images/datastore_1'/>
|
||||
</dataStore>
|
||||
</source>
|
||||
</backingStore>
|
||||
<target dev='vde' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0' model='piix3-uhci'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||
</controller>
|
||||
@ -77,7 +97,7 @@
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<audio id='1' type='none'/>
|
||||
<memballoon model='virtio'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
|
||||
</memballoon>
|
||||
</devices>
|
||||
</domain>
|
||||
|
@ -62,6 +62,25 @@
|
||||
</backingStore>
|
||||
<target dev='vdd' bus='virtio'/>
|
||||
</disk>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2' cache='none' io='native' discard='unmap'/>
|
||||
<source file='/var/lib/libvirt/images/datastore.qcow2'>
|
||||
<dataStore type='file'>
|
||||
<format type='raw'/>
|
||||
<source file='/var/lib/libvirt/images/datastore_2'/>
|
||||
</dataStore>
|
||||
</source>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
<source file='/var/lib/libvirt/images/base-with-data-file.qcow'>
|
||||
<dataStore type='file'>
|
||||
<format type='raw'/>
|
||||
<source file='/var/lib/libvirt/images/datastore_1'/>
|
||||
</dataStore>
|
||||
</source>
|
||||
</backingStore>
|
||||
<target dev='vde' bus='virtio'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0'/>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<memballoon model='virtio'/>
|
||||
|
@ -8933,8 +8933,14 @@ cmdMetadata(vshControl *ctl, const vshCmd *cmd)
|
||||
g_autofree char *data = NULL;
|
||||
/* get */
|
||||
if (!(data = virDomainGetMetadata(dom, VIR_DOMAIN_METADATA_ELEMENT,
|
||||
uri, flags)))
|
||||
return false;
|
||||
uri, flags))) {
|
||||
if (virGetLastErrorCode() == VIR_ERR_NO_DOMAIN_METADATA) {
|
||||
virResetLastError();
|
||||
data = g_strdup("");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
vshPrint(ctl, "%s\n", data);
|
||||
}
|
||||
|
@ -604,8 +604,14 @@ cmdNetworkMetadata(vshControl *ctl, const vshCmd *cmd)
|
||||
|
||||
/* get */
|
||||
if (!(data = virNetworkGetMetadata(net, VIR_NETWORK_METADATA_ELEMENT,
|
||||
uri, flags)))
|
||||
return false;
|
||||
uri, flags))) {
|
||||
if (virGetLastErrorCode() == VIR_ERR_NO_NETWORK_METADATA) {
|
||||
virResetLastError();
|
||||
data = g_strdup("");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
vshPrint(ctl, "%s\n", data);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user