1#!/sbin/sh -p 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License (the "License"). 7# You may not use this file except in compliance with the License. 8# 9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10# or http://www.opensolaris.org/os/licensing. 11# See the License for the specific language governing permissions 12# and limitations under the License. 13# 14# When distributing Covered Code, include this CDDL HEADER in each 15# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16# If applicable, add the following below this CDDL HEADER, with the 17# fields enclosed by brackets "[]" replaced with your own identifying 18# information: Portions Copyright [yyyy] [name of copyright owner] 19# 20# CDDL HEADER END 21# 22# 23# Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24# Use is subject to license terms. 25# 26# 27PATH=/usr/bin:/usr/sbin:$PATH; export PATH 28STMSBOOTUTIL=/lib/mpxio/stmsboot_util 29STMSMETHODSCRIPT=/lib/svc/method/mpxio-upgrade 30KDRVCONF= 31DRVCONF= 32TMPDRVCONF= 33TMPDRVCONF_MPXIO_ENTRY= 34TMPDRVCONF_SATA_ENTRY= 35DRVLIST= 36GUID= 37VFSTAB=/etc/vfstab 38SAVEDIR=/etc/mpxio 39BOOTDEVICES=$SAVEDIR/boot-devices 40RECOVERFILE=$SAVEDIR/recover_instructions 41SVCCFG_RECOVERY=$SAVEDIR/svccfg_recover 42SUPPORTED_DRIVERS="fp|mpt|mpt_sas|pmcs" 43USAGE=`gettext "Usage: stmsboot [-D $SUPPORTED_DRIVERS] -e | -d | -u | -L | -l controller_number"` 44TEXTDOMAIN=SUNW_OST_OSCMD 45export TEXTDOMAIN 46STMSINSTANCE=svc:system/device/mpxio-upgrade:default 47STMSBOOT=/usr/sbin/stmsboot 48BOOTADM=/sbin/bootadm 49MOUNT=/usr/sbin/mount 50EEPROM=/usr/sbin/eeprom 51EGREP=/usr/bin/egrep 52GREP=/usr/bin/grep 53AWK=/usr/bin/awk 54CP=/usr/bin/cp 55DF=/usr/bin/df 56LS=/usr/bin/ls 57MV=/usr/bin/mv 58RM=/usr/bin/rm 59SORT=/usr/bin/sort 60UNIQ=/usr/bin/uniq 61EXPR=/usr/bin/expr 62MKDIR=/usr/bin/mkdir 63REBOOT=/usr/sbin/reboot 64SED=/usr/bin/sed 65SVCPROP=/usr/bin/svcprop 66SVCCFG=/usr/sbin/svccfg 67SVCS=/usr/bin/svcs 68SVCADM=/usr/sbin/svcadm 69 70NOW=`/usr/bin/date +%G%m%d_%H%M` 71MACH=`/usr/bin/uname -p` 72BOOTENV_FILE=bootenv.rc 73reboot_needed=0 74new_bootpath="" 75CLIENT_TYPE_PHCI="" 76CLIENT_TYPE_VHCI="/scsi_vhci" 77 78# 79# Copy all entries (including comments) from source driver.conf 80# to destination driver.conf except those entries which contain 81# the mpxio-disable property. 82# Take into consideration entries that spawn more than one line. 83# 84# $1 source driver.conf file 85# $2 destination driver.conf file 86# 87# Returns 0 on success, non zero on failure. 88# 89delete_mpxio_disable_entries() 90{ 91 # be careful here, we've got embedded \t characters 92 # in sed's pattern space. 93 $SED ' 94 /^[ ]*#/{ p 95 d 96 } 97 s/[ ]*$// 98 /^$/{ p 99 d 100 } 101 /mpxio-disable[ ]*=.*;$/{ w '$3' 102 d 103 } 104 /disable-sata-mpxio[ ]*=.*;$/{ w '$4' 105 d 106 } 107 /;$/{ p 108 d 109 } 110 :rdnext 111 N 112 s/[ ]*$// 113 /[^;]$/b rdnext 114 /mpxio-disable[ ]*=/{ s/\n/ /g 115 w '$3' 116 d 117 } 118 ' $1 > $2 119 120 return $? 121} 122 123# 124# backup the last saved copy of the specified files. 125# $* files to backup 126# 127backup_lastsaved() 128{ 129 for file in $* 130 do 131 newfile=`basename $file` 132 $CP $file $SAVEDIR/$newfile.$cmd.$NOW 133 done 134} 135 136# 137# build recover instructions 138# 139# $1 1 to include boot script in the instructions 140# 0 otherwise 141# 142build_recover() 143{ 144 gettext "Instructions to recover your previous STMS configuration (if in case the system does not boot):\n\n" > $RECOVERFILE 145 echo "\tboot net \c" >> $RECOVERFILE 146 gettext "(or from a cd/dvd/another disk)\n" >> $RECOVERFILE 147 echo "\tfsck <your-root-device>" >> $RECOVERFILE 148 echo "\tmount <your-root-device> /mnt" >> $RECOVERFILE 149 150 if [ "$cmd" = "update" ]; then 151 gettext "\tUndo the modifications you made to STMS configuration.\n\tFor example undo any changes you made to " >> $RECOVERFILE 152 echo "/mnt$KDRVCONF." >> $RECOVERFILE 153 else 154 echo "\tcp /mnt${SAVEDIR}/$DRVCONF.$cmd.$NOW /mnt$KDRVCONF" >> $RECOVERFILE 155 fi 156 157 if [ $1 -eq 1 ]; then 158 echo "\tcp /mnt${SAVEDIR}/vfstab.$cmd.$NOW /mnt$VFSTAB" >> $RECOVERFILE 159 160 echo "repository /mnt/etc/svc/repository.db" > $SVCCFG_RECOVERY 161 echo "select $STMSINSTANCE" >> $SVCCFG_RECOVERY 162 echo "setprop general/enabled=false" >> $SVCCFG_RECOVERY 163 echo "exit" >> $SVCCFG_RECOVERY 164 165 echo "\t$SVCCFG -f /mnt$SVCCFG_RECOVERY" >> $RECOVERFILE 166 167 if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then 168 echo "\tcp /mnt${SAVEDIR}/bootenv.rc.$cmd.$NOW /mnt/boot/solaris/$BOOTENV_FILE" >> $RECOVERFILE 169 fi 170 fi 171 172 rootdisk=`$MOUNT | $GREP "/ on " | cut -f 3 -d " "` 173 echo "\tumount /mnt\n\treboot\n\n${rootdisk} \c" >> $RECOVERFILE 174 gettext "was your root device,\nbut it could be named differently after you boot net.\n" >> $RECOVERFILE 175} 176 177 178# 179# Arrange for /etc/vfstab and dump configuration to be updated 180# during the next reboot. If the cmd is "enable" or "disable", copy 181# $TMPDRVCONF to $KDRVCONF. 182# 183# Returns 0 on success, 1 on failure. 184# 185update_sysfiles() 186{ 187 188 gettext "WARNING: This operation will require a reboot.\n" 189 gettext "Do you want to continue ? [y/n] (default: y) " 190 read response 191 192 if [ -n "$response" -a "$response" != "y" -a \ 193 "$response" != "Y" ]; then 194 for d in $DRVLIST; do 195 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 196 $RM -f $TMPDRVCONF > /dev/null 2>&1 197 done; 198 return 0; 199 fi 200 201 # set need_bootscript to the number of drivers that 202 # we support. 203 need_bootscript=`echo $SUPPORTED_DRIVERS|$AWK -F"|" '{print NF}'` 204 205 if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then 206 207 for d in $DRVLIST; do 208 DRVCONF=$d.conf 209 KDRVCONF=/kernel/drv/$d.conf 210 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 211 212 $CP $KDRVCONF $SAVEDIR/`basename $KDRVCONF`.$cmd.$NOW 213 if [ -f $TMPDRVCONF ]; then 214 $CP $TMPDRVCONF $KDRVCONF 215 $RM -f $TMPDRVCONF 216 else 217 # if $TMPDRVCONF doesn't exist, then we 218 # haven't made any changes to it 219 continue; 220 fi 221 222 # 223 # there is no need to update the system files in the following 224 # cases: 225 # - we are enabling mpxio and the system has no configured 226 # disks accessible by phci paths. 227 # - we are disabling mpxio and the system has no configured 228 # disks accessible by vhci paths. 229 # 230 231 # Function to setup the CLIENT_TYPE_PHCI string based on 232 # the list of drivers that we're operating on. The variable 233 # depends upon the pathname of the parent node in the 234 # device tree, which can be different on x86/x64 and sparc. 235 236 CLIENT_TYPE_PHCI=`$STMSBOOTUTIL -D $d -N`; 237 238 if [ -z "$CLIENT_TYPE_PHCI" ]; then 239 continue; 240 fi 241 242 if [ "$cmd" = "enable" ]; then 243 $LS -l /dev/dsk/*s2 2> /dev/null | \ 244 $EGREP -s "$CLIENT_TYPE_PHCI" 245 else 246 $LS -l /dev/dsk/*s2 2> /dev/null | \ 247 $EGREP -s "$CLIENT_TYPE_VHCI" 248 fi 249 250 if [ $? -ne 0 ]; then 251 need_bootscript=`$EXPR $need_bootscript - 1` 252 fi 253 done 254 fi 255 256 if [ $need_bootscript -gt 0 ]; then 257 need_bootscript=1 258 if [ -n "$new_bootpath" -a "$MACH" = "i386" ]; then 259 #only update bootpath for x86. 260 $CP /boot/solaris/$BOOTENV_FILE $SAVEDIR/$BOOTENV_FILE.$cmd.$NOW 261 $EEPROM bootpath="$new_bootpath" 262 fi 263 264 # Enable the mpxio-upgrade service for the reboot 265 $SVCADM disable -t $STMSINSTANCE 266 $SVCCFG -s $STMSINSTANCE "setprop general/enabled=true" 267 else 268 need_bootscript=0 269 fi 270 271 build_recover $need_bootscript 272 273 if [ "$MACH" = "i386" ]; then 274 $BOOTADM update-archive 275 fi 276 277 gettext "The changes will come into effect after rebooting the system.\nReboot the system now ? [y/n] (default: y) " 278 read response 279 280 if [ -z "$response" -o "$response" = "y" -o \ 281 "$response" = "Y" ]; then 282 $REBOOT 283 fi 284 285 return 0 286} 287 288 289# 290# Enable or disable mpxio as specified by the cmd. 291# Returns 0 on success, 1 on failure. 292# 293# Args: $cmd = {enable | disable} 294# $d = {fp | mpt | mpt_sas | pmcs} 295# 296# the global variable $DRVLIST is used 297# 298configure_mpxio() 299{ 300 # be careful here, we've got embedded \t characters 301 # in sed's pattern space. 302 mpxiodisableno='mpxio-disable[ ]*=[ ]*"no"[ ]*;' 303 mpxiodisableyes='mpxio-disable[ ]*=[ ]*"yes"[ ]*;' 304 satadisableno='disable-sata-mpxio[ ]*=[ ]*"no"[ ]*;' 305 satadisableyes='disable-sata-mpxio[ ]*=[ ]*"yes"[ ]*;' 306 307 if [ "$cmd" = "enable" ]; then 308 mpxiodisable_cur_entry=$mpxiodisableyes 309 satadisable_cur_entry=$satadisableyes 310 propval=no 311 msg=`gettext "STMS already enabled"` 312 else 313 mpxiodisable_cur_entry=$mpxiodisableno 314 satadisable_cur_entry=$satadisableno 315 propval=yes 316 msg=`gettext "STMS already disabled"` 317 fi 318 319 DRVCONF=$d.conf 320 KDRVCONF=/kernel/drv/$d.conf 321 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 322 TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$; 323 TMPDRVCONF_SATA_ENTRY=/var/run/tmp.$d.conf.sataentry.$$; 324 325 if delete_mpxio_disable_entries $KDRVCONF $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY; then 326 327 if [ -s $TMPDRVCONF_MPXIO_ENTRY ]; then 328 # $DRVCONF does have mpxiodisable entries 329 $EGREP -s "$mpxiodisable_cur_entry" $TMPDRVCONF_MPXIO_ENTRY 330 if [ $? -eq 0 ]; then 331 reboot_needed=`$EXPR $reboot_needed + 1` 332 else 333 # if all mpxiodisable entries are no/yes for 334 # enable/disable mpxio, notify the user 335 $EGREP -s "$satadisable_cur_entry" $TMPDRVCONF_SATA_ENTRY 336 if [ $? -eq 0 -a "$d" = "mpt" ]; then 337 reboot_needed=`$EXPR $reboot_needed + 1` 338 else 339 $RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 340 return 0; 341 fi 342 fi 343 344 # If mpxiodisable entries do not exist, always continue update 345 fi 346 else 347 $RM -f $TMPDRVCONF $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 348 gettext "failed to update " 1>&2 349 echo "$KDRVCONF." 1>&2 350 gettext "No changes were made to your STMS configuration.\n" 1>&2 351 return 1 352 fi 353 354 rm $TMPDRVCONF_MPXIO_ENTRY $TMPDRVCONF_SATA_ENTRY > /dev/null 2>&1 355 echo "mpxio-disable=\"${propval}\";" >> $TMPDRVCONF 356 if [ "$d" = "mpt" ]; then 357 echo "disable-sata-mpxio=\"${propval}\";" >> $TMPDRVCONF 358 fi 359 360} 361 362setcmd() 363{ 364 if [ "$cmd" = "none" ]; then 365 cmd=$1 366 else 367 echo "$USAGE" 1>&2 368 exit 2 369 fi 370} 371 372# 373# Need to update bootpath on x86 if boot system from FC disk 374# Only update bootpath here when mpxio is enabled 375# If mpxio is currently disabled, then we'll update bootpath in the 376# mpxio-upgrade service method on reboot. 377# 378 379get_newbootpath_for_stmsdev() { 380 if [ "$cmd" = "enable" ]; then 381 return 0 382 fi 383 384 cur_bootpath=`$STMSBOOTUTIL -b` 385 if [ $? != 0 ]; then 386 return 1 387 fi 388 389 # Since on x64 platforms the eeprom command doesn't update the 390 # kernel, the file /boot/solaris/bootenv.rc and the kernel's 391 # bootpath variable have a good chance of differing. We do some 392 # extra handwaving to get the correct bootpath variable setting. 393 394 ONDISKVER=`$AWK '/bootpath/ {print $3}' /boot/solaris/bootenv.rc|\ 395 $SED -e"s,',,g"` 396 if [ "$ONDISKVER" != "$cur_bootpath" ]; then 397 cur_bootpath="$ONDISKVER" 398 fi 399 400 NEWBOOTPATH="" 401 for path in $cur_bootpath; do 402 mapped=`$STMSBOOTUTIL -p $path` 403 if [ "$mapped" != "NOT_MAPPED" ]; then 404 if [ "$mapped" != "$path" ]; then 405 NEWBOOTPATH=`echo "$path " | \ 406 $SED -e"s|$path|$mapped|"`" $NEWBOOTPATH" 407 else 408 NEWBOOTPATH="$NEWBOOTPATH $path" 409 fi 410 fi 411 done 412 # now strip off leading and trailing space chars 413 new_bootpath=`echo $NEWBOOTPATH` 414 return 0 415} 416 417# 418# Emit a warning message to the user that by default we 419# operate on all multipath-capable controllers that are 420# attached to the system, and that if they want to operate 421# on only a specific controller type (fp|mpt|mpt_sas|pmcs|....) then 422# they need to re-invoke stmsboot with "-D $driver" in 423# their argument list 424# 425 426emit_driver_warning_msg() { 427 428 # for each driver that we support, grab the list 429 # of controllers attached to the system. 430 431 echo "" 432 gettext "WARNING: stmsboot operates on each supported multipath-capable controller\n" 433 gettext " detected in a host. In your system, these controllers are\n\n" 434 435 for WARNDRV in `echo $SUPPORTED_DRIVERS| $SED -e"s,|, ,g"`; do 436 $STMSBOOTUTIL -D $WARNDRV -n 437 done; 438 439 echo "" 440 gettext "If you do NOT wish to operate on these controllers, please quit stmsboot\n" 441 gettext "and re-invoke with -D { fp | mpt | mpt_sas | pmcs} to specify which controllers you wish\n" 442 gettext "to modify your multipathing configuration for.\n" 443 444 echo "" 445 gettext "Do you wish to continue? [y/n] (default: y) " 446 read response 447 448 if [ -n "$response" -a "$response" != "Y" -a \ 449 "$response" != "y" ]; then 450 exit 451 fi 452} 453 454 455# 456# 457# main starts here 458# 459 460cmd=none 461# process options 462while getopts D:geduLl: c 463do 464 case $c in 465 e) setcmd enable;; 466 d) setcmd disable;; 467 u) setcmd update;; 468 L) setcmd listall;; 469 l) setcmd list 470 controller=$OPTARG;; 471 D) DRV=$OPTARG;; 472 g) GUID="-g";; 473 \?) echo "$USAGE" 1>&2 474 exit 2;; 475 esac 476done 477 478if [ "$cmd" = "none" ]; then 479 echo "$USAGE" 1>&2 480 exit 2 481fi 482 483if [ -z "$DRV" ]; then 484 DRVLIST="fp mpt mpt_sas pmcs" 485else 486 DRVLIST=$DRV 487fi 488 489USERID=`id | $EGREP "uid=0"` 490if [ -z "$USERID" ]; then 491 gettext "You must be super-user to run this script.\n" 1>&2 492 exit 1 493fi 494 495# just a sanity check 496if [ ! -f $STMSBOOTUTIL -o ! -f $STMSMETHODSCRIPT ]; then 497 fmt=`gettext "Can't find %s and/or %s"` 498 printf "$fmt\n" "$STMSBOOTUTIL" "$STMSMETHODSCRIPT" 1>&2 499 exit 1 500fi 501 502# If the old sun4u-specific SMF method is found, remove it 503$SVCCFG -s "platform/sun4u/mpxio-upgrade:default" < /dev/null > /dev/null 2>&1 504if [ $? -eq 0 ]; then 505 $SVCCFG delete "platform/sun4u/mpxio-upgrade:default" > /dev/null 2>&1 506fi 507 508# now import the new service, if necessary 509$SVCPROP -q $STMSINSTANCE < /dev/null > /dev/null 2>&1 510if [ $? -ne 0 ]; then 511 if [ -f /var/svc/manifest/system/device/mpxio-upgrade.xml ]; then 512 $SVCCFG import /var/svc/manifest/system/device/mpxio-upgrade.xml 513 if [ $? -ne 0 ]; then 514 515 fmt=`gettext "Unable to import the %s service"` 516 printf "$fmt\n" "$STMSINSTANCE" 1>&2 517 exit 1 518 else 519 fmt=`gettext "Service %s imported successfully, continuing"` 520 printf "$fmt\n" "$STMSINSTANCE" 1>&2 521 fi 522 else 523 fmt=`gettext "Service %s does not exist on this host"` 524 printf "$fmt\n" "$STMSINSTANCE" 1>&2 525 exit 1 526 fi 527fi 528 529 530# make sure we can stash our data somewhere private 531if [ ! -d $SAVEDIR ]; then 532 $MKDIR -p $SAVEDIR 533fi 534# prime the cache 535$STMSBOOTUTIL -i 536 537 538if [ "$cmd" = "enable" -o "$cmd" = "disable" -o "$cmd" = "update" ]; then 539 # 540 # The bootup script doesn't work on cache-only-clients as the script 541 # is executed before the plumbing for cachefs mounting of root is done. 542 # 543 if $MOUNT -v | $EGREP -s " on / type (nfs|cachefs) "; then 544 gettext "This command option is not supported on systems with an nfs or cachefs mounted root filesystem.\n" 1>&2 545 exit 1 546 fi 547 548 # if the user has left the system with the mpxio-upgrade service 549 # in a temporarily disabled state (ie, service is armed for the next 550 # reboot), then let them know. We need to ensure that the system is 551 # is in a sane state before allowing any further invocations, so 552 # try to get the system admin to do so 553 554 ISARMED=`$SVCS -l $STMSINSTANCE|$GREP "enabled.*false.*temporary"` 555 if [ ! $? ]; then 556 echo "" 557 gettext "You need to reboot the system in order to complete\n" 558 gettext "the previous invocation of stmsboot.\n" 559 echo "" 560 gettext "Do you wish to reboot the system now? (y/n, default y) " 561 read response 562 563 if [ -z "$response" -o "x$response" = "Y" -o \ 564 "$response" = "y" ]; then 565 $REBOOT 566 else 567 echo "" 568 gettext "Please reboot this system before continuing\n" 569 echo "" 570 exit 1 571 fi 572 fi 573 574 # 575 # keep a copy of the last saved files, useful for manual 576 # recovery in case of a problem. 577 # 578 for d in $DRVLIST; do 579 DRVCONF=$d.conf 580 KDRVCONF=/kernel/drv/$d.conf 581 TMPDRVCONF=/var/run/tmp.$d.conf.$$ 582 TMPDRVCONF_MPXIO_ENTRY=/var/run/tmp.$d.conf.mpxioentry.$$; 583 if [ "$MACH" = "sparc" ]; then 584 backup_lastsaved $KDRVCONF $VFSTAB 585 else 586 backup_lastsaved $KDRVCONF $VFSTAB /boot/solaris/$BOOTENV_FILE 587 fi 588 done 589fi 590 591if [ "$cmd" = "enable" -o "$cmd" = "disable" ]; then 592 593 msgneeded=`echo "$DRVLIST" |grep " "` 594 if [ -n "$msgneeded" ]; then 595 emit_driver_warning_msg 596 fi 597 for d in $DRVLIST; do 598 configure_mpxio $cmd $d 599 done 600 601 if [ $reboot_needed -ne 0 ]; then 602 # Need to update bootpath on x86 if our boot device is 603 # now accessed through mpxio. 604 # Only update bootpath before reboot when mpxio is enabled 605 # If mpxio is currently disabled, we will update bootpath 606 # on reboot in the mpxio-upgrade service 607 608 if [ "$cmd" = "disable" ]; then 609 if [ "$MACH" = "i386" ]; then 610 get_newbootpath_for_stmsdev 611 if [ $? -ne 0 ]; then 612 $RM -f $TMPDRVCONF > /dev/null 2>&1 613 gettext "failed to update bootpath.\n" 1>&2 614 gettext "No changes were made to your STMS configuration.\n" 1>&2 615 return 1 616 fi 617 fi 618 # If we're not using ZFS root then we need 619 # to keep track of what / maps to in case 620 # it's an active-active device and we boot from 621 # the other path 622 ROOTSCSIVHCI=`$DF /|$AWK -F":" '{print $1}' | \ 623 $AWK -F"(" '{print $2}'| \ 624 $SED -e"s,dsk,rdsk," -e"s,s.[ ]*),,"` 625 $STMSBOOTUTIL -L | $GREP $ROOTSCSIVHCI | \ 626 $AWK '{print $1}' | $SED -e"s,rdsk,dsk,g" \ 627 >$BOOTDEVICES 628 fi 629 update_sysfiles 630 else 631 echo "STMS is already ${cmd}d. No changes or reboots needed" 632 fi 633 634 635elif [ "$cmd" = "update" ]; then 636 if [ "$MACH" = "i386" ]; then 637 # In this case we always change the bootpath to phci-based 638 # path first. bootpath will later be modified in mpxio-upgrade 639 # to the vhci-based path if mpxio is enabled on root. 640 get_newbootpath_for_stmsdev 641 if [ $? -ne 0 ]; then 642 gettext "failed to update bootpath.\n" 1>&2 643 return 1 644 fi 645 fi 646 update_sysfiles 647 648elif [ "$cmd" = "list" ]; then 649 $STMSBOOTUTIL $GUID -l $controller 650else 651 $STMSBOOTUTIL $GUID -L 652fi 653 654exit $? 655