lc_net.in
来自「lustre 1.6.5 source code」· IN 代码 · 共 227 行
IN
227 行
#!/bin/bash## lc_net - script for Lustre cluster network verification################################################################################# Usageusage() { cat >&2 <<EOFUsage: `basename $0` [options] <csv file> Options: -a select all the nodes from the csv file to operate on -w hostname,hostname,... select the specified list of nodes (separated by commas) -x hostname,hostname,... exclude the specified list of nodes (separated by commas) -v verbose mode csv file a spreadsheet that contains configuration parameters (separated by commas) for each target in a Lustre cl- uster, the first field of each line is the host name of the cluster nodeEOF exit 1}# Get the library of functions. @scriptlibdir@/lc_commonVERBOSE_OUTPUT=false# Get and check the positional parameterswhile getopts "aw:x:v" OPTION; do case $OPTION in a) [ -z "${SPECIFIED_NODELIST}" ] && [ -z "${EXCLUDED_NODELIST}" ]\ && USE_ALLNODES=true ;; w) USE_ALLNODES=false SPECIFIED_NODELIST=$OPTARG ;; x) USE_ALLNODES=false EXCLUDED_NODELIST=$OPTARG ;; v) VERBOSE_OUTPUT=true ;; ?) usage esacdone# Toss out the parameters we've already processedshift `expr $OPTIND - 1`# Here we expect the csv fileif [ $# -eq 0 ]; then echo >&2 $"`basename $0`: Missing csv file!" usagefi# Global variablesCSV_FILE=$1declare -a HOST_NAMESdeclare -a HOST_IPADDRS# Get the hosts to be operated onget_hostnames() { local NODES_TO_USE # Initialize the HOST_NAMES array unset HOST_NAMES # Get the list of nodes to be operated on NODES_TO_USE=$(get_nodelist) [ ${PIPESTATUS[0]} -ne 0 ] && echo >&2 "${NODES_TO_USE}" && return 1 # Check the node list if [ -z "${NODES_TO_USE}" ]; then echo "`basename $0`: There are no hosts to be operated on."\ "Check the node selection options (-a, -w or -x)." return 1 fi # Load the hostnames in the nodelist into the array HOST_NAMES=( $(echo ${NODES_TO_USE//,/ }) ) return 0}# ping_host host_name# Check whether host $host_name is reachable. # If it is, then return the IP address of this host.ping_host() { local host_name=$1 local ip_addr= local ret_str if [ -z "${host_name}" ]; then echo "`basename $0`: ping_host() error: Missing hostname!" return 1 fi # Run ping command ret_str=$(ping -c1 ${host_name} 2>&1) if [ ${PIPESTATUS[0]} -ne 0 ]; then if [ -n "${ret_str}" ]; then echo "`basename $0`: ping_host() error: ${ret_str}!" else echo "`basename $0`: ping_host() error:"\ "Host ${host_name} does not respond to ping!" fi return 1 fi # Get the IP address ip_addr=`echo "${ret_str}" | head -1 | awk '{print $3}' | \ sed -e 's/^(//' -e 's/)$//'` echo "${ip_addr}" return 0}# local_check index# Check the network connectivity between local host and ${HOST_NAMES[index]}.local_check() { declare -i i=$1 # Check whether ${HOST_NAMES[i]} is reachable # and get the IP address of this host from ping HOST_IPADDRS[i]=$(ping_host ${HOST_NAMES[i]}) if [ ${PIPESTATUS[0]} -ne 0 ]; then echo >&2 "${HOST_IPADDRS[i]}" return 1 fi return 0}# remote_check index# Check whether ${HOST_NAMES[index]} can resolve its own name and whether# this host agrees with the local host about what its name is resolved to.remote_check() { declare -i i=$1 local cmd ret_str local ip_addr= # the IP address got from remote ping # Execute remote command to check whether ${HOST_NAMES[i]} # can resolve its own name cmd="ping -c1 ${HOST_NAMES[i]} 2>&1" ret_str=$(${REMOTE} ${HOST_NAMES[i]} "${cmd}" 2>&1) if [ ${PIPESTATUS[0]} -ne 0 -a -n "${ret_str}" ]; then echo >&2 "`basename $0`: remote_check() error:"\ "remote to ${HOST_NAMES[i]} error: ${ret_str}!" return 1 fi if [ -z "${ret_str}" ]; then echo >&2 "`basename $0`: remote_check() error:"\ "No results from ${HOST_NAMES[i]}! Check the network"\ "connectivity between local host and ${HOST_NAMES[i]}!" return 1 fi # Get the IP address of ${HOST_NAMES[i]} from its own ping if is_pdsh; then ip_addr=`echo "${ret_str}" | head -1 | awk '{print $4}'` else ip_addr=`echo "${ret_str}" | head -1 | awk '{print $3}'` fi ip_addr=`echo "${ip_addr}" | sed -e 's/^(//' -e 's/)$//'` # Compare IP addresses # Check whether ${HOST_NAMES[i]} agrees with the local host # about what its name is resolved to. if [ "${ip_addr}" != "${HOST_IPADDRS[i]}" ]; then echo >&2 "`basename $0`: remote_check() error:"\ "Local host resolves ${HOST_NAMES[i]} to IP address"\ "\"${HOST_IPADDRS[i]}\", while its own resolution is"\ "\"${ip_addr}\". They are not the same!" return 1 fi return 0}# network_verify# Verify name resolution and network connectivity of the Lustre clusternetwork_verify() { declare -i i # Initialize the HOST_IPADDRS array unset HOST_IPADDRS # Get all the host names to be operated on ! get_hostnames && return 1 # Check the network connectivity between local host # and other cluster nodes for ((i = 0; i < ${#HOST_NAMES[@]}; i++)); do [ "${HOST_NAMES[i]}" = "`hostname`" ] && continue verbose_output "Verifying network connectivity between"\ "\"`hostname`\" and \"${HOST_NAMES[i]}\"..." ! local_check $i && return 1 ! remote_check $i && return 1 verbose_output "OK" done return 0}# Main flowif ! check_file ${CSV_FILE}; then exit 1 fi# Cluster network verificationif ! network_verify; then exit 1 fiexit 0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?