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…

2 comentários em “Linux: Como criar um Volume Group com todos os discos acabados de adicionar”

  1. Podem perguntar-se porque é que estou a usar o sfdisk para verificar discos e partições, quando podia apenas olhar para a existência dos ficheiros de devices (/dev/sdb, /dev/sdb1, etc.). Tenho memória de que isso não é completamente fiável, mas não me lembro dos detalhes. O sfdisk funciona correctamente, e verifica que os devices são realmente discos ou partições, se bem que é possível que aqui esteja a ser paranóico.

  2. No caso de um Linux mais antigo (ex. Red Hat 5.x):

    – “mklabel msdos” não é aceite, apesar de na man page dizer que devia ser. Retira a parte “msdos” do comando, para funcionar;

    – “-a optimal” também não é reconhecido…

    – … nem o tipo de filesystem ext4 (usa ext3).

Deixar uma resposta