# Veeam Agent Installation for CentOS 9 Stream

## <mark style="color:green;">Overview</mark> <a href="#introduction" id="introduction"></a>

This document is for installing the Veeam Backup Agent Linux on CentOS 9 Stream.

## <mark style="color:green;">Procedure</mark> <a href="#guidance" id="guidance"></a>

* OS: CentOS 9 Stream, running kernel 5.14.0-344.el9.x86\_64
* Veeam repository:  veeam-release-el9-1.0.8-1.x86\_64.rpm
* Veeam Agent: veeam-6.0.3.1221-1.el9.x86\_64

{% tabs %}
{% tab title="1. Install with non-UEFI Secure" %}
**Step 1: Download Veeam repository:**

The Veeam repository for Linux can be found at [![](https://repository.veeam.com/favicon.ico)Index of /backup/linux/agent/rpm/el/9/x86\_64/](https://repository.veeam.com/backup/linux/agent/rpm/el/9/x86_64/) . On this page, select "**veeam-release-el9-1.0.8-1.x86\_64.rpm**".

<figure><img src="/files/f4adSLx1eaFo5UqvfCkW" alt=""><figcaption></figcaption></figure>

**Step 2: Install Veeam and dependencies:**

* This will download an RPM file.  You will likely be unable to download this directly from this page to your Linux machine, as your server will likely not have a GUI or web browser.  To get around this, it is best to download the RPM to your workstation and then use WinSCP or MobaXterm to copy the RPM file to your server via SSH.
* Once the RPM is on your server, install it and its dependencies:

```
# dnf clean all 
# rpm -hi veeam-release-el9-1.0.8-1.x86_64.rpm 
# dnf install epel-release -y 
# dnf install dkms python3 make gcc perl kernel-modules-extra -y 
# dnf update 
# dnf install blksnap veeam -y
```

* The modules bdevfilter and blksnap will be created in /lib/modules/$(uname -r)/extra

```xml
[root@centos9 ~# ls /lib/modules/$(uname -r)/extra bdevfilter.ko.xz blksnap.ko.xz
```

* We can confirm that this module has not loaded by running lsmod, and grepping for blksnap.  We will see that grep returns 0 lines of output.

```
[root@centos9 ~]# lsmod | grep blksnap 0
```

**Step 3:** Insert modules bdevfilter and blksnap:

{% hint style="warning" %}
Important: If the server boots with Secure Boot, we can’t insert the module → Must run step 3 on Secure Boot below first.
{% endhint %}

We need to load the module into the currently running kernel using insmod:

```
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/bdevfilter.ko.xz 
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/blksnap.ko.xz 
[root@centos9 ~]# lsmod | grep blksnap 
blksnap 217088 0 
bdevfilter 20480 1 blksnap

```

At this point, our agent-based backups will run fine; however, the loaded module will not persist if we reboot.  We must create a file called /etc/modules-load.d/bdevfilter.conf and/etc/modules-load.d/blksnap.conf , and make sure that it has the name of the kernel module.  We must also run depmod to add the loaded kernel module to the kernel module dependencies list.

```
[root@centos9 ~]# depmod
[root@centos9 ~]# echo bdevfilter > /etc/modules-load.d/bdevfilter.conf
[root@centos9 ~]# echo blksnap > /etc/modules-load.d/blksnap.conf
[root@centos9 ~]# cat /etc/modules-load.d/bdevfilter.conf
bdevfilter
[root@centos9 ~]# cat /etc/modules-load.d/blksnap.conf
blksnap
```

Once we reboot the CentOS server, the veeamsnap module will automatically be loaded as a kernel module.

```
[root@centos9 ~]# uptime && lsmod | grep blksnap
 17:43:06 up 18 min,  1 user,  load average: 0.00, 0.00, 0.00
blksnap               217088  0
bdevfilter             20480  1 blksnap
```

<figure><img src="/files/cwAwy90jHK0X4ORk4fQ3" alt=""><figcaption></figcaption></figure>

And our agent-based backups will now work correctly.

Grand permission for 3 scripts:

`# chmod u+x one-time-setup sign-modules dkms-sign-module`

Create 2 files for signing modules to the UEFI database.

```
# echo POST_BUILD=../../../../../../root/module-signing/dkms-sign-module > /etc/dkms/bdevfilter.conf
# echo POST_BUILD=../../../../../../root/module-signing/dkms-sign-module > /etc/dkms/blksnap.conf
```

Run the file one-time-setup first and then reboot:

```
# /root/module-signing/one-time-setup
# reboot
```

During the reboot, when prompted, press any key to perform MOK management.

<div align="left"><figure><img src="/files/m3MFCNdIPxmWWWicMKuM" alt=""><figcaption></figcaption></figure></div>

At the wizard's first step, select **Enroll MOK** and press \[Enter].

<div align="left"><figure><img src="/files/6wjvSUCH3oxIopfGehPI" alt=""><figcaption></figcaption></figure></div>

At the **Enroll the key(s)** step, select **Yes** and press \[Enter].

<div align="left"><figure><img src="/files/lWrfqZpbmCqY0C99LhFX" alt=""><figcaption></figcaption></figure></div>

Provide the password for the root account and press \[Enter].

<div align="left"><figure><img src="/files/qESWIoqHXdKCsSv8mRjF" alt=""><figcaption></figcaption></figure></div>

At the final step, select **Reboot** and press \[Enter].

<div align="left"><figure><img src="/files/wUuql2cCtEvY8UGSLqRJ" alt=""><figcaption></figcaption></figure></div>

After that, sign 2 modules by running file sign-modules:

```
# /root/module-signing/sign-modules /lib/modules/$(uname -r)/extra/bdevfilter.ko.xz
# /root/module-signing/sign-modules /lib/modules/$(uname -r)/extra/blksnap.ko.xz
```

**Step 4: Insert modules bdevfilter and blksnap:**

We need to load the module into the currently running kernel using insmod:

```
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/bdevfilter.ko.xz
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/blksnap.ko.xz
[root@centos9 ~]# lsmod | grep blksnap
blksnap               217088  0
bdevfilter             20480  1 blksnap
```

At this point, our agent-based backups will run fine; however, the loaded module will not persist if we reboot.  We must create a file called /etc/modules-load.d/bdevfilter.conf and/etc/modules-load.d/blksnap.conf , and make sure that it has the name of the kernel module.  We must also run depmod to add the loaded kernel module to the kernel module dependencies list.

```
[root@centos9 ~]# depmod
[root@centos9 ~]# echo bdevfilter > /etc/modules-load.d/bdevfilter.conf
[root@centos9 ~]# echo blksnap > /etc/modules-load.d/blksnap.conf
[root@centos9 ~]# cat /etc/modules-load.d/bdevfilter.conf
bdevfilter
[root@centos9 ~]# cat /etc/modules-load.d/blksnap.conf
blksnap
```

Once we reboot the CentOS server, the veeamsnap module will automatically be loaded as a kernel module.

```
[root@centos9 ~]# uptime && lsmod | grep blksnap
 17:43:06 up 18 min,  1 user,  load average: 0.00, 0.00, 0.00
blksnap               217088  0
bdevfilter             20480  1 blksnap
```

And our agent-based backups will now work correctly.
{% endtab %}

{% tab title="2. Install with Secure Boot" %}
**Step 1: Download Veeam repository:**

The Veeam repository for Linux can be found at [![](https://repository.veeam.com/favicon.ico)Index of /backup/linux/agent/rpm/el/9/x86\_64/](https://repository.veeam.com/backup/linux/agent/rpm/el/9/x86_64/) . On this page, select "veeam-release-el9-1.0.8-1.x86\_64.rpm".

<div align="left"><figure><img src="/files/vebUDOmO3ayUC4CvSZy2" alt=""><figcaption></figcaption></figure></div>

**Step 2: Install Veeam and dependencies:**

* This will download an RPM file.  You will likely be unable to download this directly from this page to your Linux machine, as your server will likely not have a GUI or web browser.  To get around this, it is best to download the RPM to your workstation and then use WinSCP or MobaXterm to copy the RPM file to your server via SSH.
* Once the RPM is on your server, install it and its dependencies:

```
# dnf clean all
# rpm -hi veeam-release-el9-1.0.8-1.x86_64.rpm
# dnf install epel-release -y
# dnf install dkms python3 make gcc perl kernel-modules-extra -y
# dnf update
# dnf install blksnap veeam -y
```

* The modules bdevfilter and blksnap will be created in /lib/modules/$(uname -r)/extra

```
[root@centos9 ~]# ls /lib/modules/$(uname -r)/extra
bdevfilter.ko.xz  blksnap.ko.xz
```

* We can confirm that this module has not loaded by running lsmod, and grepping for blksnap.  We will see that grep returns 0 lines of output.

```
[root@centos9 ~]# lsmod | grep blksnap 
0
```

**Step 3:** Enrolling Veeam Kernel Module Key:

Create a directory /root/module-signing:

```
# mkdir module-signing/
```

Download 3 scripts from the link: [![](https://gist.github.com/favicon.ico)Make DKMS sign kernel modules on installation, with full script support and somewhat distro independent](https://gist.github.com/sbueringer/bd8cec239c44d66967cf307d808f10c4) and put it in the directory just created:

Grand permission for 3 scripts:

`# chmod u+x one-time-setup sign-modules dkms-sign-module`

Create 2 files for signing modules to the UEFI database.

```
# echo POST_BUILD=../../../../../../root/module-signing/dkms-sign-module > /etc/dkms/bdevfilter.conf
# echo POST_BUILD=../../../../../../root/module-signing/dkms-sign-module > /etc/dkms/blksnap.conf
```

Run the file one-time-setup first and then reboot:

```
# /root/module-signing/one-time-setup
# reboot
```

During the reboot, when prompted, press any key to perform MOK management.

<div align="left"><figure><img src="/files/m3MFCNdIPxmWWWicMKuM" alt=""><figcaption></figcaption></figure></div>

At the wizard's first step, select **Enroll MOK** and press \[Enter].

<div align="left"><figure><img src="/files/6wjvSUCH3oxIopfGehPI" alt=""><figcaption></figcaption></figure></div>

At the **Enroll the key(s)** step, select **Yes** and press \[Enter].

<div align="left"><figure><img src="/files/lWrfqZpbmCqY0C99LhFX" alt=""><figcaption></figcaption></figure></div>

Provide the password for the root account and press \[Enter].

<div align="left"><figure><img src="/files/qESWIoqHXdKCsSv8mRjF" alt=""><figcaption></figcaption></figure></div>

At the final step, select **Reboot** and press \[Enter].

<div align="left"><figure><img src="/files/wUuql2cCtEvY8UGSLqRJ" alt=""><figcaption></figcaption></figure></div>

After that, sign 2 modules by running file sign-modules:

```
# /root/module-signing/sign-modules /lib/modules/$(uname -r)/extra/bdevfilter.ko.xz
# /root/module-signing/sign-modules /lib/modules/$(uname -r)/extra/blksnap.ko.xz
```

**Step 4: Insert modules bdevfilter and blksnap:**

We need to load the module into the currently running kernel using insmod:

```
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/bdevfilter.ko.xz
[root@centos9 ~]# insmod /lib/modules/$(uname -r)/extra/blksnap.ko.xz
[root@centos9 ~]# lsmod | grep blksnap
blksnap               217088  0
bdevfilter             20480  1 blksnap
```

At this point, our agent-based backups will run fine; however, the loaded module will not persist if we reboot.  We must create a file called /etc/modules-load.d/bdevfilter.conf and/etc/modules-load.d/blksnap.conf , and make sure that it has the name of the kernel module.  We must also run depmod to add the loaded kernel module to the kernel module dependencies list.

```
[root@centos9 ~]# depmod
[root@centos9 ~]# echo bdevfilter > /etc/modules-load.d/bdevfilter.conf
[root@centos9 ~]# echo blksnap > /etc/modules-load.d/blksnap.conf
[root@centos9 ~]# cat /etc/modules-load.d/bdevfilter.conf
bdevfilter
[root@centos9 ~]# cat /etc/modules-load.d/blksnap.conf
blksnap
```

Once we reboot the CentOS server, the veeamsnap module will automatically be loaded as a kernel module.

```
[root@centos9 ~]# uptime && lsmod | grep blksnap
 17:43:06 up 18 min,  1 user,  load average: 0.00, 0.00, 0.00
blksnap               217088  0
bdevfilter             20480  1 blksnap
```

And our agent-based backups will now work correctly.
{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.higiocloud.vn/back-up-as-a-service/1.-hi-gio-baas/workaround/veeam-agent-installation-for-centos-9-stream.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
