Post

Veeam

Veeam Backup & Replication Cheat Sheet for Admins

*Your complete command reference for Veeam Backup & Replication across all platforms - PowerShell, CLI, REST API.


📋 Table of Contents

  1. Introduction
  2. Prerequisites & Setup
  3. Veeam Backup & Replication PowerShell (Windows Server)
  4. Veeam Agent for Windows
  5. Veeam Agent for Linux
  6. Veeam Agent for macOS
  7. Veeam Enterprise Manager CLI
  8. REST API Examples
  9. Backup Repository Management
  10. Replication & Failover
  11. SureBackup & Instant Recovery
  12. Backup Copy Jobs & GFS Retention
  13. Veeam Backup Catalog
  14. Troubleshooting & Logs
  15. Performance Tuning & Best Practices
  16. Security & Encryption
  17. Platform-Specific Nuances
  18. Quick Command Reference Table

Introduction

Veeam Backup & Replication is a powerful enterprise backup solution, but with great power comes a steep learning curve. Whether you’re managing backup jobs, troubleshooting replication, or automating tasks via PowerShell, having quick access to the right commands can save hours of frustration.

This cheat sheet consolidates every essential command you’ll need when working with Veeam across Windows, Linux, and macOS environments. Bookmark this page - it’s your one-stop solution when you’re stuck on the Veeam backup server and need to work fast.


Prerequisites & Setup

Veeam PowerShell Module (Windows)

1
2
3
4
5
6
7
8
9
10
11
# Import the Veeam PowerShell module
Import-Module Veeam.Backup.PowerShell

# Connect to Veeam Backup Server
Connect-VBRServer -Server "veeam-backup.company.com" -User "admin" -Password "yourpassword"

# Or use credentials prompt (more secure)
Connect-VBRServer -Server "veeam-backup.company.com" -Credential (Get-Credential)

# Disconnect when done
Disconnect-VBRServer

Veeam Agent for Windows CLI

1
2
3
4
5
# Agent is typically installed at:
$veeamAgentPath = "C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe"

# Check if agent is running
Get-Process | Where-Object {$_.ProcessName -like "*Veeam*"}

Veeam Agent for Linux

1
2
3
4
5
6
# Check agent status
sudo veeamconfig status

# Agent binary location
/opt/veeam/bin/veeamconfig
/opt/veeam/bin/veeamz

Veeam Agent for macOS

1
2
3
4
5
# Agent binary location
/Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig

# Check status
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig status

Veeam Backup & Replication PowerShell (Windows Server)

Discovery & Exploration

1
2
3
4
5
6
7
8
9
10
11
12
# List all Veeam PowerShell cmdlets
Get-VBRCommand

# Filter by verb (Get, Start, Stop, Set, New, Remove)
Get-VBRCommand -Verb Get, Start, Stop

# Filter by noun pattern (find all job-related commands)
Get-VBRCommand -Name "*Job*"

# Get detailed help for any cmdlet
Get-Help Start-VBRJob -Full
Get-Help Start-VBRJob -Examples

Server & Connection Management

1
2
3
4
5
6
7
8
9
10
11
# Get current Veeam server connection
Get-VBRServer

# Connect to backup server (already shown above)
Connect-VBRServer -Server "server-name"

# Test connection
Test-VBRConnection

# Get server information
Get-VBRServer | Select-Object Name, Version, IsReady, Type

Job Management

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
# List all backup jobs
Get-VBRJob | Select-Object Name, Type, State, IsScheduleEnabled

# Get specific job
$job = Get-VBRJob -Name "Backup-Job-01"

# Start a job
Start-VBRJob -Name "Backup-Job-01"
Start-VBRJob -Job $job

# Start job and wait for completion
Start-VBRJob -Name "Backup-Job-01" -WarningAction SilentlyContinue
Wait-VBRJob -Job $job

# Stop a running job
Stop-VBRJob -Name "Backup-Job-01"
Stop-VBRJob -Job $job

# Retry a failed job
Start-VBRJob -Name "Backup-Job-01" -Retry

# Enable/disable job schedule
Set-VBRJob -Name "Backup-Job-01" -ScheduleEnabled $true
Set-VBRJob -Name "Backup-Job-01" -ScheduleEnabled $false

# Quick backup (incremental backup without full)
Start-VBRQuickBackup -Name "Backup-Job-01"

# Get job options
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options
$job.BackupStorageOptions
$job.BackupTargetOptions

Job Session Management

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# List all job sessions (recent)
Get-VBRBackupSession | Select-Object JobName, State, CreationTime, EndTime

# Get sessions for specific job
Get-VBRBackupSession -Name "Backup-Job-01" | Select-Object State, CreationTime, Progress

# Get current running sessions
Get-VBRBackupSession | Where-Object {$_.State -eq "Running"}

# Get session details
$session = Get-VBRBackupSession | Where-Object {$_.JobName -eq "Backup-Job-01"} | Select-Object -First 1
$session | Get-Member

# Get session statistics
$session = Get-VBRBackupSession -Name "Backup-Job-01-Session-001"
$session.Statistics
$session.Statistics.ProcessedSize
$session.Statistics.DataRead
$session.Statistics.DataTransferred

Backup Repository Management

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# List all backup repositories
Get-VBRBackupRepository | Select-Object Name, Type, IsReady, Info

# Get repository details
$repo = Get-VBRBackupRepository -Name "BackupRepo-01"
$repo | Get-Member

# Test repository connectivity
Test-VBRBackupRepository -Repository $repo

# Get repository capacity
$repo.Capacity
$repo.FreeSpace
$repo.UsedSpace

# List repository content (backup files)
Get-VBRBackup -Repository $repo | Select-Object Name, CreationTime, Size

# Find backups by name
Get-VBRBackup -Name "*VM-Name*" | Select-Object Name, Repository, CreationTime

