Restart Docker for the changes to take effect. Docker invokes the commands to
configure the block device for you.
> [!WARNING]
> Changing these values after Docker has prepared the block device for you is
> not supported and causes an error.
You still need to [perform periodic maintenance tasks](#manage-devicemapper).
#### Configure direct-lvm mode manually
The procedure below creates a logical volume configured as a thin pool to
use as backing for the storage pool. It assumes that you have a spare block
device at `/dev/xvdf` with enough free space to complete the task. The device
identifier and volume sizes may be different in your environment and you
should substitute your own values throughout the procedure. The procedure also
assumes that the Docker daemon is in the `stopped` state.
1. Identify the block device you want to use. The device is located under
`/dev/` (such as `/dev/xvdf`) and needs enough free space to store the
images and container layers for the workloads that host runs.
A solid state drive is ideal.
2. Stop Docker.
```console
$ sudo systemctl stop docker
```
3. Install the following packages:
- **RHEL / CentOS**: `device-mapper-persistent-data`, `lvm2`, and all
dependencies
- **Ubuntu / Debian / SLES 15**: `thin-provisioning-tools`, `lvm2`, and all
dependencies
4. Create a physical volume on your block device from step 1, using the
`pvcreate` command. Substitute your device name for `/dev/xvdf`.
> [!WARNING]
> The next few steps are destructive, so be sure that you have specified
> the correct device.
```console
$ sudo pvcreate /dev/xvdf
Physical volume "/dev/xvdf" successfully created.
```
5. Create a `docker` volume group on the same device, using the `vgcreate`
command.
```console
$ sudo vgcreate docker /dev/xvdf
Volume group "docker" successfully created
```
6. Create two logical volumes named `thinpool` and `thinpoolmeta` using the
`lvcreate` command. The last parameter specifies the amount of free space
to allow for automatic expanding of the data or metadata if space runs low,
as a temporary stop-gap. These are the recommended values.
```console
$ sudo lvcreate --wipesignatures y -n thinpool docker -l 95%VG
Logical volume "thinpool" created.
$ sudo lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
Logical volume "thinpoolmeta" created.
```
7. Convert the volumes to a thin pool and a storage location for metadata for
the thin pool, using the `lvconvert` command.
```console
$ sudo lvconvert -y \
--zero n \
-c 512K \
--thinpool docker/thinpool \
--poolmetadata docker/thinpoolmeta
WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to
thin pool's data and metadata volumes with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Converted docker/thinpool to thin pool.
```
8. Configure autoextension of thin pools via an `lvm` profile.
```console
$ sudo vi /etc/lvm/profile/docker-thinpool.profile
```
9. Specify `thin_pool_autoextend_threshold` and `thin_pool_autoextend_percent`
values.
`thin_pool_autoextend_threshold` is the percentage of space used before `lvm`
attempts to autoextend the available space (100 = disabled, not recommended).
`thin_pool_autoextend_percent` is the amount of space to add to the device
when automatically extending (0 = disabled).
The example below adds 20% more capacity when the disk usage reaches
80%.
```none
activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}
```
Save the file.
10. Apply the LVM profile, using the `lvchange` command.
```console
$ sudo lvchange --metadataprofile docker-thinpool docker/thinpool
Logical volume docker/thinpool changed.
```
11. Ensure monitoring of the logical volume is enabled.