diff --git a/README-ru.md b/README-ru.md
index 7f790008..c95fa9b9 100644
--- a/README-ru.md
+++ b/README-ru.md
@@ -42,6 +42,7 @@ Vitastor поддерживает QEMU-драйвер, протоколы NBD и
- Установка
- [Пакеты](docs/installation/packages.ru.md)
- [Proxmox](docs/installation/proxmox.ru.md)
+ - [OpenNebula](docs/installation/opennebula.ru.md)
- [OpenStack](docs/installation/openstack.ru.md)
- [Kubernetes CSI](docs/installation/kubernetes.ru.md)
- [Сборка из исходных кодов](docs/installation/source.ru.md)
diff --git a/README.md b/README.md
index 4b3cba2c..7a32d0f3 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,7 @@ Read more details below in the documentation.
- Installation
- [Packages](docs/installation/packages.en.md)
- [Proxmox](docs/installation/proxmox.en.md)
+ - [OpenNebula](docs/installation/opennebula.en.md)
- [OpenStack](docs/installation/openstack.en.md)
- [Kubernetes CSI](docs/installation/kubernetes.en.md)
- [Building from Source](docs/installation/source.en.md)
diff --git a/docs/installation/opennebula.en.md b/docs/installation/opennebula.en.md
new file mode 100644
index 00000000..e256bd79
--- /dev/null
+++ b/docs/installation/opennebula.en.md
@@ -0,0 +1,176 @@
+[Documentation](../../README.md#documentation) → Installation → OpenNebula
+
+-----
+
+[Читать на русском](opennebula.ru.md)
+
+## Automatic Installation
+
+OpenNebula plugin is packaged as `opennebula-vitastor` Debian and RPM package since Vitastor 1.9.0. So:
+
+- Run `apt-get install opennebula-vitastor` or `yum install vitastor` after installing OpenNebula on all nodes
+- Check that it prints "OK, Vitastor OpenNebula patches successfully applied" or "OK, Vitastor OpenNebula patches are already applied"
+- If it does not, refer to [Manual Installation](#manual-installation) and apply configuration file changes manually
+- [Block VM access to Vitastor cluster](#block-vm-access-to-vitastor-cluster)
+
+## Manual Installation
+
+Install OpenNebula. Then, on each node:
+
+- Copy [opennebula/remotes](../../opennebula/remotes) into `/var/lib/one` recursively: `cp -r opennebula/remotes /var/lib/one/`
+- Copy [opennebula/sudoers.d](../../opennebula/sudoers.d) to `/etc`: `cp -r opennebula/sudoers.d /etc/`
+- Apply [downloader-vitastor.sh.diff](../../opennebula/remotes/datastore/vitastor/downloader-vitastor.sh.diff) to `/var/lib/one/remotes/datastore/downloader.sh`:
+ `patch /var/lib/one/remotes/datastore/downloader.sh < opennebula/remotes/datastore/vitastor/downloader-vitastor.sh.diff` - or read the patch and apply the same change manually
+- Add `kvm-vitastor` to `LIVE_DISK_SNAPSHOTS` in `/etc/one/vmm_exec/vmm_execrc`
+- If on Debian or Ubuntu (and AppArmor is used), add Vitastor config file path(s) to `/etc/apparmor.d/local/abstractions/libvirt-qemu`: for example,
+ `echo ' "/etc/vitastor/vitastor.conf" r,' >> /etc/apparmor.d/local/abstractions/libvirt-qemu`
+- Apply changes to `/etc/one/oned.conf`
+
+### oned.conf changes
+
+1. Add deploy script override in kvm VM_MAD: add `-l deploy.vitastor` to ARGUMENTS:
+
+```diff
+ VM_MAD = [
+ NAME = "kvm",
+ SUNSTONE_NAME = "KVM",
+ EXECUTABLE = "one_vmm_exec",
+- ARGUMENTS = "-t 15 -r 0 kvm -p",
++ ARGUMENTS = "-t 15 -r 0 kvm -p -l deploy=deploy.vitastor",
+ DEFAULT = "vmm_exec/vmm_exec_kvm.conf",
+ TYPE = "kvm",
+ KEEP_SNAPSHOTS = "yes",
+ LIVE_RESIZE = "yes",
+ SUPPORT_SHAREABLE = "yes",
+ IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend,
+ resume, delete, reboot, reboot-hard, resched, unresched, disk-attach,
+ disk-detach, nic-attach, nic-detach, snapshot-create, snapshot-delete,
+ resize, updateconf, update"
+ ]
+```
+
+2. Add `vitastor` to TM_MAD.ARGUMENTS and DATASTORE_MAD.ARGUMENTS:
+
+```diff
+ TM_MAD = [
+ EXECUTABLE = "one_tm",
+- ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,fs_lvm_ssh,qcow2,ssh,ceph,dev,vcenter,iscsi_libvirt"
++ ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,fs_lvm_ssh,qcow2,ssh,ceph,vitastor,dev,vcenter,iscsi_libvirt"
+ ]
+
+ DATASTORE_MAD = [
+ EXECUTABLE = "one_datastore",
+- ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,dev,iscsi_libvirt,vcenter,restic,rsync -s shared,ssh,ceph,fs_lvm,fs_lvm_ssh,qcow2,vcenter"
++ ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,vitastor,dev,iscsi_libvirt,vcenter,restic,rsync -s shared,ssh,ceph,vitastor,fs_lvm,fs_lvm_ssh,qcow2,vcenter"
+ ]
+```
+
+3. Add INHERIT_DATASTORE_ATTR for two Vitastor attributes:
+
+```
+INHERIT_DATASTORE_ATTR = "VITASTOR_CONF"
+INHERIT_DATASTORE_ATTR = "IMAGE_PREFIX"
+```
+
+4. Add TM_MAD_CONF and DS_MAD_CONF for Vitastor:
+
+```
+TM_MAD_CONF = [
+ NAME = "vitastor", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES",
+ DS_MIGRATE = "NO", DRIVER = "raw", ALLOW_ORPHANS="format",
+ TM_MAD_SYSTEM = "ssh,shared", LN_TARGET_SSH = "SYSTEM", CLONE_TARGET_SSH = "SYSTEM",
+ DISK_TYPE_SSH = "FILE", LN_TARGET_SHARED = "NONE",
+ CLONE_TARGET_SHARED = "SELF", DISK_TYPE_SHARED = "FILE"
+]
+
+DS_MAD_CONF = [
+ NAME = "vitastor",
+ REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST",
+ PERSISTENT_ONLY = "NO",
+ MARKETPLACE_ACTIONS = "export"
+]
+```
+
+## Create Datastores
+
+Example Image and System Datastore definitions:
+[opennebula/vitastor-imageds.conf](../../opennebula/vitastor-imageds.conf) and
+[opennebula/vitastor-systemds.conf](../../opennebula/vitastor-systemds.conf).
+
+Change parameters to your will:
+
+- POOL_NAME is Vitastor pool name to store images.
+- IMAGE_PREFIX is a string prepended to all Vitastor image names.
+- BRIDGE_LIST is a list of hosts with access to Vitastor cluster, mostly used for image (not system) datastore operations.
+- VITASTOR_CONF is the path to cluster configuration. Note that it should be also added to `/etc/apparmor.d/local/abstractions/libvirt-qemu` if you use AppArmor.
+- STAGING_DIR is a temporary directory used when importing external images. Should have free space sufficient for downloading external images.
+
+Then create datastores using `onedatastore create vitastor-imageds.conf` and `onedatastore create vitastor-systemds.conf` (or use UI).
+
+## Block VM access to Vitastor cluster
+
+Vitastor doesn't support any authentication yet, so you MUST block VM guest access to the Vitastor cluster at the network level.
+
+If you use VLAN networking for VMs - make sure you use different VLANs for VMs and hypervisor/storage network and
+block access between them using your firewall/switch configuration.
+
+If you use something more stupid like bridged networking, you probably have to use manual firewall/iptables setup
+to only allow access to Vitastor from hypervisor IPs.
+
+Also you need to switch network to "Bridged & Security Groups" and enable IP spoofing filters in OpenNebula.
+Problem is that OpenNebula's IP spoofing filter doesn't affect local interfaces of the hypervisor i.e. when
+it's enabled a VM can't talk to other VMs or to the outer world using a spoofed IP, but it CAN talk to the
+hypervisor if it takes an IP from its subnet. To fix that you also need some more iptables.
+
+So the complete "stupid" bridged network filter setup could look like the following
+(here `10.0.3.0/24` is the VM subnet and `10.0.2.0/24` is the hypervisor subnet):
+
+```
+# Allow incoming traffic from physical device
+iptables -A INPUT -m physdev --physdev-in eth0 -j ACCEPT
+# Do not allow incoming traffic from VMs, but not from VM subnet
+iptables -A INPUT ! -s 10.0.3.0/24 -i onebr0 -j DROP
+# Drop traffic from VMs to hypervisor/storage subnet
+iptables -I FORWARD 1 -s 10.0.3.0/24 -d 10.0.2.0/24 -j DROP
+```
+
+## Testing
+
+The OpenNebula plugin includes quite a bit of bash scripts, so here's their description to get an idea about what they actually do.
+
+| Script | Action | How to Test |
+| ----------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------ |
+| vmm/kvm/deploy.vitastor | Start a VM | Create and start a VM with Vitastor disk(s): persistent / non-persistent / volatile. |
+| datastore/clone | Copy an image as persistent | Create a VM template and instantiate it as persistent. |
+| datastore/cp | Import an external image | Import a VM template with images from Marketplace. |
+| datastore/export | Export an image as URL | Probably: export a VM template with images to Marketplace. |
+| datastore/mkfs | Create an image with FS | Storage → Images → Create → Type: Datablock, Location: Empty disk image, Filesystem: Not empty. |
+| datastore/monitor | Monitor used space in image datastore | Check reported used/free space in image datastore list. |
+| datastore/rm | Remove a persistent image | Storage → Images → Select an image → Delete. |
+| datastore/snap_delete | Delete a snapshot of a persistent image | Storage → Images → Select an image → Select a snapshot → Delete;
To create an image with snapshot: attach a persistent image to a VM; create a snapshot; detach the image. |
+| datastore/snap_flatten | Revert an image to snapshot and delete other snapshots | Storage → Images → Select an image → Select a snapshot → Flatten. |
+| datastore/snap_revert | Revert an image to snapshot | Storage → Images → Select an image → Select a snapshot → Revert. |
+| datastore/stat | Get virtual size of an image in MB | No idea. Seems to be unused both in Vitastor and Ceph datastores. |
+| tm/clone | Clone a non-persistent image to a VM disk | Attach a non-persistent image to a VM. |
+| tm/context | Generate a contextualisation VM disk | Create a VM with enabled contextualisation (default). Common host FS-based version is used in Vitastor and Ceph datastores. |
+| tm/cpds | Copy a VM disk / its snapshot to an image | Select a VM → Select a disk → Optionally select a snapshot → Save as. |
+| tm/delete | Delete a cloned or volatile VM disk | Detach a volatile disk or a non-persistent image from a VM. |
+| tm/failmigrate | Handle live migration failure | No action. Script is empty in Vitastor and Ceph. In other datastores, should roll back actions done by tm/premigrate. |
+| tm/ln | Attach a persistent image to a VM | No action. Script is empty in Vitastor and Ceph. |
+| tm/mkimage | Create a volatile disk, maybe with FS | Attach a volatile disk to a VM, with or without file system. |
+| tm/mkswap | Create a volatile swap disk | Attach a volatile disk to a VM, formatted as swap. |
+| tm/monitor | Monitor used space in system datastore | Check reported used/free space in system datastore list. |
+| tm/mv | Move a migrated VM disk between hosts | Migrate a VM between hosts. In Vitastor and Ceph datastores, doesn't do any storage action. |
+| tm/mvds | Detach a persistent image from a VM | No action. The opposite of tm/ln. Script is empty in Vitastor and Ceph. In other datastores, script may copy the image from VM host back to the datastore. |
+| tm/postbackup | Executed after backup | Seems that the script just removes temporary files after backup. Perform a VM backup and check that temporary files are cleaned up. |
+| tm/postbackup_live | Executed after backup of a running VM | Same as tm/postbackup, but for a running VM. |
+| tm/postmigrate | Executed after VM live migration | No action. Only executed for system datastore, so the script tries to call other TMs for other disks. Except that, the script does nothing in Vitastor and Ceph datastores. |
+| tm/prebackup | Actual backup script: backup VM disks | Set up "rsync" backup datastore → Backup a VM to it. |
+| tm/prebackup_live | Backup VM disks of a running VM | Same as tm/prebackup, but also does fsfreeze/thaw. So perform a live backup, restore it and check that disks are consistent. |
+| tm/premigrate | Executed before live migration | No action. Only executed for system datastore, so the script tries to call other TMs for other disks. Except that, the script does nothing in Vitastor and Ceph datastores. |
+| tm/resize | Resize a VM disk | Select a VM → Select a non-persistent disk → Resize. |
+| tm/restore | Restore VM disks from backup | Set up "rsync" backup datastore → Backup a VM to it → Restore it back. |
+| tm/snap_create | Create a VM disk snapshot | Select a VM → Select a disk → Create snapshot. |
+| tm/snap_create_live | Create a VM disk snapshot for a live VM | Select a running VM → Select a disk → Create snapshot. |
+| tm/snap_delete | Delete a VM disk snapshot | Select a VM → Select a disk → Select a snapshot → Delete. |
+| tm/snap_revert | Revert a VM disk to a snapshot | Select a VM → Select a disk → Select a snapshot → Revert. |
diff --git a/docs/installation/opennebula.ru.md b/docs/installation/opennebula.ru.md
new file mode 100644
index 00000000..225d85a8
--- /dev/null
+++ b/docs/installation/opennebula.ru.md
@@ -0,0 +1,179 @@
+[Документация](../../README-ru.md#документация) → Установка → OpenNebula
+
+-----
+
+[Read in English](opennebula.en.md)
+
+## Автоматическая установка
+
+Плагин OpenNebula Vitastor распространяется как Debian и RPM пакет `opennebula-vitastor`, начиная с версии Vitastor 1.9.0. Так что:
+
+- Запустите `apt-get install opennebula-vitastor` или `yum install vitastor` после установки OpenNebula на всех серверах
+- Проверьте, что он выводит "OK, Vitastor OpenNebula patches successfully applied" или "OK, Vitastor OpenNebula patches are already applied" в процессе установки
+- Если сообщение не выведено, пройдите по шагам инструкцию [Ручная установка](#ручная-установка) и примените правки файлов конфигурации вручную
+- [Заблокируйте доступ виртуальных машин в Vitastor](#блокировка-доступа-вм-в-vitastor)
+
+## Ручная установка
+
+Сначала установите саму OpenNebula. После этого, на каждом сервере:
+
+- Скопируйте директорию [opennebula/remotes](../../opennebula/remotes) в `/var/lib/one`: `cp -r opennebula/remotes /var/lib/one/`
+- Скопируйте директорию [opennebula/sudoers.d](../../opennebula/sudoers.d) в `/etc`: `cp -r opennebula/sudoers.d /etc/`
+- Примените патч [downloader-vitastor.sh.diff](../../opennebula/remotes/datastore/vitastor/downloader-vitastor.sh.diff) к `/var/lib/one/remotes/datastore/downloader.sh`:
+ `patch /var/lib/one/remotes/datastore/downloader.sh < opennebula/remotes/datastore/vitastor/downloader-vitastor.sh.diff` - либо прочитайте патч и примените изменение вручную
+- Добавьте `kvm-vitastor` в список `LIVE_DISK_SNAPSHOTS` в файле `/etc/one/vmm_exec/vmm_execrc`
+- Если вы используете Debian или Ubuntu (и AppArmor), добавьте пути к файлу(ам) конфигурации Vitastor в файл `/etc/apparmor.d/local/abstractions/libvirt-qemu`: например,
+ `echo ' "/etc/vitastor/vitastor.conf" r,' >> /etc/apparmor.d/local/abstractions/libvirt-qemu`
+- Примените изменения `/etc/one/oned.conf`
+
+### Изменения oned.conf
+
+1. Добавьте переопределение скрипта deploy в VM_MAD kvm, добавив `-l deploy.vitastor` в `ARGUMENTS`:
+
+```diff
+ VM_MAD = [
+ NAME = "kvm",
+ SUNSTONE_NAME = "KVM",
+ EXECUTABLE = "one_vmm_exec",
+- ARGUMENTS = "-t 15 -r 0 kvm -p",
++ ARGUMENTS = "-t 15 -r 0 kvm -p -l deploy=deploy.vitastor",
+ DEFAULT = "vmm_exec/vmm_exec_kvm.conf",
+ TYPE = "kvm",
+ KEEP_SNAPSHOTS = "yes",
+ LIVE_RESIZE = "yes",
+ SUPPORT_SHAREABLE = "yes",
+ IMPORTED_VMS_ACTIONS = "terminate, terminate-hard, hold, release, suspend,
+ resume, delete, reboot, reboot-hard, resched, unresched, disk-attach,
+ disk-detach, nic-attach, nic-detach, snapshot-create, snapshot-delete,
+ resize, updateconf, update"
+ ]
+```
+
+2. Добавьте `vitastor` в значения TM_MAD.ARGUMENTS и DATASTORE_MAD.ARGUMENTS:
+
+```diff
+ TM_MAD = [
+ EXECUTABLE = "one_tm",
+- ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,fs_lvm_ssh,qcow2,ssh,ceph,dev,vcenter,iscsi_libvirt"
++ ARGUMENTS = "-t 15 -d dummy,lvm,shared,fs_lvm,fs_lvm_ssh,qcow2,ssh,ceph,vitastor,dev,vcenter,iscsi_libvirt"
+ ]
+
+ DATASTORE_MAD = [
+ EXECUTABLE = "one_datastore",
+- ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,dev,iscsi_libvirt,vcenter,restic,rsync -s shared,ssh,ceph,fs_lvm,fs_lvm_ssh,qcow2,vcenter"
++ ARGUMENTS = "-t 15 -d dummy,fs,lvm,ceph,vitastor,dev,iscsi_libvirt,vcenter,restic,rsync -s shared,ssh,ceph,vitastor,fs_lvm,fs_lvm_ssh,qcow2,vcenter"
+ ]
+```
+
+3. Добавьте строчки с INHERIT_DATASTORE_ATTR для двух атрибутов Vitastor-хранилищ:
+
+```
+INHERIT_DATASTORE_ATTR = "VITASTOR_CONF"
+INHERIT_DATASTORE_ATTR = "IMAGE_PREFIX"
+```
+
+4. Добавьте TM_MAD_CONF и DS_MAD_CONF для Vitastor:
+
+```
+TM_MAD_CONF = [
+ NAME = "vitastor", LN_TARGET = "NONE", CLONE_TARGET = "SELF", SHARED = "YES",
+ DS_MIGRATE = "NO", DRIVER = "raw", ALLOW_ORPHANS="format",
+ TM_MAD_SYSTEM = "ssh,shared", LN_TARGET_SSH = "SYSTEM", CLONE_TARGET_SSH = "SYSTEM",
+ DISK_TYPE_SSH = "FILE", LN_TARGET_SHARED = "NONE",
+ CLONE_TARGET_SHARED = "SELF", DISK_TYPE_SHARED = "FILE"
+]
+
+DS_MAD_CONF = [
+ NAME = "vitastor",
+ REQUIRED_ATTRS = "DISK_TYPE,BRIDGE_LIST",
+ PERSISTENT_ONLY = "NO",
+ MARKETPLACE_ACTIONS = "export"
+]
+```
+
+## Создайте хранилища
+
+Примеры настроек хранилищ образов (image) и дисков ВМ (system):
+[opennebula/vitastor-imageds.conf](../../opennebula/vitastor-imageds.conf) и
+[opennebula/vitastor-systemds.conf](../../opennebula/vitastor-systemds.conf).
+
+Скопируйте настройки и поменяйте следующие параметры так, как вам необходимо:
+
+- POOL_NAME - имя пула Vitastor для сохранения образов дисков.
+- IMAGE_PREFIX - строка, добавляемая в начало имён образов дисков.
+- BRIDGE_LIST - список серверов с доступом к кластеру Vitastor, используемых для операций с хранилищем образов (image, не system).
+- VITASTOR_CONF - путь к конфигурации Vitastor. Имейте в виду, что этот путь также надо добавить в `/etc/apparmor.d/local/abstractions/libvirt-qemu`, если вы используете AppArmor.
+- STAGING_DIR - путь к временному каталогу, используемому при импорте внешних образов. Должен иметь достаточно свободного места, чтобы вмещать скачанные образы.
+
+После этого создайте хранилища с помощью команд `onedatastore create vitastor-imageds.conf` и `onedatastore create vitastor-systemds.conf` (либо через UI).
+
+## Блокировка доступа ВМ в Vitastor
+
+Vitastor пока не поддерживает никакую аутентификацию, так что вы ДОЛЖНЫ заблокировать доступ гостевых ВМ
+в кластер Vitastor на сетевом уровне.
+
+Если вы используете VLAN-сети для ВМ - удостоверьтесь, что ВМ и гипервизор/сеть хранения помещены в разные
+изолированные друг от друга VLAN-ы.
+
+Если вы используете что-то более примитивное, например, мосты (bridge), вам, скорее всего, придётся вручную
+настроить iptables / межсетевой экран, чтобы разрешить доступ к Vitastor только с IP гипервизоров.
+
+Также в этом случае нужно будет переключить обычные мосты на "Bridged & Security Groups" и включить фильтр
+спуфинга IP в OpenNebula. Правда, реализация этого фильтра пока не полная, и она не блокирует доступ к
+локальным интерфейсам гипервизора. То есть, включённый фильтр спуфинга IP запрещает ВМ отправлять трафик
+с чужими IP к другим ВМ или во внешний мир, но не запрещает отправлять его напрямую гипервизору. Чтобы
+исправить это, тоже нужны дополнительные правила iptables.
+
+Таким образом, более-менее полная блокировка при использовании простой сети на сетевых мостах может
+выглядеть так (здесь `10.0.3.0/24` - подсеть ВМ, `10.0.2.0/24` - подсеть гипервизора):
+
+```
+# Разрешаем входящий трафик с физического устройства
+iptables -A INPUT -m physdev --physdev-in eth0 -j ACCEPT
+# Запрещаем трафик со всех ВМ, но с IP не из подсети ВМ
+iptables -A INPUT ! -s 10.0.3.0/24 -i onebr0 -j DROP
+# Запрещаем трафик от ВМ к сети гипервизора
+iptables -I FORWARD 1 -s 10.0.3.0/24 -d 10.0.2.0/24 -j DROP
+```
+
+## Тестирование
+
+Плагин OpenNebula по большей части состоит из bash-скриптов, и чтобы было понятнее, что они
+вообще делают - ниже приведены описания процедур, которыми можно протестировать каждый из них.
+
+| Скрипт | Описание | Как протестировать |
+| ----------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------ |
+| vmm/kvm/deploy.vitastor | Запустить виртуальную машину | Создайте и запустите виртуальную машину с дисками Vitastor: постоянным / непостоянным / волатильным (временным). |
+| datastore/clone | Скопировать образ как "постоянный" | Создайте шаблон ВМ и создайте из него постоянную ВМ. |
+| datastore/cp | Импортировать внешний образ | Импортируйте шаблон ВМ с образами дисков из Магазина OpenNebula. |
+| datastore/export | Экспортировать образ как URL | Вероятно: экспортируйте шаблон ВМ с образами в Магазин. |
+| datastore/mkfs | Создать образ с файловой системой | Хранилище → Образы → Создать → Тип: базовый блок данных, Расположение: пустой образ диска, Файловая система: любая непустая. |
+| datastore/monitor | Вывод статистики места в хранилище образов | Проверьте статистику свободного/занятого места в списке хранилищ образов. |
+| datastore/rm | Удалить "постоянный" образ | Хранилище → Образы → Выберите образ → Удалить. |
+| datastore/snap_delete | Удалить снимок "постоянного" образа | Хранилище → Образы → Выберите образ → Выберите снимок → Удалить;
Чтобы создать образ со снимком: подключите постоянный образ к ВМ, создайте снимок, отключите образ. |
+| datastore/snap_flatten | Откатить образ к снимку, удалив другие снимки | Хранилище → Образы → Выберите образ → Выберите снимок → "Выровнять" (flatten). |
+| datastore/snap_revert | Откатить образ к снимку | Хранилище → Образы → Выберите образ → Выберите снимок → Откатить. |
+| datastore/stat | Показать виртуальный размер образа в МБ | Неизвестно. По-видимому, в плагинах Vitastor и Ceph не используется. |
+| tm/clone | Клонировать "непостоянный" образ в диск ВМ | Подключите "непостоянный" образ к ВМ. |
+| tm/context | Создать диск контекстуализации ВМ | Создайте ВМ с контекстуализацией, как обычно. Но тестировать особенно нечего: в плагинах Vitastor и Ceph образ контекста хранится в локальной ФС гипервизора. |
+| tm/cpds | Копировать диск ВМ/его снимок в новый образ | Выберите ВМ → Выберите диск → Опционально выберите снимок → "Сохранить как". |
+| tm/delete | Удалить диск-клон или волатильный диск ВМ | Отключите волатильный или не-постоянный диск от ВМ. |
+| tm/failmigrate | Обработать неудачную миграцию | Тестировать нечего. Скрипт пуст в плагинах Vitastor и Ceph. В других плагинах скрипт должен откатывать действия tm/premigrate. |
+| tm/ln | Подключить "постоянный" образ к ВМ | Тестировать нечего. Скрипт пуст в плагинах Vitastor и Ceph. |
+| tm/mkimage | Создать волатильный диск, без или с ФС | Подключите волатильный диск к ВМ, с или без файловой системы. |
+| tm/mkswap | Создать волатильный диск подкачки | Подключите волатильный диск к ВМ, форматированный как диск подкачки (swap). |
+| tm/monitor | Вывод статистики места в хранилище дисков ВМ | Проверьте статистику свободного/занятого места в списке хранилищ дисков ВМ. |
+| tm/mv | Мигрировать диск ВМ между хостами | Мигрируйте ВМ между серверами. Правда, с точки зрения хранилища в плагинах Vitastor и Ceph этот скрипт ничего не делает. |
+| tm/mvds | Отключить "постоянный" образ от ВМ | Тестировать нечего. Скрипт пуст в плагинах Vitastor и Ceph. В целом же скрипт обратный к tm/ln и в других хранилищах он может, например, копировать образ ВМ с диска гипервизора обратно в хранилище. |
+| tm/postbackup | Выполняется после бэкапа | По-видимому, скрипт просто удаляет временные файлы после резервного копирования. Так что можно провести его и проверить, что на серверах не осталось временных файлов. |
+| tm/postbackup_live | Выполняется после бэкапа запущенной ВМ | То же, что tm/postbackup, но для запущенной ВМ. |
+| tm/postmigrate | Выполняется после миграции ВМ | Тестировать нечего. Однако, OpenNebula запускает скрипт только для системного хранилища, поэтому он вызывает аналогичные скрипты для хранилищ других дисков той же ВМ. Помимо этого в плагинах Vitastor и Ceph скрипт ничего не делает. |
+| tm/prebackup | Выполнить резервное копирование дисков ВМ | Создайте хранилище резервных копий типа "rsync" → Забэкапьте в него ВМ. |
+| tm/prebackup_live | То же самое для запущенной ВМ | То же, что tm/prebackup, но запускает fsfreeze/thaw (остановку доступа к дискам). Так что смысл теста - проведите резервное копирование и проверьте, что данные скопировались консистентно. |
+| tm/premigrate | Выполняется перед миграцией ВМ | Тестировать нечего. Аналогично tm/postmigrate запускается только для системного хранилища. |
+| tm/resize | Изменить размер диска ВМ | Выберите ВМ → Выберите непостоянный диск → Измените его размер. |
+| tm/restore | Восстановить диски ВМ из бэкапа | Создайте хранилище резервных копий → Забэкапьте в него ВМ → Восстановите её обратно. |
+| tm/snap_create | Создать снимок диска ВМ | Выберите ВМ → Выберите диск → Создайте снимок. |
+| tm/snap_create_live | Создать снимок диска запущенной ВМ | Выберите запущенную ВМ → Выберите диск → Создайте снимок. |
+| tm/snap_delete | Удалить снимок диска ВМ | Выберите ВМ → Выберите диск → Выберите снимок → Удалить. |
+| tm/snap_revert | Откатить диск ВМ к снимку | Выберите ВМ → Выберите диск → Выберите снимок → Откатить. |
diff --git a/docs/intro/features.en.md b/docs/intro/features.en.md
index ed6976e7..be25acae 100644
--- a/docs/intro/features.en.md
+++ b/docs/intro/features.en.md
@@ -39,6 +39,10 @@
## Plugins and tools
+- [Proxmox storage plugin and packages](../installation/proxmox.en.md)
+- [OpenNebula storage plugin](../installation/opennebula.en.md)
+- [CSI plugin for Kubernetes](../installation/kubernetes.en.md)
+- [OpenStack support: Cinder driver, Nova and libvirt patches](../installation/openstack.en.md)
- [Debian and CentOS packages](../installation/packages.en.md)
- [Image management CLI (vitastor-cli)](../usage/cli.en.md)
- [Disk management CLI (vitastor-disk)](../usage/disk.en.md)
@@ -46,9 +50,6 @@
- [Native QEMU driver](../usage/qemu.en.md)
- [Loadable fio engine for benchmarks](../usage/fio.en.md)
- [NBD proxy for kernel mounts](../usage/nbd.en.md)
-- [CSI plugin for Kubernetes](../installation/kubernetes.en.md)
-- [OpenStack support: Cinder driver, Nova and libvirt patches](../installation/openstack.en.md)
-- [Proxmox storage plugin and packages](../installation/proxmox.en.md)
- [Simplified NFS proxy for file-based image access emulation (suitable for VMWare)](../usage/nfs.en.md#pseudo-fs)
## Roadmap
@@ -58,7 +59,6 @@ The following features are planned for the future:
- Control plane optimisation
- Other administrative tools
- Web GUI
-- OpenNebula plugin
- iSCSI and NVMeoF gateways
- Multi-threaded client
- Faster failover
diff --git a/docs/intro/features.ru.md b/docs/intro/features.ru.md
index 58c5dd26..021fbeb0 100644
--- a/docs/intro/features.ru.md
+++ b/docs/intro/features.ru.md
@@ -41,6 +41,10 @@
## Драйверы и инструменты
+- [Плагин для Proxmox](../installation/proxmox.ru.md)
+- [Плагин для OpenNebula](../installation/opennebula.ru.md)
+- [CSI-плагин для Kubernetes](../installation/kubernetes.ru.md)
+- [Базовая поддержка OpenStack: драйвер Cinder, патчи для Nova и libvirt](../installation/openstack.ru.md)
- [Пакеты для Debian и CentOS](../installation/packages.ru.md)
- [Консольный интерфейс управления образами (vitastor-cli)](../usage/cli.ru.md)
- [Инструмент управления дисками (vitastor-disk)](../usage/disk.ru.md)
@@ -48,9 +52,6 @@
- [Драйвер диска для QEMU](../usage/qemu.ru.md)
- [Драйвер диска для утилиты тестирования производительности fio](../usage/fio.ru.md)
- [NBD-прокси для монтирования образов ядром](../usage/nbd.ru.md) ("блочное устройство в режиме пользователя")
-- [CSI-плагин для Kubernetes](../installation/kubernetes.ru.md)
-- [Базовая поддержка OpenStack: драйвер Cinder, патчи для Nova и libvirt](../installation/openstack.ru.md)
-- [Плагин для Proxmox](../installation/proxmox.ru.md)
- [Упрощённая NFS-прокси для эмуляции файлового доступа к образам (подходит для VMWare)](../usage/nfs.ru.md#псевдо-фс)
## Планы развития
@@ -58,7 +59,6 @@
- Оптимизация слоя управления
- Другие инструменты администрирования
- Web-интерфейс
-- Плагин для OpenNebula
- iSCSI и NVMeoF прокси
- Многопоточный клиент
- Более быстрое переключение при отказах
diff --git a/opennebula/README.md b/opennebula/README.md
new file mode 100644
index 00000000..0861d3e4
--- /dev/null
+++ b/opennebula/README.md
@@ -0,0 +1 @@
+See [../docs/installation/opennebula.en.md](../docs/installation/opennebula.en.md).
diff --git a/opennebula/install.sh b/opennebula/install.sh
index ff09c2b8..5ae0bc2c 100755
--- a/opennebula/install.sh
+++ b/opennebula/install.sh
@@ -4,16 +4,25 @@ set -e
reapply_patch() {
if ! patch -f --dry-run -l -R $1 < $2 >/dev/null; then
+ already_applied=0
if ! patch -l -f $1 < $2; then
+ applied_ok=0
echo "ERROR: Failed to patch file $1, please apply the patch $2 manually"
fi
fi
}
echo "Reapplying Vitastor patches to OpenNebula's oned.conf, vmm_execrc and downloader.sh"
+already_applied=1
+applied_ok=1
reapply_patch /var/lib/one/remotes/datastore/downloader.sh /var/lib/one/remotes/datastore/vitastor/downloader-vitastor.sh.diff
reapply_patch /etc/one/oned.conf /var/lib/one/remotes/datastore/vitastor/oned.conf.diff
reapply_patch /etc/one/vmm_exec/vmm_execrc /var/lib/one/remotes/datastore/vitastor/vmm_execrc.diff
-if [ -f /etc/apparmor.d/local/abstractions/libvirt-qemu ]; then
+if [[ "$already_applied" = 1 ]]; then
+ echo "OK: Vitastor OpenNebula patches are already applied"
+elif [[ "$applied_ok" = 1 ]]; then
+ echo "OK: Vitastor OpenNebula patches successfully applied"
+fi
+if [[ -f /etc/apparmor.d/local/abstractions/libvirt-qemu ]]; then
if ! grep -q /etc/vitastor/vitastor.conf /etc/apparmor.d/local/abstractions/libvirt-qemu; then
echo ' "/etc/vitastor/vitastor.conf" r,' >> /etc/apparmor.d/local/abstractions/libvirt-qemu
fi
diff --git a/opennebula/vitastor-imageds.conf b/opennebula/vitastor-imageds.conf
index 72bb9590..a902d860 100644
--- a/opennebula/vitastor-imageds.conf
+++ b/opennebula/vitastor-imageds.conf
@@ -6,4 +6,5 @@ DISK_TYPE = "file"
BRIDGE_LIST = "opennebula1"
POOL_NAME = "test1"
IMAGE_PREFIX = "my"
-STAGING_DIR = /var/tmp
+STAGING_DIR = "/var/tmp"
+VITASTOR_CONF = "/etc/vitastor/vitastor.conf"
diff --git a/opennebula/vitastor-systemds.conf b/opennebula/vitastor-systemds.conf
index 71260c16..ba16e1bc 100644
--- a/opennebula/vitastor-systemds.conf
+++ b/opennebula/vitastor-systemds.conf
@@ -3,4 +3,5 @@ TM_MAD = "vitastor"
TYPE = "SYSTEM_DS"
BRIDGE_LIST = "opennebula1"
POOL_NAME = "test1"
-IMAGE_PREFIX = "my"
+IMAGE_PREFIX = "one"
+VITASTOR_CONF = "/etc/vitastor/vitastor.conf"