From de118291c738254d577ac278d9b46e8eaa430a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= Date: Mon, 29 Jun 2026 11:36:41 -0300 Subject: [PATCH 1/5] add kboss doc --- .../_static/images/create-backup-offering.png | Bin 0 -> 39908 bytes source/adminguide/backup_and_recovery.rst | 6 +- source/adminguide/kboss_plugin.rst | 281 ++++++++++++++++++ source/adminguide/storage.rst | 8 +- 4 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 source/_static/images/create-backup-offering.png create mode 100644 source/adminguide/kboss_plugin.rst diff --git a/source/_static/images/create-backup-offering.png b/source/_static/images/create-backup-offering.png new file mode 100644 index 0000000000000000000000000000000000000000..f960892e4843e1da04216b9408e31ab6cf9d8dbb GIT binary patch literal 39908 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 Backup Offerings tab. Click on 'Create Backup Offering' and fill the form. + +=============================== ======================== +Field Value +=============================== ======================== +Name A suitable name to represent the Backup Offering. +Description A suitable description to represent the Backup Offering. +Zone Zone UUID for the backup offering. +Allow User driven backups Whether to allow backups from the ACS API. If this value is false, you will not be able to create backups using KBOSS. **It must be set as true**. +Public Whether the offering is public or dedicated to a domain. +Domain Domain to dedicate the offering, only shown when 'Public' is false. +Compress Whether the backups should be compressed after creation. +Compression library Which compression library to use, only shown when 'Compress' is true. +Validate Whether to validate backups after creation. +Validation steps Which validation steps should be executed. +Allow extract file Whether backups created with this offering should allow file extraction. This feature will be implemented in a future version. +Allow quick restore Whether backups created with this offering should allow quick restore. +Backup chain size The backup chain size of the incremental backups. This value overwrites what is set in `backup.chain.size`. +=============================== ======================== + +.. image:: /_static/images/create-backup-offering.png + :align: center + :alt: NAS Backup repository + +After this has been done, you can go to any Instance view and assign the backup offering to it. Then, there will be buttons available for either ad-hoc +backup or a scheduled backup of the VM. + +Quiesce (Filesystem Freeze and Thaw) +------------------------------------ + +Users can set quiesce to true while creating a backup or a backup schedule. +When a backup is initiated with quiesce enabled, CloudStack uses QEMU guest agent +to freeze the filesystem before starting backup. This operation flushes all dirty +filesystem buffers to disk and quiesces new writes. The filesystem is then thawed +immediately after the backup process starts, keeping the freezing window very short. + +|NASB&R-quiesceInstance.png| + +This enhancement brings the KBOSS backup plugin from crash-consistent backups closer to +application-consistent backups. + +Points to note: + +#. The feature requires Qemu Guest Agent to be installed and running on the guest instance. +#. This method does not capture the memory state of the guest. Any data held in application memory + that hasn’t been flushed to disk prior to the filesystem freeze will not be captured. +#. For fully application-consistent backups, guest applications must implement pre-freeze hooks + to flush their internal state to disk before the filesystem is frozen. + +Backup Chain Management +----------------------- + +The size of the incremental backup chain is determined by the `backup.chain.size` zone-wide configuration; furthermore, it may be overwritten on the +offering level. Once the backup chain reaches the configured size, the next backup will be a full backup and a new chain will start. + +If users wish to finalize the backup chain early, the **finishBackupChain** API may be used. It is also available through the VM instance interface on the GUI. +If the VM is in the `BackupError` state, ACS will try to normalize it. Most times ACS is able to normalize it, however, the VM may be unable to be recovered +automatically for a number of reasons, for example if the storage is unavailable. + +Isolated backups +---------------- + +If you want to create a backup that does not depend on any backup chain, you may inform the `isolated` flag when creating a backup, or a backup schedule. +When set, the created backup will be a full backup, with no dependencies on other backups, and no future backups will depend on it. + +Quick restore +------------- + +If the backup was created using an offering with `allowQuickRestore` set, the user will be able to restore it using the `quickRestore` flag. +When this is done, CloudStack creates new deltas on primary storage that have the backup as their backing files, while the backups are still on the +secondary storage. Then, the VM is automatically started and the volume consolidation process starts. While this is done, the VM is already available to use. + +While this process is ongoing, the VM should not be stopped (from inside the VM), otherwise, it will fail to consolidate the volume. The benefit of using quick restore +is that the VM is up and running in a very short time; however, the time to finish the consolidation process is bigger than normal restore. During +the consolidation process, the VM's disk might have their performance slowed, when the process is done, the performance should go back to normal. + +Compression +----------- + +The backup compression process is executed asynchronously after the backup is created, for VMs using backup offerings that support it. +There are several configurations that affect the backup compression task and process: + +.. list-table:: Compression Configurations + :widths: 20 60 20 + :header-rows: 1 + + * - Configuration + - Description + - Default value + * - `backup.compression.task.enabled` + - Determines whether the task responsible for scheduling compression jobs is active. If not, compression jobs will not run + - true + * - `backup.compression.max.concurrent.operations.per.host` + - Maximum number of concurrent compression jobs. Values lower than 1 disable the limit. + - 5 + * - `backup.compression.max.concurrent.operations` + - Maximum number of compression jobs that can be executed at the same time in the zone. Values lower than 1 disable the limit. + - 10 + * - `backup.compression.max.job.retries` + - Maximum number of attempts for executing compression jobs + - 2 + * - `backup.compression.retry.interval` + - Interval, in minutes, between attempts to run compression jobs + - 60 + * - `backup.compression.timeout` + - Timeout, in seconds, for running compression jobs + - 28800 + * - `backup.compression.minimum.free.storage` + - Minimum required available storage to start the backup compression process. + This setting accepts a real number that is multiplied by the total size of the backup to determine the necessary available space. + By default, the storage must have the same amount of available space as the space occupied by the backup. This is checked by the host + when trying to start the process. + - 1 + * - `backup.compression.coroutines` + - Number of coroutines used for the compression process, each coroutine has its own thread + - 1 + * - `backup.compression.rate.limit` + - Compression rate limit, in MB/s. Values less than 1 disable the limit + - 0 + +To check information about compression jobs, the **listBackupServiceJobs** API may be added. + +Validation +---------- + +The backup validation process is executed asynchronously after the backup is created, for VMs using backup offerings that support it. To perform the validation, a temporary dummy +VM is created using the backup being validated and a few configurable validation steps are executed. After the first successful validation, a Hash of the backup is taken, +a new Hash is taken periodically and compared with the original to make sure the backup is still valid. Furthermore, most backup validation steps are dependant on the guest VM having +Qemu Guest Agent installed and configured to run on start. There are three currently available validation steps: + +.. list-table:: Validation steps + :widths: 20 60 20 + :header-rows: 1 + + * - Step + - Description + - Needs Qemu Gest Agent? + * - `wait_for_boot` + - Waits during a configurable timeout for the validation VM to boot. + - Yes + * - `execute_command` + - Executes a configurable command inside the VM using Qemu Guest Agent, compares the result with a configurable expected result + - Yes + * - `screenshot` + - Takes a screenshot of the VM's window after a configurable time. The screenshot can then be downloaded via `downloadValidationScreenshot` API. + - No + +More validation steps may be added in the future. + +The configurations related to backup validation are detailed below: + +.. list-table:: Validation configurations + :widths: 10 70 10 10 + :header-rows: 1 + + * - Configuration + - Description + - Default value + - Scope + * - `backup.validation.task.enabled` + - Determines whether the task responsible for scheduling validation jobs is active. If it is not active, validation jobs will not run. + - `true` + - Account + * - `backup.validation.interval` + - Interval, in hours, between two validations of the same backup. + - `24` + - Account + * - `backup.validation.max.concurrent.operations` + - Maximum number of validation jobs that can be executed at the same time in the zone. Values lower than 1 disable the limit. + - `10` + - Zone + * - `backup.validation.max.concurrent.operations.per.host` + - Maximum number of validation jobs that can be executed at the same time on each host. Values lower than 1 disable the limit. + - `1` + - Cluster + * - `backup.validation.boot.default.timeout` + - Default timeout, in seconds, for the boot validation step + - `240` + - Account + * - `backup.validation.script.default.timeout` + - Default timeout, in seconds, for the script validation step + - `60` + - Account + * - `backup.validation.screenshot.default.wait` + - Default waiting time, in seconds, before executing the VM screenshot + - `60` + - Account + * - `backup.validation.end.chain.on.fail` + - If true, ends the current backup chain if backup validation fails and the backup belongs to that chain. + - `true` + - Account + * - `enforce.resource.limit.on.backup.validation.vm` + - If true, the creation of validation VMs is bound by the account/domain resource limits. + - `false` + - Account + +To configure the validation steps on a VM level, new VM settings were created. Most of them are available to end-users by default, except the timeouts. The availability of +these settings to User accounts may be configured by the `user.vm.readonly.details` global configuration. It is expected that users use these settings to configure the validation +process, especially the `execute_command` step, which if not configured using the VM settings will not run. Below is a table of the VM settings pertaining to the backup +validation process: + +.. list-table:: Validation VM settings + :widths: 20 80 + :header-rows: 1 + + * - Setting + - Description + * - `backupValidationCommand` + - Command to be executed during the command execution step. The step will not run if this configuration does not have a value + * - `backupValidationCommandArguments` + - Arguments to be passed to the command executed during the command execution step + * - `backupValidationCommandExpectedResult` + - Expected result of the command execution, coded in Base64. If not provided, the process exit code will be checked for value `0` + * - `backupValidationCommandTimeout` + - Timeout for the command executed during the command execution step. Overrides the global configuration + * - `backupValidationScreenshotWait` + - Waiting time before executing the screenshot during the screenshot step. Overrides the global configuration + * - `backupValidationBootTimeout` + - Timeout for the VM boot. Overrides the global configuration + +To check information about validation jobs, the **listBackupServiceJobs** API may be added. + + +.. |NASB&R-quiesceInstance.png| image:: /_static/images/NASB&R-quiesceInstance.png + :alt: Quiesce option while creating backups. + :width: 400 px diff --git a/source/adminguide/storage.rst b/source/adminguide/storage.rst index d1d0f2f6af..510ea568a5 100644 --- a/source/adminguide/storage.rst +++ b/source/adminguide/storage.rst @@ -443,10 +443,12 @@ from being used for storing any further Templates, Volumes and Snapshots. cmk updateImageStore id=4440f406-b9b6-46f1-93a4-378a75cf15de readonly=true +.. _Direct resources to a specific secondary storage: + Direct resources to a specific secondary storage ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -By default, ACS allocates ISOs, volumes, snapshots, and templates to the freest secondary storage of the zone. In order to direct these resources to a specific secondary storage, the user can utilize the functionality of the dynamic secondary storage selectors using heuristic rules. This functionality utilizes JavaScript rules, defined by the user, to direct these resources to a specific secondary storage. When creating the heuristic rule, the script will have access to some preset variables with information about the secondary storage in the zone, about the resource the rule will be applied upon, and about the account that triggered the allocation. These variables are presented in the table below: +By default, ACS allocates ISOs, volumes, snapshots, templates and KBOSS backups to the freest secondary storage of the zone. In order to direct these resources to a specific secondary storage, the user can utilize the functionality of the dynamic secondary storage selectors using heuristic rules. This functionality utilizes JavaScript rules, defined by the user, to direct these resources to a specific secondary storage. When creating the heuristic rule, the script will have access to some preset variables with information about the secondary storage in the zone, about the resource the rule will be applied upon, and about the account that triggered the allocation. These variables are presented in the table below: +-----------------------------------+-----------------------------------+ | Resource | Variables | @@ -479,6 +481,10 @@ By default, ACS allocates ISOs, volumes, snapshots, and templates to the freest | +-----------------------------------+ | | ``format`` | +-----------------------------------+-----------------------------------+ + | Backup | ``virtualSize`` | + | +-----------------------------------+ + | | ``offeringUuid`` | + +-----------------------------------+-----------------------------------+ | Account | ``id`` | | +-----------------------------------+ | | ``name`` | From 40a12b2c7fea716e64f90c79e0e852ea19126534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Wed, 15 Jul 2026 14:31:19 -0300 Subject: [PATCH 2/5] Apply suggestions from code review Co-authored-by: Fabricio Duarte --- source/adminguide/backup_and_recovery.rst | 2 +- source/adminguide/kboss_plugin.rst | 74 +++++++++++------------ 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/source/adminguide/backup_and_recovery.rst b/source/adminguide/backup_and_recovery.rst index 8371b13ccb..459b40e0b5 100644 --- a/source/adminguide/backup_and_recovery.rst +++ b/source/adminguide/backup_and_recovery.rst @@ -29,7 +29,7 @@ The following providers are currently supported: - VMware with Veeam Backup and Recovery - KVM with DELL EMC Networker - KVM with NAS B&R Plugin (4.20 onwards) -- KVM with KBOSS Plugin +- KVM with KBOSS Plugin (4.23 onwards) See the Veeam Backup and Recovery plugin documentation for plugin specific information. :ref:`Veeam Backup and Replication Plugin` diff --git a/source/adminguide/kboss_plugin.rst b/source/adminguide/kboss_plugin.rst index 662d51b1c9..cfa6a4f668 100644 --- a/source/adminguide/kboss_plugin.rst +++ b/source/adminguide/kboss_plugin.rst @@ -27,22 +27,22 @@ to create incremental backups of VMs. Its main characteristics are: - Support for backup compression. - Support for backup validation. - Support for "quick restore", inspired by Veeam's Instant Recovery. - - Incremental disk-only VM snapshot compatible (see :ref:`Disk-only-File-based-Storage-Instance-Snapshots-on-KVM`). + - Compatible with incremental disk-only VM snapshots (see :ref:`Disk-only-File-based-Storage-Instance-Snapshots-on-KVM`). - Backups are stored in the secondary storage. -While by default the backups are stored in any secondary storage available, sharing the same space with templates, ISOs and snapshots, -using the :ref:`Direct resources to a specific secondary storage` feature, it is possible to create backup-exclusive secondary storages. +By default, the backups are stored in any secondary storage available, sharing the same space with templates, ISOs and snapshots. +However, it is possible to create backup-exclusive secondary storages using the :ref:`Direct resources to a specific secondary storage` feature. -Currently, only backup of VMs from the NFS, File-based Shared Mountpoint and Local Storage based Primary Storage are supported. +Currently, only the backup of VMs consuming NFS, File-based Shared Mountpoint, and/or Local Storage is supported. -Since the KBOSS plugin is fully implemented by ACS, and does not depend on any outside provider, the **importBackupOffering** API is not used. -Instead, use the **createBackupOffering**, which allows users to configure KBOSS features they want to use. These backup offerings are then -assigned and used with KVM instances to perform support B&R actions and operations. +Since the KBOSS plugin is fully implemented by ACS, and does not depend on any external provider, the **importBackupOffering** API is not used. +Instead, the **createBackupOffering** is used to allow users to configure KBOSS features they want. These backup offerings can then +be assigned to KVM instances to perform B&R actions and operations. Using the KBOSS Backup and Recovery Plugin ------------------------------------------ -To use the KBOSS Backup and Recovery Plugin, the Backup and Recovery framework needs to be enabled first. Then the backup plugin 'kboss' needs to be enabled +To use the KBOSS Backup and Recovery Plugin, the Backup and Recovery framework needs to be enabled first. Then, 'kboss' needs to be configured as the backup provider on either the global or zone settings. ================================= ======================== @@ -52,15 +52,16 @@ backup.framework.enabled true backup.framework.provider.plugin kboss ================================= ======================== -Once the above two configurations are set, restart the cloudstack-management service. -After, we can create the first backup offering. Navigate to the Service Offerings -> Backup Offerings tab. Click on 'Create Backup Offering' and fill the form. +Once the two configurations above are set, restart the cloudstack-management service. + +After enabling the plugin, we can create the first backup offering. Navigate to the Service Offerings -> Backup Offerings tab, click on 'Create Backup Offering', and fill the wizard. =============================== ======================== Field Value =============================== ======================== Name A suitable name to represent the Backup Offering. Description A suitable description to represent the Backup Offering. -Zone Zone UUID for the backup offering. +Zone Zone in which this backup offering will be available. Allow User driven backups Whether to allow backups from the ACS API. If this value is false, you will not be able to create backups using KBOSS. **It must be set as true**. Public Whether the offering is public or dedicated to a domain. Domain Domain to dedicate the offering, only shown when 'Public' is false. @@ -75,28 +76,27 @@ Backup chain size The backup chain size of the incremental backups .. image:: /_static/images/create-backup-offering.png :align: center - :alt: NAS Backup repository + :alt: KBOSS backup offering creation wizard + -After this has been done, you can go to any Instance view and assign the backup offering to it. Then, there will be buttons available for either ad-hoc -backup or a scheduled backup of the VM. +After creating the backup offering, you can assign it to any Instance and start to perform ad-hoc backups or schedule them. Quiesce (Filesystem Freeze and Thaw) ------------------------------------ Users can set quiesce to true while creating a backup or a backup schedule. -When a backup is initiated with quiesce enabled, CloudStack uses QEMU guest agent -to freeze the filesystem before starting backup. This operation flushes all dirty +When a backup is initiated with quiesce enabled, CloudStack uses the QEMU guest agent +to freeze the filesystem before starting the backup. This operation flushes all dirty filesystem buffers to disk and quiesces new writes. The filesystem is then thawed immediately after the backup process starts, keeping the freezing window very short. |NASB&R-quiesceInstance.png| -This enhancement brings the KBOSS backup plugin from crash-consistent backups closer to -application-consistent backups. +This feature makes the KBOSS backups closer to application-consistent backups, rather than crash-consistent backups. Points to note: -#. The feature requires Qemu Guest Agent to be installed and running on the guest instance. +#. The feature requires QEMU Guest Agent to be installed and running on the guest instance. #. This method does not capture the memory state of the guest. Any data held in application memory that hasn’t been flushed to disk prior to the filesystem freeze will not be captured. #. For fully application-consistent backups, guest applications must implement pre-freeze hooks @@ -105,25 +105,24 @@ Points to note: Backup Chain Management ----------------------- -The size of the incremental backup chain is determined by the `backup.chain.size` zone-wide configuration; furthermore, it may be overwritten on the +The size of the incremental backup chain is determined by the `backup.chain.size` zone-wide configuration; furthermore, it may be overridden on the offering level. Once the backup chain reaches the configured size, the next backup will be a full backup and a new chain will start. If users wish to finalize the backup chain early, the **finishBackupChain** API may be used. It is also available through the VM instance interface on the GUI. -If the VM is in the `BackupError` state, ACS will try to normalize it. Most times ACS is able to normalize it, however, the VM may be unable to be recovered +Additionally, this API can also be used when the VM is in the `BackupError` state to normalize it. Most times ACS is able to normalize it; however, the VM may be unable to be recovered automatically for a number of reasons, for example if the storage is unavailable. Isolated backups ---------------- -If you want to create a backup that does not depend on any backup chain, you may inform the `isolated` flag when creating a backup, or a backup schedule. +If you want to create a backup that does not depend on, nor affects any backup chain, you may inform the `isolated` flag when creating a backup, or a backup schedule. When set, the created backup will be a full backup, with no dependencies on other backups, and no future backups will depend on it. Quick restore ------------- If the backup was created using an offering with `allowQuickRestore` set, the user will be able to restore it using the `quickRestore` flag. -When this is done, CloudStack creates new deltas on primary storage that have the backup as their backing files, while the backups are still on the -secondary storage. Then, the VM is automatically started and the volume consolidation process starts. While this is done, the VM is already available to use. +When this is done, CloudStack creates new deltas on primary storage that have the backup on secondary storage as their backing files. Then, the VM is automatically started and the volume consolidation process starts. During consolidation, the VM is already available to use. While this process is ongoing, the VM should not be stopped (from inside the VM), otherwise, it will fail to consolidate the volume. The benefit of using quick restore is that the VM is up and running in a very short time; however, the time to finish the consolidation process is bigger than normal restore. During @@ -178,10 +177,11 @@ To check information about compression jobs, the **listBackupServiceJobs** API m Validation ---------- -The backup validation process is executed asynchronously after the backup is created, for VMs using backup offerings that support it. To perform the validation, a temporary dummy -VM is created using the backup being validated and a few configurable validation steps are executed. After the first successful validation, a Hash of the backup is taken, -a new Hash is taken periodically and compared with the original to make sure the backup is still valid. Furthermore, most backup validation steps are dependant on the guest VM having -Qemu Guest Agent installed and configured to run on start. There are three currently available validation steps: +The backup validation process is executed asynchronously after the backup is created, for VMs using backup offerings that support it. Most backup validation steps are dependant on the guest VM having the QEMU Guest Agent installed and configured to run on start. To perform the validation, a temporary dummy +VM is created using the backup being validated and a few configurable validation steps are executed. After the first successful validation, a Hash of the backup is taken. +A new Hash is taken periodically and compared with the original to make sure the backup is still valid. + +There are three validation steps that can be configured currently: .. list-table:: Validation steps :widths: 20 60 20 @@ -189,12 +189,12 @@ Qemu Guest Agent installed and configured to run on start. There are three curre * - Step - Description - - Needs Qemu Gest Agent? + - Needs QEMU Guest Agent? * - `wait_for_boot` - Waits during a configurable timeout for the validation VM to boot. - Yes * - `execute_command` - - Executes a configurable command inside the VM using Qemu Guest Agent, compares the result with a configurable expected result + - Executes a configurable command inside the VM using the QEMU Guest Agent, and compares the result with a configurable expected result. - Yes * - `screenshot` - Takes a screenshot of the VM's window after a configurable time. The screenshot can then be downloaded via `downloadValidationScreenshot` API. @@ -249,9 +249,9 @@ The configurations related to backup validation are detailed below: - `false` - Account -To configure the validation steps on a VM level, new VM settings were created. Most of them are available to end-users by default, except the timeouts. The availability of -these settings to User accounts may be configured by the `user.vm.readonly.details` global configuration. It is expected that users use these settings to configure the validation -process, especially the `execute_command` step, which if not configured using the VM settings will not run. Below is a table of the VM settings pertaining to the backup +To allow configuring the validation steps on a VM basis, new VM settings were created. Most of them are available to end-users by default, except the timeouts. The availability of +these settings to User accounts may be configured by the `user.vm.readonly.details` global configuration. It is expected that users utilize these settings to configure the validation +process, especially the `execute_command` step, which will not run when not configured using the VM settings. Below, is a table of the VM settings pertaining to the backup validation process: .. list-table:: Validation VM settings @@ -261,13 +261,13 @@ validation process: * - Setting - Description * - `backupValidationCommand` - - Command to be executed during the command execution step. The step will not run if this configuration does not have a value + - Command to be executed during the execute_command step. The step will not run if this configuration does not have a value * - `backupValidationCommandArguments` - - Arguments to be passed to the command executed during the command execution step + - Arguments to be passed to the command executed during the execute_command step * - `backupValidationCommandExpectedResult` - - Expected result of the command execution, coded in Base64. If not provided, the process exit code will be checked for value `0` + - Expected output of the command's execution, coded in Base64. If not provided, the process exit code will be checked for value `0` * - `backupValidationCommandTimeout` - - Timeout for the command executed during the command execution step. Overrides the global configuration + - Timeout for the command executed during the execute_command step. Overrides the global configuration * - `backupValidationScreenshotWait` - Waiting time before executing the screenshot during the screenshot step. Overrides the global configuration * - `backupValidationBootTimeout` From 2eeabeb5e15b7c2128203cd4573d23db52553d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Wed, 15 Jul 2026 14:31:43 -0300 Subject: [PATCH 3/5] Update source/adminguide/kboss_plugin.rst --- source/adminguide/kboss_plugin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/kboss_plugin.rst b/source/adminguide/kboss_plugin.rst index cfa6a4f668..d5412b6a19 100644 --- a/source/adminguide/kboss_plugin.rst +++ b/source/adminguide/kboss_plugin.rst @@ -273,7 +273,7 @@ validation process: * - `backupValidationBootTimeout` - Timeout for the VM boot. Overrides the global configuration -To check information about validation jobs, the **listBackupServiceJobs** API may be added. +To check information about validation jobs, the **listBackupServiceJobs** API may be used. .. |NASB&R-quiesceInstance.png| image:: /_static/images/NASB&R-quiesceInstance.png From 64421f12834ffe073eeb7e9b83f9194b31b09649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= <48719461+JoaoJandre@users.noreply.github.com> Date: Wed, 15 Jul 2026 14:32:30 -0300 Subject: [PATCH 4/5] Apply suggestion from @JoaoJandre --- source/adminguide/kboss_plugin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/adminguide/kboss_plugin.rst b/source/adminguide/kboss_plugin.rst index d5412b6a19..79b7ea7061 100644 --- a/source/adminguide/kboss_plugin.rst +++ b/source/adminguide/kboss_plugin.rst @@ -172,7 +172,7 @@ There are several configurations that affect the backup compression task and pro - Compression rate limit, in MB/s. Values less than 1 disable the limit - 0 -To check information about compression jobs, the **listBackupServiceJobs** API may be added. +To check information about compression jobs, the **listBackupServiceJobs** API may be used. Validation ---------- From d65a3b9bb1458f3f4befc8ed4b42aaaf07c8a0b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Jandre?= Date: Wed, 15 Jul 2026 14:44:25 -0300 Subject: [PATCH 5/5] add backup chain by schedule details --- source/adminguide/kboss_plugin.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/adminguide/kboss_plugin.rst b/source/adminguide/kboss_plugin.rst index 79b7ea7061..486911c485 100644 --- a/source/adminguide/kboss_plugin.rst +++ b/source/adminguide/kboss_plugin.rst @@ -106,7 +106,9 @@ Backup Chain Management ----------------------- The size of the incremental backup chain is determined by the `backup.chain.size` zone-wide configuration; furthermore, it may be overridden on the -offering level. Once the backup chain reaches the configured size, the next backup will be a full backup and a new chain will start. +offering level. Once the backup chain reaches the configured size, the next backup will be a full backup and a new chain will start. Moreover, the backup chains +are currently separated by schedule ID, with manual backups having their own backup chain. Thus, if a user has a VM with two backup schedules, and also takes manual backups of the VM, it will have three +concurrent backup chains. If users wish to finalize the backup chain early, the **finishBackupChain** API may be used. It is also available through the VM instance interface on the GUI. Additionally, this API can also be used when the VM is in the `BackupError` state to normalize it. Most times ACS is able to normalize it; however, the VM may be unable to be recovered