RHEL6 statelite/less initrd support attempt
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6048 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		
							
								
								
									
										3
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/check
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/check
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| #!/bin/sh | ||||
| [ "$1" = "-d" ] && echo network | ||||
| exit 0 | ||||
							
								
								
									
										5
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/install
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/install
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| #!/bin/sh | ||||
| echo $drivers | ||||
| dracut_install wget cpio gzip | ||||
| inst "$moddir/xcatroot" "/sbin/xcatroot" | ||||
| inst_hook cmdline 10 "$moddir/xcat-cmdline.sh"  | ||||
							
								
								
									
										5
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/xcat-cmdline.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/xcat-cmdline.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| root=1 | ||||
| rootok=1 | ||||
| IFACES=eth0 #THIS WILL SOURCE FROM /procm/cmdline if genimage -i argument omitted, TODO | ||||
| netroot=xcat | ||||
| echo '[ -e $NEWROOT/proc ]' > /initqueue-finished/xcatroot.sh | ||||
							
								
								
									
										245
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/xcatroot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										245
									
								
								xCAT-server/share/xcat/netboot/rh/dracut/xcatroot
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,245 @@ | ||||
| #!/bin/sh | ||||
| NEWROOT=$3 | ||||
| if [ ! -z "$imgurl" ]; then | ||||
| 	if [ xhttp = x${imgurl%:*} ]; then | ||||
| 		NFS=0 | ||||
| 		FILENAME=${imgurl##*/} | ||||
| 		while [ ! -r "$FILENAME" ]; do | ||||
| 			echo Getting $imgurl... | ||||
| 			if ! wget $imgurl; then | ||||
| 				rm -f $FILENAME | ||||
| 				sleep 27 | ||||
| 			fi | ||||
| 		done | ||||
| 	elif [ xnfs = x${imgurl%:*} ]; then | ||||
| 		NFS=1 | ||||
| 		SERVER=${imgurl#nfs:} | ||||
| 		SERVER=${SERVER#/} | ||||
| 		SERVER=${SERVER#/} | ||||
| 		ROOTDIR=$SERVER | ||||
| 		SERVER=${SERVER%%/*} | ||||
| 		SERVER=${SERVER%:} | ||||
| 		ROOTDIR=/${ROOTDIR#*/}  | ||||
| 	fi | ||||
| elif [ ! -z "$nfsroot" ]; then #fyi, done this way to tolerate nfs:// | ||||
| 	NFSROOT=1 | ||||
| 	SERVER=${nfsroot} | ||||
| 	ROOTDIR=$SERVER | ||||
| 	SERVER=${SERVER%%/*} | ||||
| 	SERVER=${SERVER%:} | ||||
| 	ROOTDIR=/${ROOTDIR#*/}  | ||||
| elif [ ! -z $statemnt ]; then #btw, uri style might have left future options other than nfs open, will use // to detect uri in the future I guess | ||||
| 	NFSROOT=1 | ||||
| 	SNAPSHOTSERVER=${statemnt%:*} | ||||
| 	SNAPSHOTROOT=${statemnt#*/} | ||||
| 	# may be that there is not server and just a directory. | ||||
| 	if [ -z $SNAPSHOTROOT ] | ||||
| 	then | ||||
| 		SNAPSHOTROOT=$SNAPSHOTSERVER | ||||
| 		SNAPSHOTSERVER= | ||||
| 	fi | ||||
| fi | ||||
|  | ||||
| #echo 0 > /proc/sys/vm/zone_reclaim_mode #Avoid kernel bug | ||||
|  | ||||
| if [ "$NFSROOT" = "1" ]; then | ||||
| 	echo Setting up Statelite | ||||
| 	mkdir -p $NEWROOT | ||||
|  	MAXTRIES=7 | ||||
| 	ITER=0 | ||||
| 	#ME=`hostname` | ||||
| 	while ! mount.nfs ${SERVER}:${ROOTDIR}/rootimg $NEWROOT -r -n -o nolock,rsize=32768,tcp,nfsvers=3,timeo=14 | ||||
| 	do | ||||
| 		ITER=$(expr $ITER + 1) | ||||
| 		if [ "$ITER" == "$MAXTRIES" ] | ||||
|       		then | ||||
| 				echo "Failed mounting nfs" | ||||
| 				echo "Possible problems: | ||||
| 1.  This initrd wasn't created for statelite node?  rerun genimage with the -m statelite flag, then rerun 'nodeset $ME statelite' | ||||
| 2.  Is DNS set up?  Maybe that's why I can't mount ${SERVER}. | ||||
| 3.  The nfs modules aren't set right in this initfs?" | ||||
|      | ||||
| 			/bin/dash | ||||
| 			exit | ||||
| 		fi | ||||
| 		echo "Could not mount $SERVER:$ROOTDIR on $NEWROOT $RESET" | ||||
| 		RS=30 #`expr $RANDOM % 30` | ||||
| 		echo -e "Trying again in $RS seconds" | ||||
| 		sleep $RS | ||||
| 	done | ||||
|  | ||||
| # now we need to mount the rest of the system.  This is the read/write portions | ||||
| #echo "Mounting Snapshot directories" | ||||
|  | ||||
| 	if [ ! -e "$NEWROOT/$RWDIR" ] | ||||
| 	then | ||||
| 		echo "" | ||||
| 		echo "This NFS root directory doesn't have a /$RWDIR directory for me to mount a rw filesystem.  You'd better create it... ${NORMAL}" | ||||
| 		echo "." | ||||
| 		/bin/dash | ||||
| 	fi | ||||
|  | ||||
| 	while [ ! -e "$NEWROOT/etc/init.d/statelite" ] | ||||
| 	do | ||||
| 		echo "" | ||||
| 		echo "$NEWROOT/etc/init.d/statelite doesn't exist.  Perhaps you didn't create this image with the -m statelite mode" | ||||
| 		echo "" | ||||
| 		/bin/dash | ||||
| 	done | ||||
| 	grep '\(shell\)' /proc/cmdline >/dev/null && /bin/dash | ||||
| 	mount -t tmpfs rw  -o mode= $NEWROOT/$RWDIR | ||||
| 	mkdir -p $NEWROOT/$RWDIR/tmpfs | ||||
|  | ||||
|  | ||||
| 	# mount the SNAPSHOT directory here for persistent use. | ||||
| 	if [ ! -z $SNAPSHOTSERVER ] | ||||
| 	then | ||||
| 		mkdir -p $NEWROOT/$RWDIR/persistent | ||||
|  		MAXTRIES=5 | ||||
| 		ITER=0 | ||||
| 		while ! mount $SNAPSHOTSERVER:$SNAPSHOTROOT  $NEWROOT/$RWDIR/persistent -o nolock,rsize=32768,tcp,nfsvers=3,timeo=14 | ||||
| 		do | ||||
| 			ITER=$(expr $ITER + 1) | ||||
| 			if [ "$ITER" == "$MAXTRIES" ] | ||||
|       			then | ||||
| 				echo "You're dead.  rpower $ME boot to play again." | ||||
| 				echo "Possible problems: | ||||
| 1.  $SNAPSHOTSERVER is not exporting $SNAPSHOTROOT ? | ||||
| 2.  Is DNS set up?  Maybe that's why I can't mount $SNAPSHOTSERVER." | ||||
| 				shell | ||||
| 				exit | ||||
| 			fi | ||||
| 			echo "Can't mount $SNAPSHOTSERVER:$SNAPSHOTROOT. ${NORMAL}" | ||||
| 			RS=45 #`expr $RANDOM % 20` | ||||
| 			echo "Trying again in $RS seconds" | ||||
| 			sleep $RS	 | ||||
| 		done | ||||
| 	fi | ||||
|  | ||||
| 	grep '\(shell\)' /proc/cmdline >/dev/null && /bin/dash | ||||
|  | ||||
| 	# have to preserve the initial DHCP request.  So we link it. | ||||
|  | ||||
| 	if [ ! -d $NEWROOT/$RWDIR/tmpfs/var/lib/dhclient ] | ||||
| 	then | ||||
| 		mkdir -p $NEWROOT/$RWDIR/tmpfs/var/lib/dhclient | ||||
| 	fi | ||||
| 	if [ ! -d $NEWROOT/$RWDIR/tmpfs/var/lib/dhcp ] | ||||
| 	then | ||||
| 		mkdir -p $NEWROOT/$RWDIR/tmpfs/var/lib/dhcp | ||||
| 	fi | ||||
|  | ||||
| 	[ -e /etc/ntp.conf ] && mkdir -p $NEWROOT/$RWDIR/tmpfs/etc && cp /etc/ntp.conf $NEWROOT/$RWDIR/tmpfs/etc/  | ||||
|  | ||||
| 	 | ||||
| 	[ -e /etc/ntp/step-kickers ] && mkdir -p $NEWROOT/$RWDIR/tmpfs/etc/ntp && cp /etc/ntp/step-kickers $NEWROOT/$RWDIR/tmpfs/etc/ntp  | ||||
|  | ||||
| 	 | ||||
| 	[ -e /etc/resolv.conf ] && mkdir -p $NEWROOT/$RWDIR/tmpfs/etc && cp /etc/resolv.conf $NEWROOT/$RWDIR/tmpfs/etc/  | ||||
|  | ||||
| 	# now that everything is mounted, lets do this | ||||
| 	# hmmm, apparently I'm checking this twice... so I'd better | ||||
| 	# be really sure the file is there. | ||||
| 	while [ -z $NEWROOT/etc/init.d/statelite ] | ||||
| 	do | ||||
| 		echo "$NEWROOT/etc/init.d/statelite does not exist in image!" | ||||
| 		/bin/dash | ||||
| 	done | ||||
|  | ||||
| 	# do all the mounts: | ||||
| 	$NEWROOT/etc/init.d/statelite	 | ||||
|  | ||||
| 	# give the debug shell just before we go if specified! | ||||
| 	grep '(shell)' /proc/cmdline > /dev/null && dash | ||||
|  | ||||
| 	echo 0x100 > /proc/sys/kernel/real-root-dev | ||||
| 	keep_old_ip=yes | ||||
| 	export keep_old_ip | ||||
| 	fastboot=yes | ||||
| 	export fastboot | ||||
| 	READONLY=yes | ||||
| 	export READONLY | ||||
| 	grep '\(shell\)' /proc/cmdline >/dev/null && /bin/dash | ||||
| 	mount -n --bind /dev $NEWROOT/dev | ||||
| 	umount /sys | ||||
| 	umount /proc | ||||
|  | ||||
| fi | ||||
| # END NFSROOT/Statelite code | ||||
|  | ||||
| # RAM root Hybrid with NFS root | ||||
| if [ "$NFS" = "1" ]; then | ||||
|   echo Setting up nfs with ram overlay. | ||||
|   mknod /dev/loop0 b 7 0 | ||||
|   mkdir -p /ro | ||||
|   mkdir -p /rw | ||||
|   #NOTE: should prob have max count | ||||
|   while [ ! -d /ro/bin ]; do | ||||
|     echo mounting $SERVER:$ROOTDIR on /ro | ||||
|     mount.nfs $SERVER:$ROOTDIR /ro -r -n -o nolock,rsize=32768,tcp,nfsvers=3,timeo=14 | ||||
|     ST=`expr $RANDOM % 5` | ||||
|     sleep $ST | ||||
|   done | ||||
|   mount -t tmpfs rw /rw | ||||
|   mkdir -p /rw/etc | ||||
|   mkdir -p /rw/var/lib/dhclient | ||||
|   cp /etc/resolv.conf /rw/etc/ | ||||
|   mount -t aufs -o dirs=/rw:/ro mergedroot  $NEWROOT | ||||
|   mkdir -p $NEWROOT/ro | ||||
|   mkdir -p $NEWROOT/rw | ||||
|   mount --move /ro $NEWROOT/ro | ||||
|   mount --move /rw $NEWROOT/rw | ||||
|   cp /etc/resolv.conf $NEWROOT/etc/ | ||||
|   echo xcatfs / aufs rw,_netdev 0 0 >> $NEWROOT/etc/fstab | ||||
| elif [ -r /rootimg.sfs ]; then | ||||
|   echo Setting up squashfs with ram overlay. | ||||
|   mknod /dev/loop0 b 7 0 | ||||
|   mkdir -p /ro | ||||
|   mkdir -p /rw | ||||
|   mount -t squashfs /rootimg.sfs /ro | ||||
|   mount -t tmpfs rw /rw | ||||
|   mount -t aufs -o dirs=/rw:/ro mergedroot $NEWROOT | ||||
|   mkdir -p $NEWROOT/ro | ||||
|   mkdir -p $NEWROOT/rw | ||||
|   mount --move /ro $NEWROOT/ro | ||||
|   mount --move /rw $NEWROOT/rw | ||||
| elif [ -r /rootimg.gz ]; then | ||||
| echo Setting up RAM-root tmpfs. | ||||
|   mount -t tmpfs rootfs $NEWROOT | ||||
|   cd $NEWROOT | ||||
|   echo -n "Extracting root filesystem:" | ||||
|   if [ -x /bin/cpio ]; then | ||||
|   gzip -cd /rootimg.gz |/bin/cpio -idum | ||||
|   else | ||||
|   gzip -cd /rootimg.gz |cpio -idum | ||||
|   fi | ||||
|   echo Done | ||||
| else | ||||
|   echo -n Failed to download image, panicing in 5... | ||||
|   for i in 4 3 2 1 0; do | ||||
|     /bin/sleep 1 | ||||
|     echo -n $i... | ||||
|   done | ||||
|   echo | ||||
|   echo "You're dead.  rpower nodename reset to play again. | ||||
|  | ||||
| * Did you packimage with -m cpio, -m squashfs, or -m nfs? | ||||
| * If using -m squashfs did you include aufs.ko with geninitrd? | ||||
|   e.g.:  -n tg3,squashfs,aufs,loop | ||||
| * If using -m nfs did you export NFS and sync rootimg?  And | ||||
|   did you include the aufs and nfs modules in the proper order: | ||||
|   e.g.:  -n tg3,aufs,loop,sunrpc,lockd,nfs_acl,nfs | ||||
|  | ||||
| " | ||||
|   /bin/dash | ||||
|   exit | ||||
| fi | ||||
| cd / | ||||
| if [ -d "$NEWROOT/etc/sysconfig" && ! -e "$NEWROOT/etc/sysconfig/selinux" ]; then | ||||
| 	echo "SELINUX=disabled" >> "$NEWROOT/etc/sysconfig/selinux" | ||||
| fi | ||||
|  | ||||
| # inject new exit_if_exists | ||||
| echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm "$job"' > /initqueue/xcat.sh | ||||
| # force udevsettle to break | ||||
| > /initqueue/work | ||||
| @@ -396,6 +396,9 @@ while (scalar @checkdeps) { | ||||
| } | ||||
| close($moddeps); | ||||
| unlink "/tmp/genimage.$$.yum.conf"; | ||||
| if (-d "$rootimg_dir/usr/share/dracut") { | ||||
|     $dracutmode=1; | ||||
| } | ||||
|  | ||||
| #-- run postinstall script | ||||
| if (!$imagename) { | ||||
| @@ -442,7 +445,11 @@ if($mode eq "statelite"){ | ||||
|  | ||||
|  | ||||
|  | ||||
| mkinitrd(); | ||||
| if ($dracutmode) { | ||||
|     mkinitrd_dracut(); | ||||
| } else { | ||||
|     mkinitrd(); | ||||
| } | ||||
|  | ||||
| sub getlibs { | ||||
| 	my $file = shift; | ||||
| @@ -466,6 +473,15 @@ sub getlibs { | ||||
|    } | ||||
| } | ||||
|  | ||||
| sub mknitrd_dracut { | ||||
|     mkpath("$rootimg_dir/usr/share/dracut/modules.d/97xcat"); | ||||
|     foreach (<$fullpath/dracut/*>) { | ||||
|         copy($_,"$rootimg_dir/usr/share/dracut/modules.d/97xcat"); | ||||
|     } | ||||
|     system("chroot '$rootimg_dir' dracut -d '".join(' ',@ndrivers)."' -m 'xcat base' /tmp/initrd.$$.gz") | ||||
|     move("$rootimg_dir/tmp/initrd.$$.gz","$destdir/initrd.gz"); | ||||
| } | ||||
|  | ||||
| sub mkinitrd { | ||||
| 	mkpath("/tmp/xcatinitrd.$$/bin"); | ||||
| 	if($basekernelver eq $kernelver) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user