Home / Alt manpages / vgs(8)

  • vgs(8)
  • Admin command
  • linux

Audit LVM Volume Groups with vgs

Your monitoring dashboard flags a volume group running low on space, and vgs is the read-only command that confirms it before you touch anything. This guide gets you a repeatable inventory: the columns that matter, an explicit separator or JSON for scripts, and the version details worth recording alongside the report. The examples use the LVM tools 2.03.16(2) installed with this guide. Allow about 10 minutes for a first audit, plus time to investigate any missing groups.

Before you start

You need the vgs command from the lvm2 package. Reading metadata is normally a privileged administration task, so run the commands as root or through sudo when your host requires it. Nothing in this guide changes LVM metadata, but a restricted user may see warnings or an incomplete report.

Start by recording the installed version. This matters because report fields and defaults can differ between LVM releases.

vgs --version

On this machine the relevant lines are:

LVM version:     2.03.16(2) (2022-05-18)
Library version: 1.02.185 (2022-05-18)

Checkpoint: get the normal inventory

Run vgs with no volume-group argument to list the groups visible to LVM. The usual report includes the group name, physical-volume count, logical-volume count, size, and free space. The command is a report, not a create, extend, or remove operation.

sudo vgs

To request one known group, put its name after the options:

sudo vgs vg_data

A name can also be a tag. If a group appears to be absent, do not immediately edit configuration or scan random devices. Visibility may be restricted by the device filter, a devices file, locking, or the group being foreign to this host. Check the warnings first.

Choose stable columns

The default display is convenient for a person but awkward for scripts. Use --options with a comma-separated list. These fields are a useful capacity audit:

sudo vgs --options vg_name,vg_uuid,vg_size,vg_free,pv_count,lv_count

The field order is the order you request. Ask the installed command for the complete field list rather than assuming a field from a different release:

vgs --options help

Use --noheadings when another program will consume the rows, and --separator to make the boundary explicit.

sudo vgs --noheadings --separator '|' \
  --options vg_name,vg_size,vg_free,pv_count,lv_count

Expected output on a host with a group resembles this shape. Values and spacing depend on the host, so treat it as a format example, not a promised inventory:

vg_data|<size>|<free>|<pv-count>|<lv-count>

For machine parsing, also consider JSON. The report format is controlled globally by LVM configuration, so specify it when a consumer depends on it.

sudo vgs --reportformat json --options vg_name,vg_size,vg_free

Make sizes unambiguous

Human-readable sizes are useful at a terminal, but suffixes and binary units can surprise arithmetic. Select a unit explicitly. Lowercase units use powers of 1024; uppercase units use SI multiples of 1000. Bytes are a straightforward choice for a parser.

sudo vgs --units b --nosuffix \
  --noheadings --separator '|' \
  --options vg_name,vg_size,vg_free

--nosuffix only makes sense with a chosen unit, apart from the human-readable modes. Without it, values can include a unit suffix. The r human-readable mode can add a less-than sign to indicate rounding; use h when you want human-readable output without that rounding indicator.

Filter and sort the report

Use --select for report-side filtering. Its expression language is specific to LVM, so inspect the fields and selection help on the installed version before building a larger expression.

vgs --select help
vgs --options help

A simple example asks for groups with free space below a chosen threshold. The exact comparison and size syntax should be tested against the fields available on your host before putting it in an alert:

sudo vgs --select 'vg_free < 10g' \
  --options vg_name,vg_size,vg_free

Sort explicitly when output is compared over time. Prefix a column with a minus sign for reverse order.

sudo vgs --sort -vg_free --options vg_name,vg_free

Checkpoint: investigate missing groups safely

First compare the default inventory with all groups:

sudo vgs --all

The manpage defines --all as equivalent to omitting a group argument. It does not bypass every visibility rule. --foreign includes volume groups that LVM would otherwise skip because their system identity belongs elsewhere. Use it for inspection, not as a reason to activate or modify a foreign group.

sudo vgs --foreign --options vg_name,vg_systemid,vg_size,vg_free

If your installation uses the LVM devices file, --devicesfile NAME selects a file under /etc/lvm/devices/, and --devices /dev/DEVICE restricts the devices visible to the command. A restricted device list can make a healthy group look incomplete or missing. Confirm the intended devices before diagnosing metadata damage.

For a read-only inspection of on-disk metadata, --readonly avoids taking locks and does not communicate with the device-mapper kernel driver. That makes it useful for examining metadata associated with an image while a virtual machine is running, but it cannot tell you whether logical volumes are currently in use.

sudo vgs --readonly --reportformat json \
  --options vg_name,vg_uuid,vg_size,vg_free

Warnings and unsafe shortcuts

Do not add --nolocking to make a warning disappear. The manual warns that concurrent commands can then produce incorrect results. Likewise, --ignorelockingfailure permits some read-only metadata operations after a locking failure, but it is not a repair and should not hide a cluster or shared-storage problem.

The --shared option reports shared groups that would otherwise be skipped when lvmlockd is not being used. Use it only when you understand the host's shared-volume arrangement. --foreign, --shared, device restrictions, and read-only mode change what the report means; record the options with any exported result.

Although vgs is a reporting command, common LVM options include --yes and --test. Do not copy those options into a generic command template. --yes suppresses confirmation prompts and is hazardous when reused with a different LVM command. --test disables metadata writing, but the manual warns that multi-stage tools can still produce unusual messages. Neither option repairs a failed report.

Done means

  • Version recorded. vgs --version is logged with the audit.
  • Inventory compared. The normal report and, where needed, --all or --foreign have been checked against each other.
  • Script output is stable. It names its fields, uses an explicit separator or JSON, and specifies units when arithmetic is involved.
  • Warnings investigated. Any device-file, locking, shared-group, or foreign-group warning was chased down before changing LVM configuration.
  • No scope creep. No report command was confused with an activation, repair, resize, or removal operation.