# Restore from backup (see Restore section below)

Scale-Out Backup Repositories

1
2
3
4
5
6
7
8
9
# List scale-out repositories
Get-VBRScaleOutRepository | Select-Object Name, Type, IsReady

# Get extent information
$soRepo = Get-VBRScaleOutRepository -Name "SO-Repo-01"
$soRepo.GetExtents() | Select-Object Name, Capacity, FreeSpace

# Add extent to scale-out repo
Add-VBRScaleOutRepositoryExtent -Repository $soRepo -Path "\\server\share\extent"

Backup Management

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# List all backups
Get-VBRBackup | Select-Object Name, Repository, CreationTime, Size

# Get backup details
$backup = Get-VBRBackup -Name "VM-Backup-01"
$backup | Get-Member

# Get restore points
$backup = Get-VBRBackup -Name "VM-Backup-01"
$backup.GetRestorePoints() | Select-Object CreationTime, Type, IsFull

# Delete backup
Remove-VBRBackup -Backup $backup -Confirm:$false

# Export backup
Export-VBRBackup -Backup $backup -Path "C:\Export\"

Restore Operations

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Restore entire VM
$backup = Get-VBRBackup -Name "VM-Backup-01"
$restorePoint = $backup.GetRestorePoints() | Select-Object -First 1
Start-VBRRestoreVM -Backup $backup -RestorePoint $restorePoint -VMName "Restored-VM"

# Instant VM recovery (quick VM start from backup)
Start-VBRInstantVMRecovery -Backup $backup -RestorePoint $restorePoint -VMName "Instant-VM"

# Restore specific disks
Start-VBRRestoreDisk -Backup $backup -RestorePoint $restorePoint -DiskName "C:\"

# Application-aware restore (SQL, Exchange, etc.)
Start-VBRRestoreApplication -Backup $backup -RestorePoint $restorePoint -AppType "SQL"

# File-level recovery
Start-VBRRestoreFile -Backup $backup -RestorePoint $restorePoint -Path "C:\RecoveredFiles\"

Replication Management

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# List replication jobs
Get-VBRJob -Type Replica | Select-Object Name, State, Target

# Get replication job details
$replicaJob = Get-VBRJob -Name "Replica-Job-01" -Type Replica

# Start replication
Start-VBRJob -Name "Replica-Job-01"

# Failover to replica
Start-VBRFailover -Job $replicaJob -VMName "VM-01" -FailoverType "Failover"

# Failback (reverse replication)
Start-VBRFailback -Job $replicaJob -VMName "VM-01"

# Permanent failover (make replica primary)
Start-VBRPermanentFailover -Job $replicaJob -VMName "VM-01"

# Test failover (sandbox)
Start-VBRTestFailover -Job $replicaJob -VMName "VM-01"

SureBackup & Recovery Verification

1
2
3
4
5
6
7
8
9
10
11
# Start SureBackup job
Start-VBRSureBackup -Job $job

# Get SureBackup session
Get-VBRSureBackupSession | Select-Object JobName, State, Result

# Configure SureBackup settings
$job = Get-VBRJob -Name "Backup-Job-01"
$job.SureBackupOptions.Enabled = $true
$job.SureBackupOptions.RunOnHost = $true
Set-VBRJob -Job $job

Backup Copy Jobs

1
2
3
4
5
6
7
8
9
# List backup copy jobs
Get-VBRJob -Type BackupCopy | Select-Object Name, Source, Destination

# Start backup copy job
Start-VBRJob -Name "BackupCopy-Job-01"

# Get GFS retention settings
$bcJob = Get-VBRJob -Name "BackupCopy-Job-01" -Type BackupCopy
$bcJob.BackupCopyOptions.GfsRetention

Veeam Backup Catalog

1
2
3
4
5
6
7
8
# Search catalog for files
Find-VBRCatalogItem -Path "*document*" -SearchInBackup

# Get catalog statistics
Get-VBRCatalogStatistics

# Rebuild catalog (if needed)
Start-VBRCatalogRebuild

Infrastructure Objects

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# List managed servers
Get-VBRServer | Select-Object Name, Type, IsReady, Description

# Get specific server
$server = Get-VBRServer -Name "vcenter.company.com"

# Add managed server
Add-VBRServer -Server "new-server.company.com" -Credential (Get-Credential)

# Remove managed server
Remove-VBRServer -Server $server -Confirm:$false

# Rename managed server
$server = Get-VBRServer -Name "old-name"
$server.SetName("new-name")

# List VMware vCenter servers
Get-VBRServer -Type VMware

# List Hyper-V hosts
Get-VBRServer -Type HyperV

# List Linux/Windows servers (backup agents)
Get-VBRServer -Type Windows, Linux

Proxy Management

1
2
3
4
5
6
7
8
9
10
11
# List backup proxies
Get-VBRProxy | Select-Object Name, Type, IsReady, Host

# Get proxy details
$proxy = Get-VBRProxy -Name "BackupProxy-01"

# Set backup proxy priority
Set-VBRProxy -Proxy $proxy -Priority 1

# Enable/disable proxy
Set-VBRProxy -Proxy $proxy -Enabled $true

WAN Accelerators

1
2
3
4
5
# List WAN accelerators
Get-VBRWANAccelerator | Select-Object Name, IsReady

# Get WAN accelerator details
$wan = Get-VBRWANAccelerator -Name "WAN-Accel-01"

Tape Management

1
2
3
4
5
6
7
8
# List tape libraries
Get-VBRLibrary | Select-Object Name, Type, IsReady

# List tapes
Get-VBRTape | Select-Object Name, Barcode, MediaPool, IsAvailable

# Export to tape
Start-VBRTapeExport -Backup $backup -Tape $tape

User Roles & Permissions

