#!/bin/bash # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html #(C)IBM Corp # if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then str_dir_name=`dirname $0` . $str_dir_name/xcatlib.sh fi # create /etc/sysconfig/network-scripts/ 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 } for i in `/bin/cat /proc/cmdline`; do KEY=`/bin/echo $i | /bin/awk -F= '{print $1}'` if [ "$KEY" = "ifname" ]; then ifname=`/bin/echo $i | /bin/awk -F= '{print $2}'` MACX=${ifname#*:} ETHX=${ifname%:$MACX*} break elif [ "$KEY" = "netdev" ]; then ETHX=`/bin/echo $i | /bin/awk -F= '{print $2}'` MACX=`/sbin/ip link show $ETHX | /bin/grep ether | /bin/awk '{print $2}'` break elif [ "$KEY" = "BOOTIF" ]; then MACX=`/bin/echo $i | /bin/awk -F= '{print $2}'|sed -e s/^01-// -e s/-/:/g` #ETHX=`/sbin/ifconfig | /bin/grep -i $MACX | /bin/awk '{print $1}'` ETHX=`/sbin/ip -oneline link show |/bin/grep -i $MACX |/bin/awk -F ":" '{print $2}'|/bin/grep -o "[^ ]\+\( \+[^ ]\+\)*"` break fi done if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then if (pmatch $OSVER "sles*") || (pmatch $OSVER "suse*") || [ -f /etc/SuSE-release ]; then CONFFILE=$MNTDIR/etc/sysconfig/network/ifcfg-$ETHX fi if (pmatch $OSVER "fedora*") || (pmatch $OSVER "rhel6*") || (pmatch $OSVER "rhels6*") || [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ];then CONFFILE=$MNTDIR/etc/sysconfig/network-scripts/ifcfg-$ETHX fi if [ ! -e $CONFFILE ]; then /bin/touch $CONFFILE fi if (pmatch $ETHX "hf*") ; then IP=`/sbin/ifconfig $ETHX | /bin/grep -i "inet addr" | awk '{print $2}' | awk -F: '{print $2}'` MASK=`/sbin/ifconfig $ETHX | /bin/grep -i "inet addr" | awk '{print $4}' | awk -F: '{print $2}'` echo "DEVICE=$ETHX" > $CONFFILE echo "BOOTPROTO=static" >> $CONFFILE echo "HWADDR=$MACX" >> $CONFFILE echo "ONBOOT=yes" >> $CONFFILE echo "IPADDR=$IP" >> $CONFFILE echo "NETMASK=$MASK" >> $CONFFILE else echo "DEVICE=$ETHX" > $CONFFILE echo "BOOTPROTO=dhcp" >> $CONFFILE echo "HWADDR=$MACX" >> $CONFFILE echo "ONBOOT=yes" >> $CONFFILE fi fi for i in `cat /proc/cmdline`; do KEY=`echo $i | awk -F= '{print $1}'` if [ "$KEY" = "dump" ]; then DUMP=`echo $i |awk -F= '{print $2}'` if [ ! -z "$XCAT" ]; then break fi elif [ "$KEY" = "XCAT" ]; then XCAT=`echo $i |awk -F= '{print $2}'` if [ ! -z "$DUMP" ]; then break fi fi done if [ ! -z "$DUMP" ]; then # parse "dump=:///" KDPATH=${DUMP#*:} KDPROTO=${DUMP%:$KDPATH*} KDPATH=${KDPATH/\/\//} KDIP=`echo $KDPATH | cut -d'/' -f1` KDPATH=${KDPATH/$KDIP/} # if "dump=:///", use $xcatmaster as the default NFS server if [ -z $KDIP ]; then KDIP=${XCAT%:*} fi # workaround for RHEL6 # the $KDIP:$KDPATH directory will be used to generate the initrd for kdump service MOUNTPATH="" if ((pmatch $OSVER "*6\.*")); then MOUNTPATH="/tmp" elif (pmatch $OSVER "*7\.*"); then MOUNTPATH="/mnt" else MOUNTPATH="/var/tmp" fi if [ "$KDPROTO" = "nfs" ]; then if (pmatch $OSVER "sles*") || (pmatch $OSVER "suse*") || [ -f /etc/SuSE-release ]; then if (pmatch $OSVER "*10*"); then #run mkinitrd to generater the kdump-init base if (pmatch $ARCH "x86*"); then /sbin/mkinitrd -m "nfs tg3 bnx2 bnx2x e1000 e1000e igb mlx_en be2net af_packet firmware_class" else /sbin/mkinitrd -m "nfs be2net e1000e ibmveth igb firmware_class tg3 e1000" fi /bin/mkdir -p /var/tmp/tempinit cd /boot/ KDUMPINIT=`ls initrd-*-kdump` /bin/cp /boot/${KDUMPINIT} /var/tmp/tempinit/ #change to the /var/tmp/tempinit/ directory cd /var/tmp/tempinit/ /bin/zcat ${KDUMPINIT} | /bin/cpio -id /bin/rm -f ${KDUMPINIT} /bin/mkdir -p ./var/lib/dhcpcd/ /bin/mkdir -p ./lib/udev/devices/ if (pmatch $ARCH "ppc*"); then /bin/mkdir -p ./lib/power6/ /bin/mkdir -p ./lib/power7/ fi /bin/cp -r /lib/udev/devices/* ./lib/udev/devices/ for file in "/sbin/ifconfig /usr/bin/clear /bin/touch /bin/grep /sbin/dhcpcd /sbin/ip /bin/awk /bin/makedumpfile" do for line in `ldd $file` do if [ ${line:0:1} = "/" ]; then line=`echo $line | grep -v :` if [ $line ];then if [ ! -e .$line ];then /bin/cp -L $line .$line fi fi fi done /bin/cp $file "./bin/" done #modify the original init to support dump to an nfs server cat > ./bin/dumpfile << EOF #!/bin/bash if [ -e /proc/vmcore ];then /bin/touch /var/lib/dhcpcd/dhcpcd-$ETHX.info for i in 1 2 3 4 5 6 7 8 9 10 do /bin/dhcpcd $ETHX /bin/sleep 2 temp=\`/bin/ifconfig | /bin/grep inet\` if [ -n "\$temp" ]; then break fi echo -e "Failed to acquire address, retrying" done if [ -z "\$temp" ];then exit fi HOSTNAME=`hostname` /bin/mkdir /mnt /bin/mount -t nfs -o nolock ${KDIP}:${KDPATH} /mnt if [ -e /mnt/$HOSTNAME ];then /bin/rm -f /mnt/$HOSTNAME fi /bin/makedumpfile -c /proc/vmcore /mnt/$HOSTNAME /bin/umount -l /mnt /sbin/reboot -d -f fi EOF chmod a+x ./bin/dumpfile /bin/sed -i "s/^# No multipath support/ \/bin\/dumpfile\n/" ./init /bin/rm -f /boot/${KDUMPINIT} /usr/bin/find . | cpio -H newc -o|gzip -9 -c - > /boot/${KDUMPINIT} cd / /bin/rm -rf "/var/tmp/tempinit" #service kdump restart restartservice kdump else /bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH KDTEMPPATH=${KDPATH//\//\\\/} KDTEMPPATH="nfs:\/\/${KDIP}${KDTEMPPATH}\/${NODE}" sed -i "s/^KDUMP_SAVEDIR=.*$/KDUMP_SAVEDIR=\"${KDTEMPPATH}\"/" /etc/sysconfig/kdump sed -i "s/^KDUMP_COPY_KERNEL=.*$/KDUMP_COPY_KERNEL=\"no\"/" /etc/sysconfig/kdump sed -i "s/^KDUMP_PRESCRIPT=.*$/KDUMP_PRESCRIPT=\"\/tmp\/createdir\"/" /etc/sysconfig/kdump sed -i "s/^KDUMP_REQUIRED_PROGRAMS=.*$/KDUMP_REQUIRED_PROGRAMS=\"\/tmp\/createdir\"/" /etc/sysconfig/kdump TEMPDELAY=$(($RANDOM%30)) #work around for the kdump on sles 11.2 echo "/bin/mkdir -p /root/tmp/" > /tmp/createdir #following 5 lines is the work around for kdump on multiply nodes echo "/bin/sleep ${TEMPDELAY}" >> /tmp/createdir echo "/bin/mount -o nolock ${KDIP}:${KDPATH} /tmp" >> /tmp/createdir echo "/bin/mkdir -p /tmp/${NODE}" >> /tmp/createdir echo "/bin/sleep ${TEMPDELAY}" >> /tmp/createdir echo "/bin/umount /tmp" >> /tmp/createdir /bin/chmod 777 /tmp/createdir #change the mount and remount shell scripts' name, workaround for kdump on stateless node oldmount=`ls /lib/mkinitrd/boot/*-mount.sh` oldremount=`ls /lib/mkinitrd/boot/*-remount.sh` mv $oldmount ${oldmount}.bak mv $oldremount ${oldremount}.bak /etc/init.d/boot.kdump restart mv ${oldmount}.bak $oldmount mv ${oldremount}.bak $oldremount fi else if (pmatch $OSVER "rhel7*") || (pmatch $OSVER "rhels7*");then /bin/mount -o vers=3 $KDIP:$KDPATH $MOUNTPATH #/bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH [ -d $MOUNTPATH/var/crash ] || mkdir -p $MOUNTPATH/var/crash echo "nfs $KDIP:$KDPATH" > /etc/kdump.conf echo "default shell" >> /etc/kdump.conf sed -i 's/KDUMP_COMMANDLINE_APPEND="/KDUMP_COMMANDLINE_APPEND="nonodestatus /' /etc/sysconfig/kdump [ -f /etc/dracut.conf ] && mv /etc/dracut.conf /tmp/dracut.conf restartservice kdump [ -f /tmp/dracut.conf ] && mv /tmp/dracut.conf /etc/dracut.conf elif (pmatch $OSVER "fedora*") || (pmatch $OSVER "rhel6*") || (pmatch $OSVER "rhels6*") || [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ];then /bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH echo "net $KDIP:$KDPATH" > /etc/kdump.conf echo "link_delay 180" >> /etc/kdump.conf #/etc/init.d/kdump restart restartservice kdump fi fi fi /bin/umount -l $MOUNTPATH else /bin/echo "The kdump server is not configured" fi exit 0