| [16] | 1 | #!/bin/ksh | 
|---|
|  | 2 | # IBM_PROLOG_BEGIN_TAG | 
|---|
|  | 3 | # This is an automatically generated prolog. | 
|---|
|  | 4 | # | 
|---|
|  | 5 | # | 
|---|
|  | 6 | # | 
|---|
|  | 7 | # Licensed Materials - Property of IBM | 
|---|
|  | 8 | # | 
|---|
|  | 9 | # (C) COPYRIGHT International Business Machines Corp. 2004,2005 | 
|---|
|  | 10 | # All Rights Reserved | 
|---|
|  | 11 | # | 
|---|
|  | 12 | # US Government Users Restricted Rights - Use, duplication or | 
|---|
|  | 13 | # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. | 
|---|
|  | 14 | # | 
|---|
|  | 15 | # IBM_PROLOG_END_TAG | 
|---|
|  | 16 | # @(#)54 1.8 src/avs/fs/mmfs/ts/admin/mmdevdiscover.sh, mmfs, avs_rgpfs24, rgpfs240610b 8/8/05 19:09:02 | 
|---|
|  | 17 | ############################################################################## | 
|---|
|  | 18 | # | 
|---|
|  | 19 | # This script is invoked by GPFS to discover the disk devices on the | 
|---|
|  | 20 | # local machine that will subsequently be opened for NSD volume identifier | 
|---|
|  | 21 | # mapping.  We open each of the devices listed and examine sector 2 for a | 
|---|
|  | 22 | # volume identifier that correlates to a volume identifier recorded in our | 
|---|
|  | 23 | # configuration database.  If a match is found then this machine has local | 
|---|
|  | 24 | # access to the underlying NSD device and local I/O occurs through the local | 
|---|
|  | 25 | # device interface.  This script will also invoke | 
|---|
|  | 26 | # | 
|---|
|  | 27 | #   /var/mmfs/etc/nsddevices | 
|---|
|  | 28 | # | 
|---|
|  | 29 | # if it is supplied by the user.  If the nsddevices script exits with | 
|---|
|  | 30 | # a return code of zero, then no other disk discovery is performed. | 
|---|
|  | 31 | # If nsddevices does not exist, or returns with a non-zero return | 
|---|
|  | 32 | # code, then this script performs its normal disk discovery steps. | 
|---|
|  | 33 | # | 
|---|
|  | 34 | # The output from both this script and nsddevices is a number of lines | 
|---|
|  | 35 | # with the following format: | 
|---|
|  | 36 | # | 
|---|
|  | 37 | #   deviceName deviceType | 
|---|
|  | 38 | # | 
|---|
|  | 39 | # where | 
|---|
|  | 40 | #   deviceName is a device name ("hdisk1", "sda", etc.) | 
|---|
|  | 41 | #   deviceType is a known disk types. | 
|---|
|  | 42 | # | 
|---|
|  | 43 | # Known disk types currently are: | 
|---|
|  | 44 | # | 
|---|
|  | 45 | #   powerdisk  - EMC power path disk | 
|---|
|  | 46 | #   vpath      - IBM virtual path disk | 
|---|
|  | 47 | #   dlmfdrv    - Hitachi dlm | 
|---|
|  | 48 | #   hdisk      - AIX hard disk | 
|---|
|  | 49 | #   lv         - AIX logical volume.  Historical usage only. | 
|---|
|  | 50 | #                Not allowed as a new device to mmcrnsd. | 
|---|
|  | 51 | #   generic    - Device having no unique failover or multipathing | 
|---|
|  | 52 | #                characteristic (predominantly Linux devices). | 
|---|
|  | 53 | # | 
|---|
|  | 54 | # Example: | 
|---|
|  | 55 | # | 
|---|
|  | 56 | #   hdisk1  hdisk | 
|---|
|  | 57 | #   hdisk2  hdisk | 
|---|
|  | 58 | # | 
|---|
|  | 59 | ############################################################################## | 
|---|
|  | 60 |  | 
|---|
|  | 61 | # Include global declarations and service routines. | 
|---|
|  | 62 | . /usr/lpp/mmfs/bin/mmglobfuncs | 
|---|
|  | 63 |  | 
|---|
|  | 64 | sourceFile="mmdevdiscover.sh" | 
|---|
|  | 65 | [[ -n $DEBUG || -n $DEBUGmmdevdiscover ]] && set -x | 
|---|
|  | 66 | $mmTRACE_ENTER "$*" | 
|---|
|  | 67 |  | 
|---|
|  | 68 | # Change this if you want stderr to go elsewhere. | 
|---|
|  | 69 | STDERR=/dev/null | 
|---|
|  | 70 |  | 
|---|
|  | 71 |  | 
|---|
|  | 72 | ######################################################## | 
|---|
|  | 73 | # Invoke the nsddevices user exit, if it was activated. | 
|---|
|  | 74 | # If the script exits with a zero return code then we | 
|---|
|  | 75 | # use it exclusively and will not do anything more. | 
|---|
|  | 76 | # If nsddevices does not exist, or if it returns with | 
|---|
|  | 77 | # a non-zero return code, then we will perform normal | 
|---|
|  | 78 | # GPFS disk discovery. | 
|---|
|  | 79 | ######################################################## | 
|---|
|  | 80 | if [[ -x $nsddevices ]] | 
|---|
|  | 81 | then | 
|---|
|  | 82 | $nsddevices | 
|---|
|  | 83 | [[ $? -eq 0 ]] && cleanupAndExit 0 | 
|---|
|  | 84 | fi | 
|---|
|  | 85 |  | 
|---|
|  | 86 |  | 
|---|
|  | 87 | ################################################## | 
|---|
|  | 88 | # Perform the normal GPFS disk discovery process. | 
|---|
|  | 89 | ################################################## | 
|---|
|  | 90 | if [[ $osName = AIX ]] | 
|---|
|  | 91 | then | 
|---|
|  | 92 | # Get the names of Virtual Shared Disks, if any. | 
|---|
|  | 93 | if [[ -x $lsvsd ]] | 
|---|
|  | 94 | then | 
|---|
|  | 95 | $lsvsd 2>$STDERR | $awk '{ if (NF > 0) print $1 " vsd" }' | 
|---|
|  | 96 | fi | 
|---|
|  | 97 |  | 
|---|
|  | 98 | # Get all defined and available vpaths, hdisks, etc. | 
|---|
|  | 99 | LC_ALL=C $getlvodm -F 2>$STDERR |                   \ | 
|---|
|  | 100 | $awk '                                            \ | 
|---|
|  | 101 | /hdiskpower/  { print $1 " powerdisk" ; next }  \ | 
|---|
|  | 102 | /dlmfdrv/     { print $1 " dlmfdrv"   ; next }  \ | 
|---|
|  | 103 | /vpath/       { print $1 " vpath"     ; next }  \ | 
|---|
|  | 104 | /hdisk/       { print $1 " hdisk"     ; next }  \ | 
|---|
|  | 105 | ' | 
|---|
|  | 106 |  | 
|---|
|  | 107 | # Get all logical volume names. | 
|---|
|  | 108 | # LVs are supported in older file systems only.  Not allowed as a new device. | 
|---|
|  | 109 | LC_ALL=C $lsvg -o 2>$STDERR | LC_ALL=C $lsvg -i -l 2>$STDERR | \ | 
|---|
|  | 110 | $awk '                                  \ | 
|---|
|  | 111 | /LV NAME/ || /:/  { next }            \ | 
|---|
|  | 112 | { print $1 " lv" }  \ | 
|---|
|  | 113 | ' | 
|---|
|  | 114 |  | 
|---|
|  | 115 | elif [[ $osName = Linux ]] | 
|---|
|  | 116 | then | 
|---|
|  | 117 | # Get the names of all disks, vpaths, etc. | 
|---|
|  | 118 | $awk '                                                                 \ | 
|---|
|  | 119 | /emcpower/   { if (NF > 3 && $3 > 1) print $4 " powerdisk" ; next }  \ | 
|---|
|  | 120 | /vpath/      { if (NF > 3 && $3 > 1) print $4 " vpath"     ; next }  \ | 
|---|
|  | 121 | /[sh]d/      { if (NF > 3 && $3 > 1) print $4 " generic"   ; next }  \ | 
|---|
|  | 122 | ' /proc/partitions 2>$STDERR | 
|---|
|  | 123 |  | 
|---|
|  | 124 | else | 
|---|
|  | 125 | print -u2  " Unknown operating system $osName " | 
|---|
|  | 126 | cleanupAndExit | 
|---|
|  | 127 | fi | 
|---|
|  | 128 |  | 
|---|
|  | 129 | # Search for the disk type of "file" in the mmsdrfs file. | 
|---|
|  | 130 | # Note:  This is used for testing during development only. | 
|---|
|  | 131 | possiblefiles=$($awk -F: '                      \ | 
|---|
|  | 132 | /':$SG_DISKS:'/ {                             \ | 
|---|
|  | 133 | if ($'$NSD_SUBTYPE_Field' == "file") {      \ | 
|---|
|  | 134 | { print $'$NSD_SUBTYPE_DISKNAME_Field' }  \ | 
|---|
|  | 135 | }                                           \ | 
|---|
|  | 136 | }                                             \ | 
|---|
|  | 137 | ' $mmsdrfsFile) | 
|---|
|  | 138 | for testfile in $possiblefiles | 
|---|
|  | 139 | do | 
|---|
|  | 140 | [[ -f $testfile ]] && print -- "$testfile file" | 
|---|
|  | 141 | done | 
|---|
|  | 142 |  | 
|---|
|  | 143 | cleanupAndExit 0 | 
|---|
|  | 144 |  | 
|---|