Linux: Como criar um Volume Group com todos os discos acabados de adicionar

Vamos supor que acabaste de adicionar um ou mais discos a um sistema Linux (físico ou virtual), e que queres criar um volume group chamado “vgdata” composto por todos eles — ou adicioná-los a esse VG caso ele já exista.

Pela piada da coisa, vamos também supor que queres fazer isto para vários sistemas ao mesmo tempo, e que há bastante heterogeneidade entre eles — uns podem já ter o VG “vgdata” e outros não, e uns podem ter tido apenas um disco adicionado, quando outros tiveram vários. Como scriptar isto?

#!/bin/bash

# cria partições LVM de tamanho máximo em todas as drives sem partições; cria também PVs para elas
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

# se o VG "vgdata" existe, estende-o com todos os PVs não usados...
vgs | grep -q vgdata && pvs --no-headings -o pv_name -S vg_name="" | sed 's/^ *//g' | xargs vgextend vgdata

# ... caso contrário, cria-o com esses mesmos PVs
vgs | grep -q vgdata || pvs --no-headings -o pv_name -S vg_name="" | sed 's/^ *//g' | xargs vgcreate vgdata

Como sempre, podes usar o sistema de automatização da tua empresa para correr isto numa lista de servidores, ou usar o pssh, ou um ciclo “for” em bash, ou…