Linux: create a Volume Group with all newly added disks

Let’s say you’ve just added one or more disk drives to a (physical or virtual) Linux system, and you know you want to create a volume group named “vgdata” with all of them — or add them to that VG if it already exists.

For extra fun, let’s also say you want to do it to a lot of systems at the same time, and they’re a heterogeneous bunch — some of them may have the “vgdata” VG already, while some don’t; some of them may have had just one new disk added to it, while others got several. How to script it?

#!/bin/bash

# create full-size LVM partitions on all drives with no partitions yet; also create PVs for them
for i in b c d e f g h i j k l m n o p q r s t u v w x y z; do sfdisk -s /dev/sd$i >/dev/null 2>&1 && ( sfdisk -s /dev/sd${i}1 >/dev/null 2>&1 || ( parted /dev/sd$i mklabel msdos && parted -a optimal /dev/sd$i mkpart primary ext4 "0%" "100%" && parted -s /dev/sd$i set 1 lvm on && pvcreate /dev/sd${i}1 ) ) ; done

# if the "vgdata" VG exists, extend it with all unused PVs...
vgs | grep -q vgdata && pvs --no-headings -o pv_name -S vg_name="" | sed 's/^ *//g' | xargs vgextend vgdata

# ... otherwise, create it with those same PVs
vgs | grep -q vgdata || pvs --no-headings -o pv_name -S vg_name="" | sed 's/^ *//g' | xargs vgcreate vgdata

As always, you can use your company’s automation system to run it on a bunch of servers, or use pssh, or a bash “for” cycle, or…

2 Replies to “Linux: create a Volume Group with all newly added disks”

  1. You may be asking why I’m using sfdisk to check for disks and partitions, while I could have just checked for the existence of the device files (/dev/sdb, /dev/sdb1, etc.). I seem to recall that that wasn’t completely reliable, though I don’t remember any details. sfdisk seems to work fine, and will ensure that those devices are really disks or partitions, though I’m probably just being paranoid here.

  2. For an older Linux (e.g. Red Hat 5.x):

    – “mklabel msdos” wasn’t accepted, even though it says it should be on the man page. Just take the “msdos” part out;

    – “-a optimal” isn’t recognized either…

    – … and neither is ext4 (use ext3).

Leave a Reply