diskimage-builder/diskimage_builder/elements/growvols
Steve Baker 00ca126287 Grow thin pool metadata by 1GiB
An LVM thin pool has an associated metadata volume, and it can be
assumed that the size of this volume on the image is minimized for
distribution.

This change grows the metadata volume by 1GiB, which is recommended[1] as
a reasonable default. This fixes a specific issue with the metadata
volume being exausted when growing into a 2TB drive.

Other minor changes include:
- Human readable printed values have switched to GiB, MiB, KiB, B
- Growth percentage volumes are adjusted down to not over-provision
  the thin volume

[1] https://access.redhat.com/solutions/6318131

Change-Id: I1dd6dd932bb5f5d9adac9b78a026569165bd4ea9
Resolves: rhbz#2149586
2022-12-19 13:40:04 +13:00
..
environment.d Add a growvols utility for growing LVM volumes 2021-07-01 11:16:31 +12:00
init-scripts/systemd Make growvols config path platform independent 2022-02-04 00:23:13 +03:00
post-install.d Make growvols config path platform independent 2022-02-04 00:23:13 +03:00
static/usr/local/sbin Grow thin pool metadata by 1GiB 2022-12-19 13:40:04 +13:00
tests Grow thin pool metadata by 1GiB 2022-12-19 13:40:04 +13:00
__init__.py Add a growvols utility for growing LVM volumes 2021-07-01 11:16:31 +12:00
element-deps Add a growvols utility for growing LVM volumes 2021-07-01 11:16:31 +12:00
package-installs.yaml Add a growvols utility for growing LVM volumes 2021-07-01 11:16:31 +12:00
README.rst Add a growvols utility for growing LVM volumes 2021-07-01 11:16:31 +12:00

========
growvols
========

Grow one or more LVM volumes on first boot.

This installs utility `growvols` which grows the logical volumes in an LVM group
to take available device space.

The positional arguments specify how available space is allocated. They
have the format <volume>=<amount><unit> where:

<volume> is the label or the mountpoint of the logical volume
<amount> is an integer growth amount in the specified unit
<unit> is one of the supported units

Supported units are:

% percentage of available device space before any changes are made
MiB mebibyte (1048576 bytes)
GiB gibibyte (1073741824 bytes)
MB megabyte (1000000 bytes)
GB gigabyte (1000000000 bytes)

Each argument is processed in order and the requested amount is allocated
to each volume until the disk is full. This means that if space is
overallocated, the last volumes may only grow by the remaining space, or
not grow at all, and a warning will be printed. When space is underallocated
the remaining space will be given to the root volume (mounted at /).

The currently supported partition layout is:
- Exactly one of the partitions containing an LVM group
- The disk having unpartitioned space to grow with
- The LVM logical volumes being formatted with XFS filesystems

Example usage:

growvols /var=80% /home=20GB

growvols --device sda --group vg img-rootfs=20% fs_home=20GiB fs_var=60%

Environment variables can be set during image build to enable a systemd unit
which will run growvols on boot:

# DIB_GROWVOLS_TRIGGER defaults to 'manual'. When set to 'systemd' a systemd
# unit will run using the following arguments
export DIB_GROWVOLS_TRIGGER=systemd

# DIB_GROWVOLS_ARGS contains the positional arguments for which volumes to grow
# by what amount. If omitted the volume mounted at / will grow by all available
# space
export DIB_GROWVOLS_ARGS="img-rootfs=20% fs_home=20GiB fs_var=60%"

# DIB_GROWVOLS_GROUP contains the name of the LVM group to extend. Defaults the
# discovered group if only one exists.
export DIB_GROWVOLS_GROUP=vg

# DIB_GROWVOLS_DEVICE is the name of the disk block device to grow the
# volumes in (such as "sda"). Defaults to the disk containing the root mount.
export DIB_GROWVOLS_DEVICE=sda