Changeset 2077 in MondoRescue
- Timestamp:
- Dec 11, 2008, 12:28:51 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
devel/mindi/bin/analyze-lvm
r2076 r2077 189 189 print OUTPUT "\n"; 190 190 191 print OUTPUT "# Creating Physical Volumes\n"; 191 192 # Analyze the existing physical volumes 192 my @lvmpvs = (); 193 open(LVM,"$lvmcmd pvdisplay |") || mr_exit(-1,"Unable to execute $lvmcmd pvdisplay"); 194 while (<LVM>) { 195 if (/PV Name/) { 196 my $lvmpv = $_; 197 $lvmpv =~ s/^\s*PV Name ([A-z0-9/])/$1/; 198 } 199 push($lvmpv,@lvmpvs); 200 } 201 close(LVM); 202 203 ListAllPhysicalVolumes() { 204 if [ $lvmversion = 2 ]; then 205 $LVMCMD pvscan 2> /dev/null | grep 'PV' | awk '{print $2}' 206 else 207 pvscan 2> /dev/null | grep '"' | cut -d'"' -f2 208 fi 209 } 210 print OUTPUT "# Creating Physical Volumes\n"; 211 foreach my $pv (@lvmpvs) { 212 print OUTPUT "echo y | $lvmcmd pvcreate -ff $pv\n"; 213 } 214 print OUTPUT "\n"; 215 193 open(LVM,"$lvmcmd pvdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd pvdisplay -c"); 194 while (<LVM>) { 195 my ($pvname,$vgname,$pvsize,$ipvn,$pvstat,$pvna,$lvnum,$pesize,$petot,$pefree,$pelloc) = split(/:/); 196 print OUTPUT "$lvmcmd pvcreate -ff -y -s $pesize $pvname\n"; 197 } 198 close(LVM); 199 print OUTPUT "\n"; 216 200 print OUTPUT "# Scanning again Volume Groups\n"; 217 201 print OUTPUT "$lvmcmd vgscan\n"; … … 220 204 # Analyze the existing volume groups 221 205 print OUTPUT "# Creating Volume Groups and Activating them\n"; 222 my @lvmvgs = (); 223 open(LVM,"$lvmcmd vgdisplay |") || mr_exit(-1,"Unable to execute $lvmcmd vgdisplay"); 224 while (<LVM>) { 225 if (/VG Name/) { 226 my $lvmvg = $_; 227 $lvmvg =~ s/^\s*VG Name ([A-z0-9/])/$1/; 228 #$LVMCMD vgdisplay 2> /dev/null | awk '/^ *VG Name/ {print $3;}' 229 } 230 push($lvmvg,@lvmvgs); 231 } 232 close(LVM); 233 234 foreach my $vg (@lvmvgs) { 206 open(LVM,"$lvmcmd vgdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd vgdisplay -c"); 207 while (<LVM>) { 208 my ($vgname,$vgaccess,$vgstat,$vgnum,$lvmaxnum,$lvnum,$ocalvinvg,$lvmaxsize,$pvmaxnum,$cnumpv,$anumpv,$vgsize,$pesize,$penum,$pealloc,$pefree,$uuid) = split(/:/); 235 209 if ($lvmver < 2) { 236 210 print OUTPUT "# Removing device first as LVM v1 doesn't do it\n"; 237 211 print OUTPUT "rm -Rf /dev/$vg\n"; 238 212 } 239 mr_lvm_create_vg($vg); 240 } 241 242 sub mr_lvm_create_vg { 243 244 my $vg = shift; 245 246 $vg_params=`GenerateVgcreateParameters $vg` 247 GenerateVgcreateParameters() { 248 local current_VG device fname incoming VG_info_file max_logical_volumes max_physical_volumes physical_extent_size output blanklines 249 current_VG=$1 250 VG_info_file=$MINDI_TMP/$$.vg-info.txt 251 $LVMCMD vgdisplay $current_VG > $VG_info_file 252 max_logical_volumes=`GetValueFromField "$VG_info_file" "MAX LV"` 253 [ $max_logical_volumes -ge 256 ] && max_logical_volumes=255 254 max_physical_volumes=`GetValueFromField "$VG_info_file" "MAX PV"` 255 [ $max_physical_volumes -ge 256 ] && max_physical_volumes=255 256 physical_extent_size=`GetValueFromField "$VG_info_file" "PE Size"` 257 output="" 258 [ "$max_logical_volumes" ] && output="$output -l $max_logical_volumes" 259 [ "$max_physical_volumes" ] && output="$output -p $max_physical_volumes" 260 [ "$physical_extent_size" ] && output="$output -s $physical_extent_size" 261 echo "$output" 262 rm -f $VG_info_file 263 } 264 265 266 if ($lvmver = 1) { 267 $info_file = "/proc/lvm/VGs/$vg/group"; 268 $pvs=`ls /proc/lvm/VGs/$vg/PVs` 269 $list_of_devices="" 270 for i in $pvs ; do 271 fname=/proc/lvm/VGs/$vg/PVs/$i 272 device=`GetValueFromField $fname "name:"` 273 $list_of_devices="$list_of_devices $device" 274 done 275 } elsif ($lvmver = 2) { 276 $list_of_devices=`$lvmcmd pvs | grep " $vg " | awk '{print $1}'` 277 } 278 print OUTPUT "# Create Volume Group $vg\n"; 279 print OUTPUT "$lvmcmd vgcreate $vg $vg_param $list_of_devices\n"; 280 print OUTPUT "# Activate Volume Group $vg\n"; 281 print OUTPUT "$lvmcmd vgchnge -a y $vg\n"; 282 } 283 284 echo "Finally, create the LV's (logical volumes)." 285 all_logical_volumes=`ListAllLogicalVolumes` 286 for current_LV in $all_logical_volumes ; do 287 ProcessLogicalVolume $current_LV 288 done 289 echo "" 290 echo "# $LVMCMD vgscan" 291 echo "Now you may format the LV's:-" 292 for i in `ListAllLogicalVolumes` ; do 293 echo "(mkfs -t foo $i or something like that)" 294 done 295 WriteShutdownScript 296 exit 0 297 298 299 GetValueFromField() { 300 local res 301 sed s/' '/~/ "$1" | tr -s ' ' ' ' | sed s/'~ '/'~'/ | grep -i "$2~" | cut -d'~' -f2,3,4,5 | tr '~' ' ' | gawk '{ if ($2=="MB") {printf "%dm",$1;} else if ($2=="KB") {printf "%dk",$1;} else if ($2=="GB") {printf "%fg",$1;} else {print $0;};}' 302 } 303 304 305 GetLastBit() { 306 local i res 307 i=20 308 res="" 309 while [ ! "$res" ] ; do 310 i=$(($i-1)) 311 res=`echo "$1" | cut -d'/' -f$i` 312 done 313 echo "$res" 314 } 315 316 317 ProcessLogicalVolume() { 318 local LV_full_string fname logical_volume volume_group device 319 LV_full_string=$1 320 [ ! -e "$1" ] && Die "Cannot find LV file $1" 321 volume_group=`echo "$LV_full_string" | cut -d'/' -f3` 322 logical_volume=`echo "$LV_full_string" | cut -d'/' -f4` 323 if [ $lvmversion = 2 ]; then 324 device=$LV_full_string 325 params=`GenerateLvcreateParameters $device` 326 else 327 fname=/proc/lvm/VGs/$volume_group/LVs/$logical_volume 328 if [ ! -e "$fname" ] ; then 329 echo "Warning - cannot find $volume_group's $logical_volume LV file" 330 else 331 device=`GetValueFromField $fname "name:"` 332 params=`GenerateLvcreateParameters $device` 333 fi 334 fi 335 echo "# $LVMCMD lvcreate$params -n $logical_volume $volume_group" 336 } 337 338 339 GenerateLvcreateParameters() { 340 local device stripes stripesize device fname allocation output readahead 341 fname=$MINDI_TMP/PLF.$$.txt 342 device=$1 343 output="" 344 $LVMCMD lvdisplay $device > $fname 345 stripes=`GetValueFromField $fname "Stripes"` 346 stripesize=`GetValueFromField $fname "Stripe size (MByte)"`m 347 [ "$stripesize" = "m" ] && stripesize=`GetValueFromField $fname "Stripe size (KByte)"`k 348 [ "$stripesize" = "k" ] && stripesize="" 349 allocation=`GetValueFromField $fname "LV Size"` 350 [ ! "`echo "$allocation" | grep "[k,m,g]"`" ] && allocation="$allocation"m 351 if echo "$allocation" | grep -E '^.*g$' > /dev/null 2> /dev/null ; then 352 val=`echo "$allocation" | sed s/g//` 353 allocation=`echo "$val" | awk '{c=$1; printf "%d", c*1024;}'`m 354 fi 355 readahead=`GetValueFromField $fname "Read ahead sectors"` 356 rm -f $fname 213 $lvmaxnum = 255 if ($lvmaxnum > 256); 214 $pvmaxnum = 255 if ($pvmaxnum > 256); 215 print OUTPUT "# Create Volume Group $vgname\n"; 216 # Pb sur pesize unite ? 217 print OUTPUT "$lvmcmd vgcreate $vgname -p $pvmaxnum -s $pesize -l $lvmaxnum $lvmaxnum\n"; 218 } 219 close(LVM); 220 print OUTPUT "\n"; 221 print OUTPUT "# Activate Volume Group $vg\n"; 222 print OUTPUT "$lvmcmd vgchange -ay\n"; 223 print OUTPUT "\n"; 224 225 print OUTPUT "# Creating Logical Volumes\n"; 226 open(LVM,"$lvmcmd lvdisplay -c |") || mr_exit(-1,"Unable to execute $lvmcmd lvdisplay -c"); 227 while (<LVM>) { 228 my ($lvname,$vgname,$lvaccess,$lvstat,$lvnum,$oclv,$lvsize,$leinlv,$lealloc,$allocpol,$reaadhead,$major,$minor) = split(/:/); 229 print OUTPUT "# Create Logical Volume $lvname\n"; 230 print OUTPUT "$lvmcmd lvcreate -n $lvname -L $lvsize -r $redahed $vgname\n"; 357 231 [ "$stripes" ] && output="$output -i $stripes" 358 232 [ "$stripesize" ] && output="$output -I $stripesize" 359 [ "$allocation" ] && output="$output -L $allocation" 360 [ "$readahead" ] && output="$output -r $readahead" 361 echo "$output" 362 } 363 364 365 366 367 368 369 ListAllLogicalVolumes() { 370 if [ $lvmversion = 2 ]; then 371 $LVMCMD lvscan 2> /dev/null | grep "'" | cut -d"'" -f2 372 else 373 lvscan 2> /dev/null | grep '"' | cut -d'"' -f2 374 fi 375 } 376 377 378 379 WriteShutdownScript() { 380 local i 381 echo "" 382 echo "Finally, to shut down and delete the volumes, do this:-" 383 for i in `ListAllLogicalVolumes` ; do 384 echo "($LVMCMD lvremove -f $i)" 385 done 386 for i in `ListAllVolumeGroups` ; do 387 echo "($LVMCMD vgchange -a n $i)" 388 done 389 for i in `ListAllVolumeGroups` ; do 390 echo "($LVMCMD vgremove $i)" 391 done 392 if [ $lvmversion = 2 ]; then 393 echo "(rmmod dm-mod & rmmod dm_mod & )" 394 else 395 echo "(rmmod lvm-mod)" 396 fi 397 } 398 399 400 233 } 234 close(LVM); 235 print OUTPUT "\n"; 236 print OUTPUT "# Scanning again Volume Groups\n"; 237 print OUTPUT "$lvmcmd vgscan\n"; 238 print OUTPUT "\n"; 239 240 WriteShutdownScript 241 mr_exit(0,"End of analyze-lvm");
Note:
See TracChangeset
for help on using the changeset viewer.