Chapter 3. Creating a deduplicated and compressed logical volume
You can create an LVM logical volume that uses the VDO feature to deduplicate and compress data.
3.1. The physical and logical size of an LVM-VDO volume
VDO uses different definitions of size:
- Physical size
This is the same size as the physical extents allocated to the VDO pool LV. VDO uses this storage for:
- User data, which might be deduplicated and compressed
- VDO metadata, such as the UDS index
- Available physical size
This is the portion of the physical size that VDO is able to use for user data.
It is equivalent to the physical size minus the size of the metadata, rounded down to a multiple of the slab size.
- Logical Size
This is the provisioned size that the VDO LV presents to applications. It is usually larger than the available physical size. VDO currently supports any logical size up to 254 times the size of the physical volume with an absolute maximum logical size of 4 PB.
When you set up a VDO logical volume (LV), you specify the amount of logical storage that the VDO LV presents. When hosting active virtual machines (VMs) or containers, use provisioning storage at a 10:1 logical to physical ratio. For example, if you are utilizing 1 TB of physical storage, you would present it as 10 TB of logical storage.
If you do not specify the
--virtualsize
option, VDO provisions the volume to a1:1
ratio. For example, if you put a VDO LV on top of a 20 GB VDO pool LV, VDO reserves 2.5 GB for the UDS index, if the default index size is used. The remaining 17.5 GB is provided for the VDO metadata and user data. As a result, the available storage to consume is not more than 17.5 GB, and can be less due to metadata that makes up the actual VDO volume.
3.2. Slab size in VDO
The physical storage of the VDO volume is divided into several slabs. Each slab is a contiguous region of the physical space. All of the slabs for a given volume have the same size, which can be any power of 2 multiple of 128 MB up to 32 GB.
The default slab size is 2 GB to facilitate evaluating VDO on smaller test systems. A single VDO volume can have up to 8192 slabs. Therefore, in the default configuration with 2 GB slabs, the maximum allowed physical storage is 16 TB. When using 32 GB slabs, the maximum allowed physical storage is 256 TB.
Slab size has no effect on the performance of the VDO volume.
Physical volume size | Recommended slab size |
---|---|
10-99 GB | 1 GB |
100 GB - 1 TB | 2 GB |
2-256 TB | 32 GB |
The minimal disk usage for a VDO volume with default settings of 2 GB slab size and 0.25 dense index requires approx 4.7 GB. This provides slightly less than 2 GB of physical data to write at 0% deduplication or compression.
Here, the minimal disk usage is the sum of the default slab size and dense index.
You can control the slab size by providing the --vdosettings 'vdo_slab_size_mb=size-in-megabytes'
option to the lvcreate
command.
3.3. Installing VDO
You can install the VDO software necessary to create, mount, and manage VDO volumes.
Procedure
Install the VDO software:
dnf install lvm2 vdo
# dnf install lvm2 vdo
Copy to Clipboard Copied!
3.4. Creating and mounting an LVM-VDO volume
You can create a VDO logical volume (LV) on a VDO pool LV by using the lvcreate
command.
Choose a name for your LVM-VDO, such as vdo1
. You must use a different name and device for each LVM-VDO on the system.
Prerequisites
- Install the VDO software. For more information, see Installing VDO.
- An LVM volume group with free storage capacity exists on your system.
Procedure
Create the LVM-VDO:
lvcreate --type vdo \ --name vdo1 \ --size 1T \ --virtualsize 10T \ vg-name
# lvcreate --type vdo \ --name vdo1 \ --size 1T \ --virtualsize 10T \ vg-name
Copy to Clipboard Copied! Replace
1T
with the physical size. If the physical size is larger than 16 TiB, add the following option to increase the slab size on the volume to 32 GiB:--vdosettings 'vdo_slab_size_mb=32768'
--vdosettings 'vdo_slab_size_mb=32768'
Copy to Clipboard Copied! If you use the default slab size of 2 GiB on a physical size larger than 16 TiB, the
lvcreate
command fails with the following error:ERROR - vdoformat: formatVDO failed on '/dev/device': VDO Status: Exceeds maximum number of slabs supported
ERROR - vdoformat: formatVDO failed on '/dev/device': VDO Status: Exceeds maximum number of slabs supported
Copy to Clipboard Copied! Replace
10T
with the logical storage that the LVM-VDO will present.Replace
vg-name
with the name of an existing LVM volume group where you want to place the LVM-VDO.ImportantIf creating the LVM-VDO volume fails, use
lvremove vg-name
to remove the volume. Depending on the reason of the failure, you might also need to add two force options (-ff
).Create a file system on the LVM-VDO:
For the XFS file system:
mkfs.xfs -K /dev/vg-name/vdo-name
# mkfs.xfs -K /dev/vg-name/vdo-name
Copy to Clipboard Copied! For the ext4 file system:
mkfs.ext4 -E nodiscard /dev/vg-name/vdo-name
# mkfs.ext4 -E nodiscard /dev/vg-name/vdo-name
Copy to Clipboard Copied!
Mount the file system on the LVM-VDO volume:
To mount the file system persistently, add the following line to the
/etc/fstab
file:/dev/vg-name/vdo-name mount-point <file-system-type> defaults 0 0
/dev/vg-name/vdo-name mount-point <file-system-type> defaults 0 0
Copy to Clipboard Copied! Replace <file-system-type> with your file system, such as
xfs
orext4
.To mount the file system manually, use the
mount
command:mount /dev/vg-name/vdo-name mount-point
# mount /dev/vg-name/vdo-name mount-point
Copy to Clipboard Copied! If the LVM-VDO volume is located on a block device that requires network, such as iSCSI, add the
_netdev
mount option. For iSCSI and other block devices requiring network, see thesystemd.mount(5)
man page for information about the_netdev
mount option.
Verification
Verify that an LVM-VDO volume is created:
lvs
# lvs
Copy to Clipboard Copied!
3.5. Configuring an LVM-VDO volume by using the storage
RHEL system role
You can use the storage
RHEL system role to create a VDO volume on LVM (LVM-VDO) with enabled compression and deduplication.
Because of the storage
system role use of LVM-VDO, only one volume can be created per pool.
Prerequisites
- You have prepared the control node and the managed nodes
- You are logged in to the control node as a user who can run playbooks on the managed nodes.
-
The account you use to connect to the managed nodes has
sudo
permissions on them.
Procedure
Create a playbook file, for example
~/playbook.yml
, with the following content:--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create LVM-VDO volume under volume group 'myvg' ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - /dev/sdb volumes: - name: mylv1 compression: true deduplication: true vdo_pool_size: 10 GiB size: 30 GiB mount_point: /mnt/app/shared
--- - name: Manage local storage hosts: managed-node-01.example.com tasks: - name: Create LVM-VDO volume under volume group 'myvg' ansible.builtin.include_role: name: redhat.rhel_system_roles.storage vars: storage_pools: - name: myvg disks: - /dev/sdb volumes: - name: mylv1 compression: true deduplication: true vdo_pool_size: 10 GiB size: 30 GiB mount_point: /mnt/app/shared
Copy to Clipboard Copied! The settings specified in the example playbook include the following:
vdo_pool_size: <size>
- The actual size that the volume takes on the device. You can specify the size in human-readable format, such as 10 GiB. If you do not specify a unit, it defaults to bytes.
size: <size>
- The virtual size of VDO volume.
For details about all variables used in the playbook, see the
/usr/share/ansible/roles/rhel-system-roles.storage/README.md
file on the control node.Validate the playbook syntax:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! Note that this command only validates the syntax and does not protect against a wrong but valid configuration.
Run the playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
Verification
View the current status of compression and deduplication:
ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state'
$ ansible managed-node-01.example.com -m command -a 'lvs -o+vdo_compression,vdo_compression_state,vdo_deduplication,vdo_index_state' LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDOCompression VDOCompressionState VDODeduplication VDOIndexState mylv1 myvg vwi-a-v--- 3.00t vpool0 enabled online enabled online
Copy to Clipboard Copied!
3.6. Creating LVM-VDO volumes in the web console
Create an LVM-VDO volume in the RHEL web console.
Prerequisites
-
You have installed the
cockpit-storaged
package on your system. - You have created an LVM2 group from which you want to create an LVM-VDO volume.
Procedure
- Log in to the RHEL 10 web console.
- In the panel, click Storage.
- Click the menu button [⋮] for the LVM2 group in which you want to create an LVM-VDO volume and click Create new logical volume.
- In the Name field, enter a name for your LVM-VDO volume without spaces.
- From the Purpose drop-down list, select VDO filesystem volume.
- In the Size slider, set up the physical size of your LVM-VDO volume.
In the Logical size slider, set up the size of the LVM-VDO volume. You can extend it more than ten times, but consider for what purpose you are creating the LVM-VDO volume:
- For active VMs or container storage, use a logical size that is ten times the physical size of the volume.
- For object storage, use a logical size that is three times the physical size of the volume.
- In the Options list, select Compression and Deduplication.
- Click .
Verification
- Check that you can see the new LVM-VDO volume in the Storage section.
3.7. Formatting LVM-VDO volumes in the web console
LVM-VDO volumes act as physical drives. To use them, you must format them with a file system.
Formatting erases all data on the volume. Creating a file system might take a long time.
Prerequisites
-
You have installed the
cockpit-storaged
package on your system. - You have created an LVM-VDO volume.
Procedure
- Log in to the RHEL 10 web console.
- In the panel, click Storage.
- Click the LVM2 volume group that has the LVM-VDO volume you want to format and click the menu button [⋮] for the LVM-VDO volume.
- In the drop-down menu, click Format.
- In the Name field, enter the logical volume name.
- In the Mount Point field, enter the mount path.
- From the Type drop-down list, select a file system.
- Optional: Select Overwrite existing data with zeros, if the disk includes any sensitive data and you want to rewrite them. Otherwise the web console rewrites only the disk header.
- From the Encryption drop-down list, select the type of encryption.
- From the At boot drop-down list, select when you want to mount the volume.
In the Mount options list, choose the appropriate settings:
- Select the Mount read only checkbox if you want to mount the volume as a read-only logical volume.
- Select the Custom mount options checkbox and add the mount options if you want to change the default mount option.
Format the LVM-VDO volume:
- If you want to format and mount the LVM-VDO volume, click .
- If you want to only format the partition, click .
Verification
- Verify the details of the formatted LVM-VDO volume on the Storage tab and in the LVM2 volume group tab.
3.8. Extending LVM-VDO volumes in the web console
Extend LVM-VDO volumes in the RHEL 10 web console.
Prerequisites
-
You have installed the
cockpit-storaged
package on your system. - You have created an LVM-VDO volume.
Procedure
- Log in to the RHEL 10 web console.
- In the panel, click Storage.
- Click your LVM-VDO volume in the VDO Devices box.
- In the LVM-VDO volume details, click .
- In the Grow logical size of VDO dialog box, extend the logical size of the LVM-VDO volume.
- Click Grow.
Verification
- Check the LVM-VDO volume details for the new size to verify that your changes have been successful.
3.9. Changing the compression settings on an LVM-VDO volume
By default, the compression of a VDO pool logical volume (LV) is enabled. To save CPU usage, you can disable it. Enable or disable compression by using the lvchange
command.
Prerequisites
- An LVM-VDO volume exists on your system.
Procedure
Check the compression status for your logical volumes:
lvs -o+vdo_compression,vdo_compression_state
# lvs -o+vdo_compression,vdo_compression_state LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDOCompression VDOCompressionState vdo_name vg_name vwi-a-v--- 1.00t vpool0 0.00 enabled online vpool0 vg_name dwi------- <15.00g 20.03 enabled online
Copy to Clipboard Copied! Disable the compression for VDOPoolLV:
lvchange --compression n vg-name/vdopoolname
# lvchange --compression n vg-name/vdopoolname
Copy to Clipboard Copied! If you want to enable the compression, use the
y
option instead ofn
.
Verification
View the current status of compression:
lvs -o+vdo_compression,vdo_compression_state
# lvs -o+vdo_compression,vdo_compression_state LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDOCompression VDOCompressionState vdo_name vg_name vwi-a-v--- 1.00t vpool0 0.00 offline vpool0 vg_name dwi------- <15.00g 20.03 offline
Copy to Clipboard Copied!
3.10. Changing the deduplication settings on an LVM-VDO volume
By default, the deduplication of a VDO pool logical volume (LV) is enabled. To save memory, you can disable deduplication. Enable or disable deduplication by using the lvchange
command.
Because of the way that VDO handles ongoing parallel I/O operations, a VDO volume continues to identify duplicate data within those operations. For example, if a VM clone operation is in progress and a VDO volume has many duplicate blocks in close proximity, then the volume can still achieve some amount of space savings by using deduplication. The index state of the volume does not affect the process.
Prerequisites
- An LVM-VDO volume exists on your system.
Procedure
Check the deduplication status for your logical volumes:
lvs -o+vdo_deduplication,vdo_index_state
# lvs -o+vdo_deduplication,vdo_index_state LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDODeduplication VDOIndexState vdo_name vg_name vwi-a-v--- 1.00t vpool0 0.00 enabled online vpool0 vg_name dwi------- <15.00g 20.03 enabled online
Copy to Clipboard Copied! Disable the deduplication for VDOPoolLV:
lvchange --deduplication n vg-name/vdopoolname
# lvchange --deduplication n vg-name/vdopoolname
Copy to Clipboard Copied! If you want to enable the deduplication, use the
y
option instead ofn
.
Verification
View the current status of deduplication:
lvs -o+vdo_deduplication,vdo_index_state
# lvs -o+vdo_deduplication,vdo_index_state LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert VDODeduplication VDOIndexState vdo_name vg_name vwi-a-v--- 1.00t vpool0 0.00 closed vpool0 vg_name dwi------- <15.00g 20.03 closed
Copy to Clipboard Copied!
3.11. Managing thin-provisioned LVM-VDO volumes
It is possible to configure a thin-provisioned LVM-VDO volume to prepare for future expansion of the physical space, to address a condition where the physical space usage of the LVM-VDO volume is approaching 100%. Instead of using -l 100%FREE
in the lvcreate
operation, for example, use '95%FREE' to ensure that there is some reserved space for recovery later on if needed. You can use the same method to resolve the following issues:
- The volume runs out of space.
- The file system enters read-only mode.
- ENOSPC reported by the volume.
The best way to address high physical space usage on an LVM-VDO volume is to delete unused files, and discard the blocks used by these unused files either by using online discard or the fstrim
program. The physical space of an LVM-VDO volume can only be grown to 8192 slabs that is 16 TB for an LVM-VDO volume with the default slab size of 2 GB, or 256 TB for an LVM-VDO volume with the maximal slab size of 32 GB.
In all of the following steps, replace myvg and myvdo with the volume group and LVM-VDO name respectively.
Prerequisites
- Install the VDO software. For more information, see Installing VDO.
- An LVM volume group with free storage capacity exists on your system.
-
A thin-provisioned LVM-VDO volume using the
lvcreate --type vdo --name myvdo myvg -l percentage-of-free-space-in-vg --virtualsize virtual-size-of-vdo
command. For more information, see Creating and mounting an LVM-VDO volume.
Procedure
Determine the optimal logical size for a thin-provisioned LVM-VDO volume:
vdostats myvg-vpool0-vpool
# vdostats myvg-vpool0-vpool Device 1K-blocks Used Available Use% Space saving% myvg-vpool0-vpool 104856576 29664088 75192488 28% 69%
Copy to Clipboard Copied! To calculate the space savings ratio, use the following formula:
Savings ratio = 1 / (1 - Space saving%)
Savings ratio = 1 / (1 - Space saving%)
Copy to Clipboard Copied! In this example,
-
there is approximately a
3.22:1
space savings ratio on a data set of about 80 GB. - Multiplying the data set size by the ratio would yield a potential logical size of 256 GB if more data with the same space savings were written to the LVM-VDO volume.
- Adjusting this number downward to 200 GB yields a logical size with a safe margin of free physical space, given the same space savings ratio.
-
there is approximately a
Monitor the free physical space in an LVM-VDO volume:
vdostats myvg-vpool0-vpool
# vdostats myvg-vpool0-vpool
Copy to Clipboard Copied! This command can be executed periodically to provide monitoring of the used and free physical space of the LVM-VDO volume.
Optional: View the warnings on physical space usage on an LVM-VDO volume by using the available
/usr/share/doc/vdo/examples/monitor/monitor_check_vdostats_physicalSpace.pl
script:/usr/share/doc/vdo/examples/monitor/monitor_check_vdostats_physicalSpace.pl myvg-vpool0-vpool
# /usr/share/doc/vdo/examples/monitor/monitor_check_vdostats_physicalSpace.pl myvg-vpool0-vpool
Copy to Clipboard Copied! When creating an LVM-VDO volume, the
dmeventd
monitoring service monitors the usage of physical space in an LVM-VDO volume. This is enabled by default when an LVM-VDO volume is created or started.Use the
journalctl
command to view the output ofdmeventd
in the logs while monitoring an LVM-VDO volume:lvm[8331]: Monitoring VDO pool myvg-vpool0-vpool. ... lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 84.63% full. lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 91.01% full. lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 97.34% full.
lvm[8331]: Monitoring VDO pool myvg-vpool0-vpool. ... lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 84.63% full. lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 91.01% full. lvm[8331]: WARNING: VDO pool myvg-vpool0-vpool is now 97.34% full.
Copy to Clipboard Copied! Remediate LVM-VDO volumes that are almost out of available physical space. When it is possible to add a physical space to an LVM-VDO volume, but the volume space is full before it can be grown, it may be necessary to temporarily stop I/O to the volume.
To temporarily stop I/O to the volume, execute the following steps, where LVM-VDO volume myvdo contains a file system mounted on the /users/homeDir path:
Freeze the file system:
xfs_freeze -f /users/homeDir vgextend myvg /dev/vdc2 lvextend -L new-size myvg/vpool0 xfs_freeze -u /users/homeDir
# xfs_freeze -f /users/homeDir # vgextend myvg /dev/vdc2 # lvextend -L new-size myvg/vpool0 # xfs_freeze -u /users/homeDir
Copy to Clipboard Copied! Unmount the file system:
umount /users/homeDir vgextend myvg /dev/vdc2 lvextend -L new-size myvg/vpool0 mount -o discard /dev/myvg/myvdo /users/homeDir
# umount /users/homeDir # vgextend myvg /dev/vdc2 # lvextend -L new-size myvg/vpool0 # mount -o discard /dev/myvg/myvdo /users/homeDir
Copy to Clipboard Copied! NoteUnmounting or freezing a file system with cached data will incur a write of the cached data, which might fill the physical space of the LVM-VDO volume. Consider the maximum amount of cached file system data when setting a monitoring threshold for free physical space on an LVM-VDO volume.
Blocks that are no longer used by a file system can be cleaned up by using the
fstrim
utility. Executingfstrim
against a mounted file system on top of a VDO volume can result in increased free physical space for that volume. Thefstrim
utility will send discards to the LVM-VDO volume, which are then used to remove references to the previously used blocks. If any of those blocks are single-referenced, the physical space will be available to use.Check VDO stats to see what the current amount of free space is:
vdostats --human-readable myvg-vpool0-vpool
# vdostats --human-readable myvg-vpool0-vpool Device Size Used Available Use% Space saving% myvg-vpool0-vpool 100.0G 95.0G 5.0G 95% 73%
Copy to Clipboard Copied! Discard unused blocks:
fstrim /users/homeDir
# fstrim /users/homeDir
Copy to Clipboard Copied! View the free physical space of the LVM-VDO volume:
vdostats --human-readable myvg-vpool0-vpool
# vdostats --human-readable myvg-vpool0-vpool Device Size Used Available Use% Space saving% myvg-vpool0-vpool 100.0G 30.0G 70.0G 30% 43%
Copy to Clipboard Copied! In this example, after executing
fstrim
on the file system, the discards were able to return 65 G of physical space to use in the LVM-VDO volume.NoteDiscarding volumes with lower levels of deduplication and compression will have a possibility of reclaiming physical space than discarding volumes with higher levels of deduplication and compression. A volume that has high levels of deduplication and compression can potentially require a more extensive cleanup to reclaim physical space than just simply discarding already unused blocks.