#!/usr/bin/perl -w # # Analyze the LVM configuration # and stor the configuration for restore time # # $Id$ # # Copyright B. Cornec 2008 # Provided under the GPL v2 # Syntax: see below use strict 'vars'; use Getopt::Long qw(:config auto_abbrev no_ignore_case); use Data::Dumper; use English; use File::Basename; use File::Copy; use File::stat; use File::Temp qw(tempdir); use POSIX qw(strftime); use lib qw (lib); use ProjectBuilder::Base; use ProjectBuilder::Distribution; =pod =head1 NAME Analyze-lvm - A Mindi Tool to analyze the LVM configuration and store it =head1 DESCRIPTION B prints all the information related to the LVM configuration that may be used by a restoration process =head1 SYNOPSIS analyze-lvm [-v]|[-q]|[-h]|[--man] =head1 OPTIONS =over 4 =item B<-v|--verbose> Print a brief help message and exits. =item B<-q|--quiet> Do not print any output. =item B<-h|--help> Print a brief help message and exits. =item B<--man> Prints the manual page and exits. =item B<-i|--iso iso_image> Name of the ISO image you want to created. =back =head1 WEB SITES The main Web site of the project is available at L. Bug reports should be filled using the trac instance of the project at L. =head1 USER MAILING LIST The miling list of the project is available at L =head1 AUTHORS The Mondorescue.org team L lead by Bruno Cornec L. =head1 COPYRIGHT Analyze-LVM is distributed under the GPL v2.0 license described in the file C included with the distribution. =cut # --------------------------------------------------------------------------- # Initialize the syntax string pb_syntax_init("analyze-lvm Version PBVER-rPBREV\n"); # Handle options # GetOptions("help|?|h" => \$opts{'h'}, "man" => \$opts{'man'}, "verbose|v+" => \$opts{'v'}, "quiet|q" => \$opts{'q'}, "log-files|l=s" => \$opts{'l'}, "version|V" => \$opts{'V'}, ) || pb_syntax(-1,0); # easy options if (defined $opts{'h'}) { pb_syntax(0,1); } if (defined $opts{'man'}) { pb_syntax(0,2); } if (defined $opts{'v'}) { $pbdebug = $opts{'v'}; } if (defined $opts{'q'}) { $pbdebug=-1; } # # Global variables # my $MINDI_VERSION = "PBVER-rPBREV"; my $MINDI_PREFIX = "PBPREFIX"; my $MINDI_CONF = "PBCONF"; my $MINDI_LIB = "PBLIB"; my $MINDI_SBIN = "$MINDI_PREFIX/sbin"; # # Temp dir # pb_temp_init(); my $lvmds = "/usr/sbin/lvmdiskscan"; my $lvmproc = "/proc/lvm/global"; my $lvmcmd = "/usr/sbi/lvm"; # -------------------------------- main ----------------------------------- mr_exit(-1,"$lvmds doesn't exist. No LVM handling.") if ((! -x $lvmds) ; mr_exit(-1,"$lvmproc doesn't exist. No LVM handling.") if ((! -x $lvmproc) ; # Check LVM volumes presence open(LVM,$lvmproc) || mr_exit(-1,"Unable to open $lvmproc"); while () { mr_exit(1,"No LVM volumes found in $lvmproc") if (/0 VGs 0 PVs 0 LVs/); } close(LVM); # Check LVM version my $lvmver=0; open(LVM,"$lvmds --help 2>&1 |") || mr_exit(-1,"Unable to execute $lvmds"); while () { if (/Logical Volume Manager/ || /LVM version:/) { $lvmver = $_; $lvmver =~ s/:([0-9])\..*/$1/; } } close(LVM); #lvmversion=`lvmdiskscan --help 2>&1 | #grep -E "Logical Volume Manager|LVM version:" | #cut -d: -f2 | cut -d. -f1 | #awk '{print $NF}' | #sed -e 's/ //g'` if ($lvmver = 0) { # Still not found if (-x $lvmcmd) { open(LVM,"$lvmcmd version |") || mr_exit(-1,"Unable to execute $lvmcmd"); while () { if (/LVM version/) { $lvmver = $_; $lvmver =~ s/LVM version ([0-9])\..*/$1/; } } close(LVM); } } if ($lvmver = 0) { # Still not found mr_exit(-1,"Unable to determine LVM version.\nPlease report to the dev team with the result of the commands\n$lvmds and $lvmvmd version"); } elsif ($lvmver = 1) { $lvmcmd = ""; } pb_log(0,"Found LVM version $lvmver"); # For the moment on stdout OUTPUT = \*STDOUT; # Generate the startup scrit on the fly needed to restore LVM conf print OUTPUT "# Desactivate Volume Groups\n"; print OUTPUT "$lvmcmd vgchange -an\n"; print OUTPUT "\n"; print OUTPUT "# Creating Physical Volumes\n"; # Analyze the existing physical volumes open(LVM,"$lvmcmd pvdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd pvdisplay -c"); while () { my ($pvname,$vgname,$pvsize,$ipvn,$pvstat,$pvna,$lvnum,$pesize,$petot,$pefree,$pelloc) = split(/:/); print OUTPUT "$lvmcmd pvcreate -ff -y -s $pesize $pvname\n"; } close(LVM); print OUTPUT "\n"; print OUTPUT "# Scanning again Volume Groups\n"; print OUTPUT "$lvmcmd vgscan\n"; print OUTPUT "\n"; # Analyze the existing volume groups print OUTPUT "# Creating Volume Groups and Activating them\n"; open(LVM,"$lvmcmd vgdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd vgdisplay -c"); while () { my ($vgname,$vgaccess,$vgstat,$vgnum,$lvmaxnum,$lvnum,$ocalvinvg,$lvmaxsize,$pvmaxnum,$cnumpv,$anumpv,$vgsize,$pesize,$penum,$pealloc,$pefree,$uuid) = split(/:/); if ($lvmver < 2) { print OUTPUT "# Removing device first as LVM v1 doesn't do it\n"; print OUTPUT "rm -Rf /dev/$vg\n"; } $lvmaxnum = 255 if ($lvmaxnum > 256); $pvmaxnum = 255 if ($pvmaxnum > 256); print OUTPUT "# Create Volume Group $vgname\n"; # Pb sur pesize unite ? print OUTPUT "$lvmcmd vgcreate $vgname -p $pvmaxnum -s $pesize -l $lvmaxnum $lvmaxnum\n"; } close(LVM); print OUTPUT "\n"; print OUTPUT "# Activate Volume Group $vg\n"; print OUTPUT "$lvmcmd vgchange -ay\n"; print OUTPUT "\n"; print OUTPUT "# Creating Logical Volumes\n"; open(LVM,"$lvmcmd lvdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd lvdisplay -c"); while () { my ($lvname,$vgname,$lvaccess,$lvstat,$lvnum,$oclv,$lvsize,$leinlv,$lealloc,$allocpol,$reaadhead,$major,$minor) = split(/:/); print OUTPUT "# Create Logical Volume $lvname\n"; print OUTPUT "$lvmcmd lvcreate -n $lvname -L $lvsize -r $redahed $vgname\n"; [ "$stripes" ] && output="$output -i $stripes" [ "$stripesize" ] && output="$output -I $stripesize" } close(LVM); print OUTPUT "\n"; print OUTPUT "# Scanning again Volume Groups\n"; print OUTPUT "$lvmcmd vgscan\n"; print OUTPUT "\n"; WriteShutdownScript mr_exit(0,"End of analyze-lvm");