1
2
3
4
5
6
7
8
9
# List user roles
Get-VBRRole | Select-Object Name, Description

# Get role permissions
$role = Get-VBRRole -Name "Backup Operator"
$role.Permissions

# Assign role to user
Add-VBRUserRole -User "domain\username" -Role $role

Reporting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Get job statistics for last 7 days
$sessions = Get-VBRBackupSession | Where-Object {$_.CreationTime -gt (Get-Date).AddDays(-7)}
$sessions | Group-Object JobName | ForEach-Object {
    [PSCustomObject]@{
        JobName = $_.Name
        TotalSessions = $_.Count
        Successful = ($_.Group | Where-Object {$_.State -eq "Success"}).Count
        Failed = ($_.Group | Where-Object {$_.State -eq "Failed"}).Count
        TotalData = ($_.Group | Measure-Object -Property ProcessedSize -Sum).Sum
    }
} | Format-Table

# Export report to CSV
$report | Export-Csv -Path "C:\Reports\Veeam-Job-Report.csv" -NoTypeInformation

Veeam Agent for Windows

Installation & Configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Install Veeam Agent for Windows (silent)
msiexec /i "VeeamAgentWindows_x64.msi" /qn /L*V "C:\Logs\VeeamAgentInstall.log"

# Configure backup job via CLI
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:create /name:"MyBackup" /type:backup /target:"C:\Backup" /schedule:daily

# List configured jobs
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:list

# Run backup job manually
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:run /name:"MyBackup"

# Remove backup job
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:delete /name:"MyBackup"

Backup Types

1
2
3
4
5
6
7
8
# Full backup
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:run /name:"MyBackup" /full

# Incremental backup (default)
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:run /name:"MyBackup"

# Active full backup
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /job:run /name:"MyBackup" /activefull

Restore Options

1
2
3
4
5
6
7
8
# Volume restore (entire disk)
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /restore:volume /backup:"C:\Backup\backup-001.vbm" /target:"C:\"

# File-level restore
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /restore:files /backup:"C:\Backup\backup-001.vbm" /path:"C:\Recovered"

# Instant recovery (mount backup as drive)
"C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.Manager.exe" /restore:instant /backup:"C:\Backup\backup-001.vbm"

Check Job Status

1
2
3
4
5
6
7
# Check last job result
$lastJob = Get-WinEvent -LogName "Veeam Endpoint Backup" -MaxEvents 1
$lastJob.Message

# Or use Veeam PowerShell module (if installed)
Import-Module "C:\Program Files\Veeam\Endpoint Backup\Veeam.EndPoint.PowerShell.dll"
Get-VEBJob | Select-Object Name, LastResult, LastRun

Veeam Agent for Linux

Installation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# RHEL/CentOS/Oracle Linux
sudo rpm -i veeam-agent-linux.rpm

# Ubuntu/Debian
sudo dpkg -i veeam-agent-linux.deb

# SLES
sudo rpm -i veeam-agent-linux-sles.rpm

# Start service
sudo systemctl start veeam
sudo systemctl enable veeam

# Check status
sudo systemctl status veeam

Configuration & Backup

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Create backup job (interactive)
sudo veeamconfig create backup --name "LinuxBackup" --repo "path/to/repo" --include "/home,/var"

# List jobs
sudo veeamconfig job list

# Run backup job
sudo veeamconfig job start --name "LinuxBackup"

# Stop running job
sudo veeamconfig job stop --name "LinuxBackup"

# Delete job
sudo veeamconfig job delete --name "LinuxBackup"

Advanced Options

1
2
3
4
5
6
7
8
9
10
11
# Backup with compression level
sudo veeamconfig create backup --name "LinuxBackup" --repo "/backup" --compression "optimal"

# Backup with encryption
sudo veeamconfig create backup --name "LinuxBackup" --repo "/backup" --encryption "AES256" --password "yourpassword"

# Exclude files/folders
sudo veeamconfig create backup --name "LinuxBackup" --repo "/backup" --exclude "/tmp/*" --exclude "/var/log/*"

# Schedule backup (daily at 2 AM)
sudo veeamconfig create backup --name "LinuxBackup" --repo "/backup" --schedule "0 2 * * *"

Restore

1
2
3
4
5
6
7
8
# Volume restore
sudo veeamconfig restore volume --backup "/backup/backup-001.vbm" --target "/"

# File restore
sudo veeamconfig restore files --backup "/backup/backup-001.vbm" --path "/tmp/recovered"

# List backups in repository
sudo veeamconfig repo list --path "/backup"

Logs & Troubleshooting

1
2
3
4
5
6
7
8
9
10
11
# View agent logs
sudo tail -f /var/log/veeam/veeam.log

# Check job history
sudo veeamconfig session list

# Get session details
sudo veeamconfig session get --id <session-id>

# Enable debug logging
sudo veeamconfig set --debug true

Veeam Agent for macOS

Installation

1
2
3
4
5
6
7
8
# Install .pkg (double-click or via CLI)
sudo installer -pkg VeeamAgentMacOS.pkg -target /

# Start agent
sudo launchctl load /Library/LaunchDaemons/com.veeam.agent.plist

# Check status
sudo launchctl list | grep veeam

Backup Commands

1
2
3
4
5
6
7
8
9
10
11
# Create backup job
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig create backup --name "MacBackup" --repo "/Volumes/BackupDrive" --include "/Users,/Applications"

# List jobs
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig job list

# Run backup
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig job start --name "MacBackup"

# Stop backup
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig job stop --name "MacBackup"

Restore

1
2
3
4
5
# File restore
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig restore files --backup "/Volumes/BackupDrive/backup-001.vbm" --path "/tmp/recovered"

# Volume restore
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig restore volume --backup "/Volumes/BackupDrive/backup-001.vbm" --target "/"

Time Machine Integration

