2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-08-13 23:00:22 +00:00
Files
xcat-core/xCAT/postscripts/configib
Matt Ezell 1e11b6e80f Add support for a default MTU on a network
Add a MTU column to the networks table.  If set, this will configure the MTU in
DHCP so that nodes will have the correct MTU during provisioning.  This is
important for large systems to enable jumbo frames to reduce CPU usage when
copying diskless images over the network (before the confignics postscript can
run to set the desired MTU).
2016-10-01 16:01:28 -04:00

693 lines
23 KiB
Bash
Executable File

#!/bin/bash
# IBM(c) 2013 EPL license http://www.eclipse.org/legal/epl-v10.html
# Internal script used by confignics only
# xCAT post script for configuring ib adapters.
# Work for both IPv4 and IPv6
# The following are a sample of the env used:
# NIC_IBNICS=ib0,ib1
# NIC_IBAPORTS=1 (or 2)
# OSVER=sles11.1
# NICNODE=dxm360m4n04
# NICIPS='eth0!10.1.34.242,ib1!15.0.1.242,ib2!15.0.2.242'
# NICHOSTNAMESUFFIXES='eth1!-eth1,ib1!-ib1,ib2!-ib2'
# NICTYPES='eth1!ethernet,ib1!infiniband,ib2!infiniband'
# NICNETWORKS='eth0!10_1_0_0-255_255_255_0,ib1!ib1,ib2!ib2'
# NETWORKS_LINES=3
# NETWORKS_LINE1='netname=10_1_0_0-255_255_255_0||net=10.1.0.0||mask=255.255.255.0||mgtifname=eth1||gateway=<xcatmaster>||dhcpserver=10.1.0.205||tftpserver=10.1.0.205||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||mtu=||disable=||comments='
# NETWORKS_LINE2='netname=ib1||net=15.0.1.0||mask=255.255.255.0||mgtifname=||gateway=15.0.1.254||dhcpserver=||tftpserver=||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||mtu=||disable=||comments='
# NETWORKS_LINE3='netname=ib3||net=15.0.3.0||mask=255.255.255.0||mgtifname=||gateway=||dhcpserver=||tftpserver=||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||mtu=||disable=||comments='
if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
str_dir_name=`dirname $0`
. $str_dir_name/xcatlib.sh
fi
#This is the number of ports for each ib adpator.
portnum=1
if [ -n "$NIC_IBAPORTS" ]; then
portnum=$NIC_IBAPORTS
fi
# pmatch determines if 1st argument string is matched by 2nd argument pattern
pmatch ()
{
case $1 in
$2) return 0;; # zero return code means string matched by pattern
esac
return 1 # non-zero return code means string not matched by pattern
}
convert_netmask_to_cidr() {
let cidrnum=0
OLFIFS=$IFS
IFS=.
for x in $1
do
case $x in
255) cidrnum=$(expr $cidrnum + 8);;
254) cidrnum=$(expr $cidrnum + 7);;
252) cidrnum=$(expr $cidrnum + 6);;
248) cidrnum=$(expr $cidrnum + 5);;
240) cidrnum=$(expr $cidrnum + 4);;
224) cidrnum=$(expr $cidrnum + 3);;
192) cidrnum=$(expr $cidrnum + 2);;
128) cidrnum=$(expr $cidrnum + 1);;
0);;
esac
done
IFS=$OLDIFS
echo $cidrnum
}
#if $NIC_IBNICS is not defined, all ib nics' configuration files will be deleted.
if [ -z "$NIC_IBNICS" ]; then
echo "nothing to do."
fi
#find correct IB driver
PLTFRM=`uname`
if [[ $OSVER == rhels5* || "$OSVER" == rhels6* || "$OSVER" == ubuntu14* ]]
then
ib_driver="rdma"
#/sbin/service $ib_driver status
checkservicestatus $ib_driver
#if [ $? -eq 1 ]
if [ $? -ne 0 ]
then
ib_driver="openibd"
#/sbin/service $ib_driver status
checkservicestatus $ib_driver
#if [ $? -eq 1 ]
if [ $? -ne 0 ]
then
echo "Not found the driver dameon: rdma or openibd"
logger -p local4.info -t xcat "Not found the driver dameon: rdma or openibd"
exit
fi
fi
else
ib_driver="openibd"
fi
#make changes to the confiuration file
if [ $PLTFRM == "Linux" ]
then
if [ -f "/etc/rdma/rdma.conf" ]
then
TMP1=`sed "s/SDP_LOAD=yes/SDP_LOAD=no/g" /etc/rdma/rdma.conf`
echo "$TMP1" > /etc/rdma/rdma.conf
elif [ -f "/etc/infiniband/openib.conf" ]
then
TMP1=`sed "s/SDP_LOAD=yes/SDP_LOAD=no/g" /etc/infiniband/openib.conf`
echo "$TMP1" > /etc/infiniband/openib.conf
fi
if [ -f "/etc/modprobe.conf" ]
then
if [ "$portnum" == "1" ]; then
TMP2=`sed "/options ib_ehca nr_ports/d" /etc/modprobe.conf`
echo "$TMP2" > /etc/modprobe.conf
echo 'options ib_ehca nr_ports=1' >> /etc/modprobe.conf
else
TMP2=`sed "/options ib_ehca nr_ports=1/d" /etc/modprobe.conf`
echo "$TMP2" > /etc/modprobe.conf
fi
TMP3=`sed "/options ib_ehca lock_hcalls/d" /etc/modprobe.conf`
echo "$TMP3" > /etc/modprobe.conf
echo 'options ib_ehca lock_hcalls=0' >> /etc/modprobe.conf
fi
#/sbin/chkconfig --level 2345 $ib_driver on > /dev/null 2>&1
enableservice $ib_driver > /dev/null 2>&1
#/sbin/service $ib_driver restart
#restartservice $ib_driver
sysctl -p > /dev/null 2>&1
fi
#clean up existing ib nic configrations
if [ $PLTFRM == "Linux" ]
then
if [ -f /etc/redhat-release ]
then
OS_name="redhat"
elif [ -f /etc/SuSE-release ]
then
OS_name="suse"
elif [ -f /etc/os-release ] && cat /etc/os-release |grep NAME|grep Ubuntu>/dev/null
then
OS_name="ubuntu"
else
echo "Unsupported to config IB on this OS!"
logger -p local4.info -t xcat "Unsupported to config IB on this OS!"
exit
fi
if [ $OS_name != 'ubuntu' ]; then
if [ $OS_name == 'suse' ]
then
dir="/etc/sysconfig/network"
else
dir="/etc/sysconfig/network-scripts"
fi
#`rm -f $dir/ifcfg-$nic` 2>&1 1>/dev/null
# nic aliases
for nic in `echo "$NIC_IBNICS" | tr "," "\n"`
do
rm -f $dir/ifcfg-$nic 2>&1 1>/dev/null
done
else
interfaces="/etc/network/interfaces"
for tmp in `sed -n "/auto ib/=" ${interfaces}`
do
startline=`sed -n "/auto ib/=" ${interfaces}| head -n 1`
endline=`sed -n "$startline,/^auto/p" ${interfaces} |wc -l`
if sed -n "$startline,/^auto/p" ${interfaces} |sed '$!d' |grep "auto" >/dev/null;then
endline=`expr $startline + $endline - 2`
else
endline=`expr $startline + $endline - 1`
fi
((startline--))
temp=`sed -n ${startline}p ${interfaces}`
while [[ $temp =~ ^# ]]
do
((startline--))
temp=`sed -n ${startline}p ${interfaces}`
done
((startline++))
temp=`sed -n ${endline}p ${interfaces}`
while [[ $temp =~ ^# ]]
do
((endline--))
temp=`sed -n ${endline}p ${interfaces}`
done
sed -i ${startline},${endline}d ${interfaces}
done
fi
else
loop_number=`lsdev | grep "IP over Infiniband Network Interface" | wc -l`
num=0
while [ $num -lt $loop_number ]
do
if [ "$portnum" == "2" ]; then
num0=`expr $num \* 2`
num1=`expr $num0 + 1`
`rmdev -d -l ib$num0 >/dev/null 2>&1`
`rmdev -d -l ib$num1 >/dev/null 2>&1`
`rmdev -d -l ml$num >/dev/null 2>&1`
num=`expr $num + 1`
else
`rmdev -d -l ib$num >/dev/null 2>&1`
n=`expr $num % 2`
if [ $n == 1 ]
then
mlnum=`expr $num / 2`
`rmdev -d -l ml$mlnum >/dev/null 2>&1`
fi
num=`expr $num + 1`
fi
done
`rmdev -dl icm >/dev/null 2>&1`
#restart the managers
mkdev -c management -s infiniband -t icm
cfgmgr
fi
goodnics=""
for nic in `echo "$NIC_IBNICS" | tr "," "\n"`
do
#Get nic ips
nicips=""
for tmp in `echo "$NICIPS" | tr "," "\n"`
do
nic_tmp=`echo "$tmp" | awk -F"!" '{print $1}'`;
if [ $nic_tmp == $nic ]; then
# nicips=ip1|ip2|ip3
nicips=`echo "$tmp" | awk -F"!" '{print $2}'`;
break
fi
done
# echo "nic=$nic, nicip=$nicip"
#get nic networks name
nicnets=""
for tmp in `echo "$NICNETWORKS" | tr "," "\n"`
do
nic_tmp=`echo "$tmp" | awk -F"!" '{print $1}'`;
if [ $nic_tmp == $nic ]; then
# nicnets=net1|net2|net3
nicnets=`echo "$tmp" | awk -F"!" '{print $2}'`;
break
fi
done
#echo "nic=$nic, nicnet=$nicnet"
if [ -z "$nicnets" ]; then
echo "No network defined for $nic"
logger -p local4.info -t xcat "No network defined for $nic"
continue
fi
unset array_nic_params
unset array_extra_param_names
unset array_extra_param_values
get_nic_extra_params $nic "$NICEXTRAPARAMS"
j=0
while [ $j -lt ${#array_nic_params[@]} ]
do
token1="${array_nic_params[$j]}"
echo "array_nic_params $j=$token1"
j=$((j+1))
done
ipindex=0
for nicip in `echo $nicips | tr "|" "\n"`
do
ipindex=`expr $ipindex + 1`
nicnet=`echo $nicnets | cut -d '|' -f$ipindex`
#get netmask and gateway
index=0;
found=0
while [ $index -lt $NETWORKS_LINES ]
do
index=$((index+1))
eval netline=\$NETWORKS_LINE$index
if [[ -n "$netline" ]]; then
for tmp in `echo "$netline" | tr "\|" "\n"`
do
key=`echo "$tmp" | awk -F"=" '{print $1}'`;
case $key in
netname)
netname=`echo "$tmp" | awk -F"=" '{print $2}'`
if [ "$netname" != "$nicnet" ];
then
break;
fi
;;
net)
net=`echo "$tmp" | awk -F"=" '{print $2}'`
;;
mask)
netmask=`echo "$tmp" | awk -F"=" '{print $2}'`
# remove the prefix "/" from ipv6 mask
if echo $netmask | grep "/" 2>&1 1>/dev/null
then
netmask=`echo $netmask | awk -F'/' '{print $2}'`
fi
;;
gateway)
gateway=`echo "$tmp" | awk -F"=" '{print $2}'`
found=1
;;
esac
if [ $found -eq 1 ]; then
break;
fi
done # end for tmp in `echo "$netline" | tr "\|" "\n"`
if [ $found -eq 1 ]; then
break;
fi
fi # end if [[ -n "$netline" ]]
done # end while [ $index -lt $NETWORKS_LINES ]
#echo "found=$found"
#echo "index=$index netname=$nicnet net=$net mask=$netmask gateway=$gateway"
# Setup goodnics list
if [ "$found" == "0" ]; then
echo "Cannot find network $nicnet for $nic"
logger -p local4.info -t xcat "Cannot find network $nicnet for $nic"
continue
else
if [ -z "$goodnics" ]; then
goodnics=$nic
else
goodnics="$goodnics,$nic"
fi
fi
#there should be only one gateway on a node and that should go through the to the xcat management node and would be set up from the install nic. Anything else should be a route
if [ "$gateway" == "<xcatmaster>" ] || [ "$gateway" == "&lt;xcatmaster&gt;" ]; then
gateway=''
fi
if [ ${#array_nic_params[@]} -gt 0 ]; then
str_extra_params=${array_nic_params[$ipindex-1]}
parse_nic_extra_params "$str_extra_params"
fi
if [ $PLTFRM == "Linux" ]
then
# Issue openibd for Linux at boot time
if [ -f /etc/sysctl.conf ]
then
TMP1=`sed "/net.ipv4.conf.$nic.arp_filter=1/d" /etc/sysctl.conf`
echo "$TMP1" > /etc/sysctl.conf
TMP2=`sed "/net.ipv4.conf.$nic.arp_ignore=1/d" /etc/sysctl.conf`
echo "$TMP2" > /etc/sysctl.conf
cfg="net.ipv4.conf.$nic.arp_filter=1"
grep "$cfg" /etc/sysctl.conf 2>&1 1>/dev/null
if [ $? -ne 0 ]
then
echo "net.ipv4.conf.$nic.arp_filter=1" >> /etc/sysctl.conf
fi
cfg="net.ipv4.conf.$nic.arp_ignore=1"
grep "$cfg" /etc/sysctl.conf 2>&1 1>/dev/null
if [ $? -ne 0 ]
then
echo "net.ipv4.conf.$nic.arp_ignore=1" >> /etc/sysctl.conf
fi
fi
if [ $OS_name == 'suse' ]
then
# First ip address
if [ $ipindex -eq 1 ]
then
# Write the info to the ifcfg file
echo "DEVICE=$nic
NM_CONTROLLED=no
BOOTPROTO=static
STARTMODE=onboot
IPADDR=$nicip" > $dir/ifcfg-$nic
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
echo "PREFIXLEN=$netmask" >> $dir/ifcfg-$nic
else
echo "NETMASK=$netmask" >> $dir/ifcfg-$nic
fi
if [ -n "$gateway" ]; then
# Do not add duplicate default gateway entry
grep -E "default\\s+$gateway\\s+" /etc/sysconfig/network/routes 2>&1 1>/dev/null
if [ $? -ne 0 ]; then
echo "default $gateway - -" >> /etc/sysconfig/network/routes
fi
fi
#add extra params
i=0
while [ $i -lt ${#array_extra_param_names[@]} ]
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
echo "${name}=${value}" >> $dir/ifcfg-$nic
i=$((i+1))
done
else # not the first ip address
echo "LABEL_$ipindex=$ipindex
IPADDR_$ipindex=$nicip" >> $dir/ifcfg-$nic
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
echo "PREFIXLEN_$ipindex=$netmask" >> $dir/ifcfg-$nic
else
echo "NETMASK_$ipindex=$netmask" >> $dir/ifcfg-$nic
fi
if [ -n "$gateway" ]; then
# Do not add duplicate default gateway entry
grep -E "default\\s+$gateway\\s+" /etc/sysconfig/network/routes 2>&1 1>/dev/null
if [ $? -ne 0 ]; then
echo "default $gateway - -" >> /etc/sysconfig/network/routes
fi
fi
#add extra params
i=0
while [ $i -lt ${#array_extra_param_names[@]} ]
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
echo "${name}=${value}" >> $dir/ifcfg-$nic
i=$((i+1))
done
fi # end if [ $ipindex -eq 1 ]
elif [ $OS_name == 'redhat' ]
then
# First ip address
if [ $ipindex -eq 1 ]
then
# Write the info to the ifcfg file
echo "DEVICE=$nic
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=$nicip" > $dir/ifcfg-$nic
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
echo "PREFIXLEN=$netmask" >> $dir/ifcfg-$nic
else
if [[ "$OSVER" == rhels6* ]]
then
#get prefix from netmask, this is for IPv4 only
prefix=24
prefix=$(convert_netmask_to_cidr $netmask)
echo "PREFIX=$prefix" >> $dir/ifcfg-$nic
else
echo "NETMASK=$netmask" >> $dir/ifcfg-$nic
fi
fi
if [ -n "$gateway" ]; then
echo "GATEWAY=$gateway" >> $dir/ifcfg-$nic
fi
#add extra params
i=0
while [ $i -lt ${#array_extra_param_names[@]} ]
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
echo "${name}=${value}" >> $dir/ifcfg-$nic
i=$((i+1))
done
else # not the first ip address
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
grep "IPV6INIT" $dir/ifcfg-$nic 2>&1 1>/dev/null
# The first ipv6 address
if [ $? -ne 0 ]
then
echo "IPV6INIT=yes
IPV6ADDR=$nicip/$netmask" >> $dir/ifcfg-$nic
else
echo "IPV6ADDR_SECONDARIES=$nicip/$netmask" >> $dir/ifcfg-$nic
fi
if [ -n "$gateway" ]; then
echo "IPV6_DEFAULTGW=$gateway" >> $dir/ifcfg-$nic
fi
else # ipv4 address
echo "DEVICE=$nic:$ipindex
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=$nicip" > $dir/ifcfg-$nic:$ipindex
if [[ "$OSVER" == rhels6* ]]
then
#get prefix from netmask, this is for IPv4 only
prefix=24
prefix=$(convert_netmask_to_cidr $netmask)
echo "PREFIX=$prefix" >> $dir/ifcfg-$nic:$ipindex
else
echo "NETMASK=$netmask" >> $dir/ifcfg-$nic:$ipindex
fi
if [ -n "$gateway" ]; then
echo "GATEWAY=$gateway" >> $dir/ifcfg-$nic:$ipindex
fi
#add extra params
i=0
while [ $i -lt ${#array_extra_param_names[@]} ]
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
echo "${name}=${value}" >> $dir/ifcfg-$nic:$ipindex
i=$((i+1))
done
# need to run ifup eth1:1 for RedHat
goodnics="$goodnics,$nic:$ipindex"
fi
fi # end not the first ip address
elif [ $OS_name == 'ubuntu' ]
then
# First ip address
if [ $ipindex -eq 1 ]; then
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
echo "auto $nic
iface $nic inet6 static
address $nicip
netmask $netmask" >> /etc/network/interfaces
if [ -n "$gateway" ]; then
echo "gateway $gateway" >> /etc/network/interfaces
fi
# ipv4
else
# Write the info to the ifcfg file
echo "auto $nic
iface $nic inet static
address $nicip
netmask $netmask" >> /etc/network/interfaces
#if [ -n "$gateway" ]; then
# echo "gateway $gateway" >> /etc/network/interfaces
#fi
fi
else # Not the first ip address
# ipv6
if echo $nicip | grep : 2>&1 1>/dev/null
then
echo "auto $nic
iface $nic inet6 static
address $nicip
netmask $netmask" >> /etc/network/interfaces
if [ -n "$gateway" ]; then
echo "gateway $gateway" >> /etc/network/interfaces
fi
else # ipv4
echo "auto $nic:$ipindex
iface $nic:$ipindex inet static
address $nicip
netmask $netmask" >> /etc/network/interfaces
#if [ -n "$gateway" ]; then
# echo "gateway $gateway" >> /etc/network/interfaces
#fi
fi
fi
#add extra params
i=0
while [ $i -lt ${#array_extra_param_names[@]} ]
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
echo "${name} ${value}" >> /etc/network/interfaces
i=$((i+1))
done
else
echo "Unsupported operating system"
logger -p local4.err -t xcat "Unsupported operating system"
fi
elif [ $PLTFRM == "AIX" ]; then
if ( pmatch $nic "ml*" ); then #for ml* interface
num=${nic##ml}
mlt="mlt$num"
#Check whether the mlt is available
lsdev -C | grep $mlt | grep Available 2>&1 >/dev/null
if [ $? -ne 0 ]
then
echo "$mltnum is not available."
logger -p local4.info -t xcat "$mltnum is not available."
continue
fi
#Check whether the ml0 is available
lsdev -C | grep $nic 2>&1 >/dev/null
if [ $? -ne 0 ]
then
cfgmgr 2>&1 >/dev/null
fi
chdev -l $nic -a state=detach 2>&1
chdev -l $nic -a netaddr=$nicip -a netmask=$netmask -a state=up 2>&1
else #assume it is ib*
#lsdev -C | grep icm | grep Available
#if [ $? -ne 0 ]
#then
# mkdev -c management -s infiniband -t icm
# if [ $? -ne 0 ]
# then
# mkdev -l icm
# if [ $? -ne 0 ]
# then
# exit $?
# fi
# fi
# fi
#Configure the IB interfaces. Customize the port num.
num=${nic##ib} #this assumes that all the nics starts with 'ib'
if [ "$portnum" == "1" ]; then
iba_num=$num
ib_adapter="iba$iba_num"
port=1
else
iba_num=`expr $num / 2`
ib_adapter="iba$iba_num"
if [ $(($num % 2)) == 0 ]
then
port=1
else
port=2
fi
fi
if [ $NODE ]; then
shortname=$NODE
else
shortname=`hostname -s`
fi
chdev -l $ib_adapter -a hostname=$shortname
mkiba -a $nicip -i $nic -A $ib_adapter -p $port -P -1 -S up -m $netmask
fi # end assume it is ib*
fi # end if AIX
done # end for nicip
done # end for nic
# echo "goodnics=$goodnics"
# Bringup all the ib interfaces
if [ $PLTFRM == "Linux" ]
then
#/sbin/service $ib_driver restart
restartservice $ib_driver
for nic in `echo "$goodnics" | tr "," "\n"|sort -u`
do
sleep 5
if [[ "$OSVER" == rhels6* ]]
then
ip link set dev $nic up
else
if [[ "$OSVER" == ubuntu14* ]]
then
interfaces="/etc/network/interfaces"
for tmp in `cat $interfaces |grep "auto ib" |sort -u|awk '{print $2}'`
do
ifdown $tmp > /dev/null 2>&1
sleep 2
ifup $tmp > /dev/null 2>&1
done
else
ifup $nic > /dev/null 2>&1
fi
fi
done
fi