git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14334 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			222 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| #(C)IBM Corp
 | |
| # 
 | |
| 
 | |
| # 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}'`
 | |
|         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=<proto>://<nfsserver_IP>/<directory>"
 | |
|     KDPATH=${DUMP#*:}
 | |
|     KDPROTO=${DUMP%:$KDPATH*}
 | |
|     
 | |
|     KDPATH=${KDPATH/\/\//}
 | |
|     KDIP=`echo $KDPATH | cut -d'/' -f1`
 | |
|     KDPATH=${KDPATH/$KDIP/}
 | |
| 
 | |
|     # if "dump=<proto>:///<directory>", 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"
 | |
|     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
 | |
|             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 "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
 | |
| 	    fi
 | |
| 	fi
 | |
|     fi
 | |
| 
 | |
|     /bin/umount -l $MOUNTPATH
 | |
| else
 | |
|     /bin/echo "The kdump server is not configured"
 | |
| fi
 | |
| 
 | |
| exit 0
 |