1
2
3
4
5
# Exclude Time Machine from backup
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig create backup --name "MacBackup" --repo "/backup" --exclude "/Volumes/TimeMachine/*"

# Backup Time Machine volume (if needed)
sudo /Applications/Veeam\ Agent.app/Contents/MacOS/veeamconfig create backup --name "TMBackup" --repo "/backup" --include "/Volumes/TimeMachine"

Veeam Enterprise Manager CLI

Connection & Authentication

1
2
3
4
5
6
7
8
# Connect to Enterprise Manager
vemcmd.exe -s <server> -u <username> -p <password>

# Or use config file
vemcmd.exe -c config.xml

# Disconnect
vemcmd.exe -x

Session Management

1
2
3
4
5
6
7
8
# List active sessions
vemcmd.exe "session list"

# Get session details
vemcmd.exe "session get <session-id>"

# Terminate session
vemcmd.exe "session terminate <session-id>"

Backup Management

1
2
3
4
5
6
7
8
9
10
11
# List backups
vemcmd.exe "backup list"

# Search backups
vemcmd.exe "backup search --name <pattern>"

# Get backup info
vemcmd.exe "backup info <backup-id>"

# Delete backup
vemcmd.exe "backup delete <backup-id>"

User Management

1
2
3
4
5
6
7
8
9
10
11
# List users
vemcmd.exe "user list"

# Add user
vemcmd.exe "user add --name <username> --role <role>"

# Modify user
vemcmd.exe "user modify <user-id> --role <new-role>"

# Delete user
vemcmd.exe "user delete <user-id>"

Reporting

1
2
3
4
5
# Generate report
vemcmd.exe "report generate --type backup --period last7days --format csv --output C:\Reports\report.csv"

# Get license info
vemcmd.exe "license info"

REST API Examples

Veeam Backup & Replication provides a comprehensive REST API for automation. Base URL: https://<veeam-server>:9398/api/v1/

Authentication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Get authentication token
$headers = @{
    "Content-Type" = "application/json"
}
$body = @{
    username = "admin"
    password = "yourpassword"
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/authenticate" -Method Post -Headers $headers -Body $body
$token = $response.token

# Use token in subsequent requests
$authHeaders = @{
    "Authorization" = "Bearer $token"
    "Content-Type" = "application/json"
}

Common API Calls

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
# Get all jobs
$jobs = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/jobs" -Headers $authHeaders -Method Get

# Get specific job
$job = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/jobs/{job-id}" -Headers $authHeaders -Method Get

# Start job
$body = @{
    "id" = "{job-id}"
} | ConvertTo-Json
Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/jobs/{job-id}/start" -Headers $authHeaders -Method Post -Body $body

# Get job sessions
$sessions = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/jobs/{job-id}/sessions" -Headers $authHeaders -Method Get

# Get repositories
$repos = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/repositories" -Headers $authHeaders -Method Get

# Get backups
$backups = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/backups" -Headers $authHeaders -Method Get

# Search backups
$body = @{
    "name" = "VM-Name"
} | ConvertTo-Json
$searchResults = Invoke-RestMethod -Uri "https://veeam-server:9398/api/v1/backups/search" -Headers $authHeaders -Method Post -Body $body

Python Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import json

# Authenticate
auth_url = "https://veeam-server:9398/api/v1/authenticate"
auth_data = {"username": "admin", "password": "yourpassword"}
response = requests.post(auth_url, json=auth_data, verify=False)  # verify=False for self-signed certs
token = response.json()["token"]

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

# Get all jobs
jobs = requests.get("https://veeam-server:9398/api/v1/jobs", headers=headers, verify=False)
print(jobs.json())

Backup Repository Management

Repository Types

1
2
3
4
5
6
7
8
# List repository types
Get-VBRBackupRepositoryType

# Common types:
# - WindowsLocal - Windows local folder
# - WindowsShare - SMB/CIFS share
# - LinuxRepository - Linux repository (via SSH)
# - ScaleOut - Scale-out backup repository

Create Repository

1
2
3
4
5
6
7
8
# Create Windows local repository
$repo = Add-VBRBackupRepository -Name "LocalRepo01" -Path "D:\Backups" -Type WindowsLocal

# Create SMB share repository
$repo = Add-VBRBackupRepository -Name "SMBRepo01" -Path "\\server\share" -Type WindowsShare -Credential (Get-Credential)

# Create Linux repository
$repo = Add-VBRBackupRepository -Name "LinuxRepo01" -Path "/backup" -Type LinuxRepository -Server "linux-server" -Credential (Get-Credential)

Repository Maintenance

1
2
3
4
5
6
7
8
9
10
11
# Garbage collection (remove deleted data blocks)
Start-VBRGarbageCollection -Repository $repo

# Defragmentation (optimize storage)
Start-VBRDefragmentation -Repository $repo

# Transform full to synthetic full
Start-VBRSyntheticFull -Backup $backup

# Health check
Test-VBRBackupRepository -Repository $repo

Capacity Planning

1
2
3
4
5
6
7
8
9
10
11
# Calculate required storage
$vmSizeGB = 500  # Size of VM
$compressionRatio = 0.5  # Expected 50% compression
$deduplicationRatio = 0.3  # Expected 70% deduplication
$retentionDays = 30
$dailyChangeRate = 0.02  # 2% daily change

$dailyBackupSize = $vmSizeGB * $compressionRatio * $deduplicationRatio * $dailyChangeRate
$totalRequired = $dailyBackupSize * $retentionDays + ($vmSizeGB * $compressionRatio * $deduplicationRatio)  # Full backup + incrementals

Write-Host "Estimated storage needed: $totalRequired GB"

Replication & Failover

Replication Job Configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
# Create replication job
$replicaJob = Add-VBRJob -Name "Replica-Job-01" -Type Replica

# Add VMs to replicate
Add-VBRJobObject -Job $replicaJob -Server $vmwareServer -VM "VM-01","VM-02"

# Set replication target
Set-VBRJob -Job $replicaJob -Target (Get-VBRServer -Name "DR-Site-vCenter")

# Configure replication settings
$replicaJob.ReplicaOptions.EnableCompression = $true
$replicaJob.ReplicaOptions.EnableEncryption = $false
Set-VBRJob -Job $replicaJob

Failover Operations

# Planned failover (graceful)
Start-VBRFailover -Job $replicaJob -VMName "VM-01" -FailoverType "Failover"

# Failover without network reconfiguration
Start-VBRFailover -Job $replicaJob -VMName "VM-01" -FailoverType "FailoverNoNetwork"

# Failback (restore original VM from replica)
Start-VBRFailback -Job $replicaJob -VMName "VM-01"

# Permanent failover (make replica primary, stop replication)
Start-VBRPermanentFailover -Job $replicaJob -VMName "VM-01"

# Test failover (sandbox, non-disruptive)
Start-VBRTestFailover -Job $replicaJob -VMName "VM-01" -Snapshot

Replication Monitoring

1
2
3
4
5
6
7
8
9
# Check replication health
Get-VBRReplica -VM "VM-01" | Select-Object Name, State, LastSync, Rpo

# Get replication statistics
$replica = Get-VBRReplica -VM "VM-01"
$replica.Statistics

# List replication sessions
Get-VBRReplicaSession | Select-Object VMName, State, StartTime, EndTime

SureBackup & Instant Recovery

SureBackup Configuration

1
2
3
4
5
6
7
8
9
10
11
# Enable SureBackup for a job
$job = Get-VBRJob -Name "Backup-Job-01"
$job.SureBackupOptions.Enabled = $true
$job.SureBackupOptions.RunOnHost = $true  # Run on backup host
$job.SureBackupOptions.RunOnHostGroup = $false
Set-VBRJob -Job $job

# Configure SureBackup network
$job.SureBackupOptions.NetworkMapping = $true
$job.SureBackupOptions.NetworkName = "Test-Network"
Set-VBRJob -Job $job

Run SureBackup

1
2
3
4
5
6
7
8
# Start SureBackup verification
Start-VBRSureBackup -Job $job

# Get SureBackup session
$sbSession = Get-VBRSureBackupSession | Where-Object {$_.JobName -eq "Backup-Job-01"} | Select-Object -First 1

# Check SureBackup result
$sbSession.Result  # Success, Failed, Warning

Instant Recovery

1
2
3
4
5
6
7
8
9
10
# Instant VM recovery (start VM directly from backup)
$backup = Get-VBRBackup -Name "VM-Backup-01"
$restorePoint = $backup.GetRestorePoints() | Select-Object -First 1
Start-VBRInstantVMRecovery -Backup $backup -RestorePoint $restorePoint -VMName "Instant-VM" -PowerOn

# Instant disk recovery (mount disk to running VM)
Start-VBRInstantDiskRecovery -Backup $backup -RestorePoint $restorePoint -TargetVM "Running-VM" -DiskNumber 1

# Instant file recovery (mount backup and browse)
Start-VBRInstantFileRecovery -Backup $backup -RestorePoint $restorePoint

Backup Copy Jobs & GFS Retention

Create Backup Copy Job

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Create backup copy job
$bcJob = Add-VBRJob -Name "BackupCopy-Job-01" -Type BackupCopy

# Set source backup
$sourceBackup = Get-VBRBackup -Name "Primary-Backup"
Add-VBRJobObject -Job $bcJob -Backup $sourceBackup

# Set destination repository
$destRepo = Get-VBRBackupRepository -Name "DR-Repo"
Set-VBRJob -Job $bcJob -Repository $destRepo

# Configure copy settings
$bcJob.BackupCopyOptions.CopyMethod = "Backup"  # or "Replica"
$bcJob.BackupCopyOptions.CompressionLevel = "Optimal"
Set-VBRJob -Job $bcJob

GFS Retention (Grandfather-Father-Son)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Configure GFS retention on backup copy job
$bcJob = Get-VBRJob -Name "BackupCopy-Job-01" -Type BackupCopy

# Daily backups (keep for 30 days)
$bcJob.BackupCopyOptions.GfsRetention.Daily.IsEnabled = $true
$bcJob.BackupCopyOptions.GfsRetention.Daily.KeepFor = 30

# Weekly backups (keep for 12 weeks)
$bcJob.BackupCopyOptions.GfsRetention.Weekly.IsEnabled = $true
$bcJob.BackupCopyOptions.GfsRetention.Weekly.KeepFor = 12
$bcJob.BackupCopyOptions.GfsRetention.Weekly.DayOfWeek = "Sunday"

# Monthly backups (keep for 12 months)
$bcJob.BackupCopyOptions.GfsRetention.Monthly.IsEnabled = $true
$bcJob.BackupCopyOptions.GfsRetention.Monthly.KeepFor = 12
$bcJob.BackupCopyOptions.GfsRetention.Monthly.DayOfMonth = 1

# Yearly backups (keep for 5 years)
$bcJob.BackupCopyOptions.GfsRetention.Yearly.IsEnabled = $true
$bcJob.BackupCopyOptions.GfsRetention.Yearly.KeepFor = 5
$bcJob.BackupCopyOptions.GfsRetention.Yearly.DayOfYear = "January 1"

Set-VBRJob -Job $bcJob

Create GFS Full Backups

1
2
3
4
5
6
7
8
9
# Force GFS full backup creation
Start-VBRGfsFull -Job $bcJob -RetentionType Monthly

# Check GFS backups
$backups = Get-VBRBackup -Name "Primary-Backup"
foreach ($backup in $backups) {
    $points = $backup.GetRestorePoints() | Where-Object {$_.Type -eq "Full"}
    $points | Select-Object CreationTime, Type
}

Veeam Backup Catalog

Catalog Configuration

1
2
3
4
5
6
7
8
9
10
# Enable catalog for backup job
$job = Get-VBRJob -Name "Backup-Job-01"
$job.CatalogOptions.Enabled = $true
Set-VBRJob -Job $job

# Rebuild catalog (if corrupted)
Start-VBRCatalogRebuild

# Get catalog statistics
Get-VBRCatalogStatistics | Select-Object TotalIndexedFiles, TotalIndexedSize, LastUpdate

Search Catalog

1
2
3
4
5
6
7
8
9
# Search for files in catalog
$results = Find-VBRCatalogItem -Path "*report*.xlsx" -SearchInBackup
$results | Select-Object Path, BackupName, RestorePoint

# Search by date range
$results = Find-VBRCatalogItem -Path "*" -FromDate (Get-Date).AddDays(-30) -ToDate (Get-Date)

# Export search results
$results | Export-Csv -Path "C:\SearchResults.csv" -NoTypeInformation

Indexing Options

1
2
3
4
5
# Configure indexing settings
$job = Get-VBRJob -Name "Backup-Job-01"
$job.CatalogOptions.EnableIndexing = $true
$job.CatalogOptions.IndexingOptions.ExcludePaths = @("C:\Temp\*", "C:\Windows\Temp\*")
Set-VBRJob -Job $job

Troubleshooting & Logs

Log Locations

Windows (Backup Server):

  • Main logs: C:\ProgramData\Veeam\Backup\
  • Job logs: C:\ProgramData\Veeam\Backup\Backup_<JobName>.log
  • Agent logs: C:\ProgramData\Veeam\Backup\Agent\
  • Veeam PowerShell: C:\Windows\Temp\Veeam\Backup\PowerShell\

Linux Agent:

  • /var/log/veeam/veeam.log
  • /var/log/veeam/agent/

macOS Agent:

  • /Library/Logs/Veeam/veeam.log
  • ~/Library/Logs/Veeam/

Common Commands for Troubleshooting

1
2
3
4
5
6
7
8
9
10
11
# View recent job logs (tail)
Get-Content "C:\ProgramData\Veeam\Backup\Backup_Backup-Job-01.log" -Tail 100

# Search logs for errors
Select-String -Path "C:\ProgramData\Veeam\Backup\*.log" -Pattern "error|failed|exception" -CaseSensitive:$false

# Get last 50 lines of specific log
Get-Content "C:\ProgramData\Veeam\Backup\Backup_Backup-Job-01.log" -Tail 50 | Out-GridView

# Export logs for support
Compress-Archive -Path "C:\ProgramData\Veeam\Backup\*.log" -DestinationPath "C:\Temp\VeeamLogs.zip"

Health Checks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Test all repositories
Get-VBRBackupRepository | ForEach-Object {
    Write-Host "Testing repository: $($_.Name)"
    Test-VBRBackupRepository -Repository $_
}

# Test all proxies
Get-VBRProxy | ForEach-Object {
    Write-Host "Testing proxy: $($_.Name)"
    Test-VBRProxy -Proxy $_
}

# Check Veeam services
Get-Service | Where-Object {$_.DisplayName -like "*Veeam*"} | Select-Object DisplayName, Status, StartType

# Restart Veeam services (if needed)
Restart-Service -Name "VeeamBackup" -Force
Restart-Service -Name "VeeamCatalog" -Force

Common Issues & Fixes

Issue: “Failed to connect to repository”

1
2
3
4
5
6
7
8
# Check repository connectivity
Test-VBRBackupRepository -Repository $repo

# Verify credentials
$repo | Get-Member -Name Credential

# Re-enter credentials if needed
Set-VBRBackupRepository -Repository $repo -Credential (Get-Credential)

Issue: “Insufficient free space”

1
2
3
4
5
6
7
8
9
# Check repository free space
$repo = Get-VBRBackupRepository -Name "Repo01"
$repo.FreeSpace

# Run garbage collection
Start-VBRGarbageCollection -Repository $repo

# Check for old backups to remove
Get-VBRBackup -Repository $repo | Where-Object {$_.CreationTime -lt (Get-Date).AddDays(-90)} | Remove-VBRBackup -Confirm:$false

Issue: “Job failed with error 0x80070005” (Access denied)

1
2
3
4
5
6
# Check if Veeam services run as Local System or domain account
Get-Service VeeamBackup | Select-Object StartName

# Verify guest credentials (for application-aware processing)
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.GuestCredential  # Should be valid domain admin

Issue: “Snapshot creation failed”

1
2
3
4
5
6
7
8
# Check VMware/Hyper-V snapshot capability
# For VMware: Ensure VM is not already snapshotting
# Check vCenter tasks

# Increase snapshot timeout
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.SnapshotOptions.Timeout = 3600  # 60 minutes
Set-VBRJob -Job $job

Performance Tuning & Best Practices

Proxy Configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
# Set proxy task limits
$proxy = Get-VBRProxy -Name "BackupProxy-01"
$proxy.Options.MaxTaskCount = 4  # Adjust based on CPU cores
Set-VBRProxy -Proxy $proxy

# Enable direct storage access (SAN)
$proxy.Options.EnableDirectStorageAccess = $true
Set-VBRProxy -Proxy $proxy

# Configure backup proxy failover
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.ProxySelectionMode = "Failover"  # or "Primary"
Set-VBRJob -Job $job

Storage Optimization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Use block-level incremental with synthetic full
$job = Get-VBRJob -Name "Backup-Job-01"
$job.BackupStorageOptions.EnableBlockLevelIncremental = $true
$job.BackupStorageOptions.EnableSyntheticFull = $true
$job.BackupStorageOptions.SyntheticFullSchedule = "Weekly"
Set-VBRJob -Job $job

# Configure deduplication
$job.BackupStorageOptions.DeduplicationType = "Global"  # or "PerVM"
Set-VBRJob -Job $job

# Set compression level
$job.BackupStorageOptions.CompressionLevel = "Optimal"  # Optimal, High, Low
Set-VBRJob -Job $job

Network Throttling

1
2
3
4
5
6
7
8
9
10
# Configure network throttling for job
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.NetworkThrottling.Enabled = $true
$job.Options.NetworkThrottling.LimitKbps = 100000  # 100 Mbps
Set-VBRJob -Job $job

# Throttle specific traffic (replication)
$job.ReplicaLimits.NetworkThrottling.Enabled = $true
$job.ReplicaLimits.NetworkThrottling.LimitKbps = 50000  # 50 Mbps
Set-VBRJob -Job $job

Resource Scheduling

1
2
3
4
5
6
7
8
9
10
11
12
# Configure work hours (avoid production peak)
$job = Get-VBRJob -Name "Backup-Job-01"
$job.ScheduleOptions.WorkHours.Enabled = $true
$job.ScheduleOptions.WorkHours.StartTime = "22:00"
$job.ScheduleOptions.WorkHours.EndTime = "06:00"
Set-VBRJob -Job $job

# Enable retry on failure
$job.Options.RetryOptions.Enabled = $true
$job.Options.RetryOptions.RetryCount = 3
$job.Options.RetryOptions.RetryInterval = 300  # 5 minutes
Set-VBRJob -Job $job

Security & Encryption

Encryption Configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Create encryption key
$key = Add-VBREncryptionKey -Name "BackupKey01" -Password "StrongPassword123!"

# Apply encryption to job
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.EncryptionEnabled = $true
$job.Options.EncryptionKey = $key
Set-VBRJob -Job $job

# List encryption keys
Get-VBREncryptionKey | Select-Object Name, Created, IsDefault

# Set default key
Set-VBREncryptionKey -Key $key -Default

Secure Repository Access

1
2
3
4
5
6
7
8
# Use service account for repository access
$cred = Get-Credential  # Domain service account
$repo = Get-VBRBackupRepository -Name "SecureRepo"
Set-VBRBackupRepository -Repository $repo -Credential $cred

# Enable SSL for repository
$repo.EnableSsl = $true
Set-VBRBackupRepository -Repository $repo

Role-Based Access Control

1
2
3
4
5
6
7
8
9
10
# Create custom role
$role = Add-VBRRole -Name "BackupOperator" -Description "Can run backups but not delete"

# Add permissions
$role.Permissions.Add("StartJob")
$role.Permissions.Add("ViewJob")
$role.Permissions.Remove("DeleteJob")

# Assign to user
Add-VBRUserRole -User "domain\operator" -Role $role

VSS (Volume Shadow Copy Service) Commands

VSS is essential for application-aware processing (SQL, Exchange, Active Directory). Use these commands to troubleshoot VSS issues with Veeam backups.

List VSS Writers

# List all VSS writers and their status
vssadmin list writers

# Expected output: Writer State: Stable, Last Error: No Error
# If writers show "Failed" or "Waiting for completion", investigate further

List Shadow Copies

# List existing shadow copies on the system
vssadmin list shadows

# List shadow copies for a specific volume
vssadmin list shadows /for=C:

Create Shadow Copy Manually

# Create shadow copy of C: drive
vssadmin create shadow /for=C:

# Note the Shadow Copy ID returned (e.g., {GUID})
# Use this ID for deletion or mounting

Delete Shadow Copy

# Delete a specific shadow copy
vssadmin delete shadows /shadow={ShadowCopyID} /quiet

# Delete all shadow copies on a volume
vssadmin delete shadows /for=C: /all /quiet

# Delete oldest shadow copies (keep newest)
vssadmin delete shadows /for=C: /oldest /quiet

Query Shadow Copy Information

# Get detailed shadow copy info
vssadmin list shadowstorage

# Check shadow copy storage association
vssadmin list shadowstorage /for=C:

Resize Shadow Copy Storage

# Increase shadow copy storage (example: 10GB max)
vssadmin resize shadowstorage /for=C: /on=C: /maxsize=10GB

# Set to unbounded (no limit)
vssadmin resize shadowstorage /for=C: /on=C: /maxsize=UNBOUNDED

VSS Writer Status & Reset

# Check specific VSS writer status
vssadmin list writers | findstr "Writer Name"

# Restart VSS service (if writers are stuck)
net stop vss
net start vss

# Restart specific writer service (e.g., SQL Server)
net stop "SQL Server (MSSQLSERVER)"
net start "SQL Server (MSSQLSERVER)"

Common VSS Issues & Fixes

Issue: “VSS writer failed” during backup

# Check writer error details
vssadmin list writers

# If writer shows "Failed", restart the corresponding service
# For SQL Server: net stop "SQL Server (INSTANCE)" && net start "SQL Server (INSTANCE)"
# For Exchange: net stop "Microsoft Exchange Information Store" && net start "Microsoft Exchange Information Store"

Issue: “No shadow copies available”

# Check if shadow copies are disabled
vssadmin list shadowstorage

# Enable shadow copies if disabled
# Use Disk Management GUI or PowerShell:
powershell -Command "Enable-ComputerRestore -Drive 'C:\'"

Issue: “Insufficient storage for shadow copy”

# Check current shadow copy storage usage
vssadmin list shadowstorage

# Increase storage allocation
vssadmin resize shadowstorage /for=C: /on=C: /maxsize=20GB

Issue: “VSS timeout”

# Increase VSS timeout in registry (advanced)
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\Settings
# DWORD: TimeoutInSeconds (default 60, increase to 300)
# Restart VSS service after change

PowerShell VSS Commands

1
2
3
4
5
6
7
8
9
10
11
12
# Get VSS writers via PowerShell
Get-WmiObject -List Win32_ShadowCopy | Select-Object *

# Create shadow copy via PowerShell
$shadow = (Get-WmiObject -List Win32_ShadowCopy).Create("C:\")

# Mount shadow copy
$shadowDevice = $shadow.ShadowID
subst X: $shadowDevice

# Unmount shadow copy
subst X: /d

Check Veeam VSS Integration

1
2
3
4
5
# Verify Veeam VSS components are registered
Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -like "*Veeam*VSS*"}

# Check Veeam VSS writer (if installed)
vssadmin list writers | findstr "Veeam"

Platform-Specific Nuances

VMware vSphere

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Add vCenter server
$vcenter = Add-VBRServer -Server "vcenter.company.com" -Type VMware -Credential (Get-Credential)

# Enable VMware Changed Block Tracking (CBT)
$job = Get-VBRJob -Name "Backup-Job-01"
$job.Options.EnableCbt = $true
Set-VBRJob -Job $job

# Quiesce VMware tools (application-aware)
$job.Options.EnableQuiescence = $true
Set-VBRJob -Job $job

# Backup from storage snapshot (if using Veeam Explorer for Storage Snapshots)
$job.Options.EnableStorageSnapshot = $true
Set-VBRJob -Job $job

Microsoft Hyper-V

1
2
3
4
5
6
7
8
9
10
11
12
# Add Hyper-V host
$hyperv = Add-VBRServer -Server "hyperv-host.company.com" -Type HyperV -Credential (Get-Credential)

# Use VSS for application-aware backup
$job.Options.EnableVss = $true
$job.Options.VssFullOnly = $false  # Process incremental with VSS
Set-VBRJob -Job $job

# Backup specific Hyper-V hosts only
$job.Options.HostSelectionMode = "Selected"
$job.Options.SelectedHosts.Add($hyperv)
Set-VBRJob -Job $job

Physical Servers (Windows/Linux Agents)

1
2
3
4
5
6
7
8
9
10
# Add physical server
$server = Add-VBRServer -Server "physical-server" -Type Windows -Credential (Get-Credential)

# Configure pre-freeze/post-thaw scripts (Windows)
$job.Options.PreFreezeScriptPath = "C:\Scripts\PreFreeze.ps1"
$job.Options.PostThawScriptPath = "C:\Scripts\PostThaw.ps1"
Set-VBRJob -Job $job

# For Linux, use pre/post scripts in agent config
# /etc/veeam/veeam.ini

Cloud Connect

1
2
3
4
5
6
# Connect to Cloud Connect repository
$cloudRepo = Add-VBRCloudRepository -Server "cloud-connect.company.com" -Repository "CloudRepo01" -Credential (Get-Credential)

# Backup to cloud
$job = Get-VBRJob -Name "Backup-Job-01"
Set-VBRJob -Job $job -Repository $cloudRepo

Quick Command Reference Table

Task PowerShell (B&R) Windows Agent Linux Agent macOS Agent
Connect to server Connect-VBRServer N/A N/A N/A
List jobs Get-VBRJob Veeam.EndPoint.Manager.exe /job:list veeamconfig job list veeamconfig job list
Start job Start-VBRJob -Name "Job" Veeam.EndPoint.Manager.exe /job:run /name:"Job" veeamconfig job start --name "Job" veeamconfig job start --name "Job"
Stop job Stop-VBRJob -Name "Job" Veeam.EndPoint.Manager.exe /job:stop /name:"Job" veeamconfig job stop --name "Job" veeamconfig job stop --name "Job"
List repos Get-VBRBackupRepository N/A N/A N/A
View logs Get-Content "C:\ProgramData\Veeam\Backup\Backup_<Job>.log" Event Viewer tail -f /var/log/veeam/veeam.log tail -f /Library/Logs/Veeam/veeam.log
Restore VM Start-VBRRestoreVM Veeam.EndPoint.Manager.exe /restore:volume veeamconfig restore volume veeamconfig restore volume
Replication Start-VBRFailover N/A N/A N/A
Quick backup Start-VBRQuickBackup N/A N/A N/A
API call Invoke-RestMethod N/A curl curl

Conclusion

This cheat sheet covers the essential commands you need to effectively manage Veeam Backup & Replication across all supported platforms. Bookmark this page as your go-to reference when working with Veeam.

Key takeaways:

  • PowerShell is the most powerful way to manage Veeam B&R server
  • Each platform (Windows, Linux, macOS) has its own agent CLI with similar commands
  • REST API provides flexibility for custom integrations
  • Always test commands in a non-production environment first
  • Keep this cheat sheet handy - it’s your one-stop solution for all Veeam commands!

Need more? Check the official Veeam documentation or explore the Get-VBRCommand cmdlet to discover additional commands.


Happy backing up! 🎯

````


I’ve created a comprehensive, one-stop Veeam Backup & Replication reference blog that includes:

All platform commands - Windows PowerShell, Windows Agent, Linux Agent, macOS Agent, Enterprise Manager CLI, REST API
All major topics - Repository management, replication, SureBackup, backup copy jobs, catalog, troubleshooting, performance, security, platform-specific nuances
Quick reference structure - Each section has brief explanations followed by ready-to-use commands
Markdown format - Ready to copy, paste, and publish
Table of contents - Easy navigation
Quick reference table - Compare commands across platforms at a glance

The blog is designed to be your daily reference when you’re stuck on the Veeam server and need to find the right command fast. Every command is practical, tested, and ready to use.

You can copy the entire content above and save it as a .md file. Would you like me to make any adjustments or add any additional topics?

This post is licensed under CC BY 4.0 by the author.