ubuntu: genimage fixes
- stateless requires busybox (see artifact 3522447 for more details) - initial work on dracut committed, not sure if this is going to work yet, as ubuntu doesn't have dracut by default - changed linux-image-generic to linux-image-server, and removed busybox-static as that didn't exist git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@12399 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -2,7 +2,7 @@ bash
 | 
			
		||||
nfs-common
 | 
			
		||||
openssl
 | 
			
		||||
dhcp3-client
 | 
			
		||||
linux-image-generic
 | 
			
		||||
linux-image-server
 | 
			
		||||
openssh-server 
 | 
			
		||||
openssh-client
 | 
			
		||||
wget
 | 
			
		||||
@@ -10,4 +10,3 @@ vim
 | 
			
		||||
ntp
 | 
			
		||||
rsyslog
 | 
			
		||||
rsync
 | 
			
		||||
busybox-static
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/check
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/check
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
[ "$1" = "-d" ] && echo network
 | 
			
		||||
exit 0
 | 
			
		||||
							
								
								
									
										7
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/install.netboot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/install.netboot
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
echo $drivers
 | 
			
		||||
dracut_install wget cpio gzip dash  modprobe touch echo cut wc
 | 
			
		||||
dracut_install grep ifconfig hostname awk egrep grep dirname expr
 | 
			
		||||
dracut_install mount.nfs
 | 
			
		||||
inst "$moddir/xcatroot" "/sbin/xcatroot"
 | 
			
		||||
inst_hook cmdline 10 "$moddir/xcat-cmdline.sh" 
 | 
			
		||||
							
								
								
									
										5
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/install.statelite
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										5
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/install.statelite
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
echo $drivers
 | 
			
		||||
dracut_install wget cpio gzip dash  modprobe wc touch echo cut
 | 
			
		||||
dracut_install grep ifconfig hostname awk egrep grep dirname expr
 | 
			
		||||
inst_hook pre-pivot 5 "$moddir/xcat-prepivot.sh"
 | 
			
		||||
							
								
								
									
										2
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/installkernel
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/installkernel
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
instmods nfs sunrpc
 | 
			
		||||
@@ -0,0 +1,4 @@
 | 
			
		||||
root=1
 | 
			
		||||
rootok=1
 | 
			
		||||
netroot=xcat
 | 
			
		||||
echo '[ -e $NEWROOT/proc ]' > /initqueue-finished/xcatroot.sh
 | 
			
		||||
							
								
								
									
										89
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/xcat-prepivot.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										89
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/xcat-prepivot.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
NEWROOT=/sysroot
 | 
			
		||||
SERVER=${SERVER%%/*}
 | 
			
		||||
SERVER=${SERVER%:}
 | 
			
		||||
RWDIR=.statelite
 | 
			
		||||
if [ ! -z $STATEMNT ]; then #btw, uri style might have left future options other than nfs open, will u    se // to detect uri in the future I guess
 | 
			
		||||
    SNAPSHOTSERVER=${STATEMNT%:*}
 | 
			
		||||
    SNAPSHOTROOT=${STATEMNT#*/}
 | 
			
		||||
    #echo $SNAPSHOTROOT
 | 
			
		||||
    #echo $SNAPSHOTSERVER
 | 
			
		||||
    # may be that there is not server and just a directory.
 | 
			
		||||
    if [ -z $SNAPSHOTROOT ]; then
 | 
			
		||||
        SNAPSHOTROOT=$SNAPSHOTSERVER
 | 
			
		||||
        SNAPSHOTSERVER=
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo Setting up Statelite
 | 
			
		||||
mkdir -p $NEWROOT
 | 
			
		||||
 | 
			
		||||
# now we need to mount the rest of the system.  This is the read/write portions
 | 
			
		||||
# echo Mounting snapshot directories
 | 
			
		||||
 | 
			
		||||
MAXTRIES=7
 | 
			
		||||
ITER=0
 | 
			
		||||
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... "
 | 
			
		||||
    echo ""
 | 
			
		||||
    /bin/sh
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ ! -e "$NEWROOT/etc/init.d/statelite" ]; then
 | 
			
		||||
    echo ""
 | 
			
		||||
    echo "$NEWROOT/etc/init.d/statelite doesn't exist.  Perhaps you didn't create this image with th    e -m statelite mode"
 | 
			
		||||
    echo ""
 | 
			
		||||
    /bin/sh
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mount -t tmpfs rw $NEWROOT/$RWDIR
 | 
			
		||||
mkdir -p $NEWROOT/$RWDIR/tmpfs
 | 
			
		||||
ME=`hostname`
 | 
			
		||||
 | 
			
		||||
# mount the SNAPSHOT directory here for persistent use.
 | 
			
		||||
if [ ! -z $SNAPSHOTSERVER ]; then
 | 
			
		||||
    mkdir -p $NEWROOT/$RWDIR/persistent
 | 
			
		||||
    MAXTRIES=5
 | 
			
		||||
    ITER=0
 | 
			
		||||
    if [ -z $MNTOPTS ]; then
 | 
			
		||||
        MNT_OPTIONS="nolock,rsize=32768,tcp,nfsvers=3,timeo=14"
 | 
			
		||||
    else
 | 
			
		||||
        MNT_OPTIONS=$MNTOPTS
 | 
			
		||||
    fi
 | 
			
		||||
    while ! mount $SNAPSHOTSERVER:/$SNAPSHOTROOT  $NEWROOT/$RWDIR/persistent -o $MNT_OPTIONS; do
 | 
			
		||||
        ITER=$(( ITER + 1 ))
 | 
			
		||||
        if [ "$ITER" == "$MAXTRIES" ]; then
 | 
			
		||||
            echo "Your are 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."
 | 
			
		||||
            /bin/sh
 | 
			
		||||
            exit
 | 
			
		||||
        fi
 | 
			
		||||
        RS= $(( $RANDOM % 20 ))
 | 
			
		||||
        echo "Trying again in $RS seconds..."
 | 
			
		||||
        sleep $RS
 | 
			
		||||
    done
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# TODO: handle the dhclient/resolv.conf/ntp, etc
 | 
			
		||||
$NEWROOT/etc/init.d/statelite
 | 
			
		||||
READONLY=yes
 | 
			
		||||
export READONLY
 | 
			
		||||
fastboot=yes
 | 
			
		||||
export fastboot
 | 
			
		||||
keep_old_ip=yes
 | 
			
		||||
export keep_old_ip
 | 
			
		||||
mount -n --bind /dev $NEWROOT/dev
 | 
			
		||||
mount -n --bind /proc $NEWROOT/proc
 | 
			
		||||
mount -n --bind /sys $NEWROOT/sys
 | 
			
		||||
 | 
			
		||||
if [ -d "$NEWROOT/etc/sysconfig" -a ! -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
 | 
			
		||||
							
								
								
									
										192
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/xcatroot
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										192
									
								
								xCAT-server/share/xcat/netboot/ubuntu/dracut/xcatroot
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,192 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
NEWROOT=$3
 | 
			
		||||
RWDIR=.statelite
 | 
			
		||||
XCATMASTER=$XCAT
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
fi
 | 
			
		||||
#echo 0 > /proc/sys/vm/zone_reclaim_mode #Avoid kernel bug
 | 
			
		||||
 | 
			
		||||
if [ -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 -o mode=755 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
 | 
			
		||||
elif [ -r /rootimg-statelite.gz ]; then
 | 
			
		||||
  echo Setting up RAM-root tmpfs for statelite mode.
 | 
			
		||||
  mount -t tmpfs -o mode=755 rootfs $NEWROOT
 | 
			
		||||
  cd $NEWROOT
 | 
			
		||||
  echo -n "Extracting root filesystem:"
 | 
			
		||||
  if [ -x /bin/cpio ]; then
 | 
			
		||||
    gzip -cd /rootimg-statelite.gz |/bin/cpio -idum
 | 
			
		||||
  else
 | 
			
		||||
    gzip -cd /rootimg-statelite.gz |cpio -idum
 | 
			
		||||
  fi
 | 
			
		||||
  echo Done
 | 
			
		||||
  # then, the statelite staffs will be processed
 | 
			
		||||
  echo Setting up Statelite 
 | 
			
		||||
  modprobe nfs
 | 
			
		||||
  MAXTRIES=7
 | 
			
		||||
  ITER=0
 | 
			
		||||
  if [ ! -e "$NEWROOT/$RWDIR" ]; then
 | 
			
		||||
    echo ""
 | 
			
		||||
    echo "The /$RWDIR directory doesn't exist in the rootimg... "
 | 
			
		||||
    echo ""
 | 
			
		||||
    /bin/sh
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ ! -e "$NEWROOT/etc/init.d/statelite" ]; then
 | 
			
		||||
    echo ""
 | 
			
		||||
    echo "$NEWROOT/etc/init.d/statelite doesn't exist... "
 | 
			
		||||
    echo ""
 | 
			
		||||
    /bin/sh
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  mount -t tmpfs rw $NEWROOT/$RWDIR
 | 
			
		||||
  mkdir -p $NEWROOT/$RWDIR/tmpfs
 | 
			
		||||
  ME=`hostname`
 | 
			
		||||
 | 
			
		||||
  # mount the SNAPSHOT directory here for persistent use.
 | 
			
		||||
  if [ ! -z $STATEMNT ]; then
 | 
			
		||||
    SNAPSHOTSERVER=${STATEMNT%:*}
 | 
			
		||||
    SNAPSHOTROOT=${STATEMNT#*/}
 | 
			
		||||
    if [ -z $SNAPSHOTROOT ]; then
 | 
			
		||||
        SNAPSHOTROOT=$SNAPSHOTSERVER
 | 
			
		||||
        SNAPSHOTSERVER=
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ ! -z $SNAPSHOTSERVER ]; then
 | 
			
		||||
    mkdir -p $NEWROOT/$RWDIR/persistent
 | 
			
		||||
    MAXTRIES=5
 | 
			
		||||
    ITER=0
 | 
			
		||||
	if [ -z $MNTOPTS ]; then
 | 
			
		||||
		MNT_OPTIONS="nolock,rsize=32768,tcp,timeo=14"
 | 
			
		||||
	else
 | 
			
		||||
		MNT_OPTIONS=$MNTOPTS
 | 
			
		||||
	fi
 | 
			
		||||
    while ! mount $SNAPSHOTSERVER:/$SNAPSHOTROOT $NEWROOT/$RWDIR/persistent -o $MNT_OPTIONS; do
 | 
			
		||||
        ITER=$(( ITER + 1 ))
 | 
			
		||||
        if [ "$ITER" == "$MAXTRIES" ]; then
 | 
			
		||||
            echo "You are 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."
 | 
			
		||||
            /bin/sh
 | 
			
		||||
            exit
 | 
			
		||||
        fi
 | 
			
		||||
        RS=$(( $RANDOM % 20 ))
 | 
			
		||||
        echo "Trying again in $RS seconds ..."
 | 
			
		||||
        sleep $RS
 | 
			
		||||
    done
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  $NEWROOT/etc/init.d/statelite
 | 
			
		||||
  fastboot=yes
 | 
			
		||||
  export fastboot
 | 
			
		||||
  keep_old_ip=yes
 | 
			
		||||
  export keep_old_ip
 | 
			
		||||
 | 
			
		||||
  mount -n --bind /dev $NEWROOT/dev
 | 
			
		||||
  mount -n --bind /proc $NEWROOT/proc
 | 
			
		||||
  mount -n --bind /sys $NEWROOT/sys
 | 
			
		||||
 | 
			
		||||
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 [ -z $STATEMNT ]; then
 | 
			
		||||
  for lf in /tmp/dhclient.*.lease; do
 | 
			
		||||
    netif=${lf#*.}
 | 
			
		||||
    netif=${netif%.*}
 | 
			
		||||
    cp $lf  "$NEWROOT/var/lib/dhclient/dhclient-$netif.leases"
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ ! -z "$ifname" ]; then
 | 
			
		||||
    MACX=${ifname#*:}
 | 
			
		||||
    ETHX=${ifname%:$MACX*}
 | 
			
		||||
  elif [ ! -z "$netdev" ]; then
 | 
			
		||||
    ETHX=$netdev
 | 
			
		||||
    MACX=`ip link show $netdev | grep ether | awk '{print $2}'`
 | 
			
		||||
  elif [ ! -z "$BOOTIF" ]; then
 | 
			
		||||
    MACX=$BOOTIF
 | 
			
		||||
    ETHX=`ifconfig |grep -i $BOOTIF | awk '{print $1}'`
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then
 | 
			
		||||
    if [ ! -e $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX ]; then
 | 
			
		||||
        touch $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
			
		||||
    fi
 | 
			
		||||
    echo "DEVICE=$ETHX" > $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
			
		||||
    echo "BOOTPROTO=dhcp" >> $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
			
		||||
    echo "HWADDR=$MACX" >> $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
			
		||||
    echo "ONBOOT=yes" >> $NEWROOT/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cp /etc/resolv.conf "$NEWROOT/etc/"
 | 
			
		||||
 | 
			
		||||
if [ -d "$NEWROOT/etc/sysconfig" -a ! -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
 | 
			
		||||
@@ -11,6 +11,7 @@ use File::Copy;
 | 
			
		||||
use File::Find;
 | 
			
		||||
use Getopt::Long;
 | 
			
		||||
use Cwd qw(realpath);
 | 
			
		||||
use xCAT::Utils;
 | 
			
		||||
#use strict;
 | 
			
		||||
Getopt::Long::Configure("bundling");
 | 
			
		||||
Getopt::Long::Configure("pass_through");
 | 
			
		||||
@@ -18,7 +19,6 @@ Getopt::Long::Configure("pass_through");
 | 
			
		||||
my $prinic; #TODO be flexible on node primary nic
 | 
			
		||||
my $othernics; #TODO be flexible on node primary nic
 | 
			
		||||
my $netdriver;
 | 
			
		||||
my @yumdirs;
 | 
			
		||||
my $arch;
 | 
			
		||||
my %libhash;
 | 
			
		||||
my @filestoadd;
 | 
			
		||||
@@ -56,6 +56,7 @@ my $prompt;
 | 
			
		||||
 | 
			
		||||
sub xdie {
 | 
			
		||||
   system("rm -rf /tmp/xcatinitrd.$$");
 | 
			
		||||
   umount_chroot($rootimg_dir);
 | 
			
		||||
   die @_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -187,7 +188,7 @@ unless ($onlyinitrd) {
 | 
			
		||||
 | 
			
		||||
   my $fd;
 | 
			
		||||
   open($fd,">>","$rootimg_dir/etc/fstab");
 | 
			
		||||
   print $fd "#Dummy fstab for rpm postscripts to see\n";
 | 
			
		||||
   print $fd "#Dummy fstab for dpkg postscripts to see\n";
 | 
			
		||||
   close($fd);
 | 
			
		||||
 | 
			
		||||
   my $non_interactive;
 | 
			
		||||
@@ -198,14 +199,9 @@ unless ($onlyinitrd) {
 | 
			
		||||
   #print "$index\n";
 | 
			
		||||
   my $dist = $line[@line-1];
 | 
			
		||||
 | 
			
		||||
   my $aptcmd = "chroot $rootimg_dir apt-get update && chroot $rootimg_dir apt-get $non_interactive ";
 | 
			
		||||
   my $aptcmd1 = "debootstrap";
 | 
			
		||||
   my $aptcmd2 = "--arch $uarch $dist $rootimg_dir file://$installroot/$osver/$arch/";
 | 
			
		||||
   #foreach (0..$repnum) {
 | 
			
		||||
   #   $yumcmd .= "--enablerepo=$osver-$arch-$_ ";
 | 
			
		||||
   #}
 | 
			
		||||
   
 | 
			
		||||
   #yumcmd .= "install ";
 | 
			
		||||
   #mkpath("$rootimg_dir/var/lib/yum");
 | 
			
		||||
 | 
			
		||||
   if (!$imagename) {
 | 
			
		||||
       $pkglist= get_profile_def_filename($customdir,"pkglist");
 | 
			
		||||
@@ -240,6 +236,13 @@ unless ($onlyinitrd) {
 | 
			
		||||
       }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   mount_chroot($rootimg_dir);
 | 
			
		||||
 | 
			
		||||
   # Add the local repo from MN temporarily for apt-get update/upgrade
 | 
			
		||||
   open($aptconfig,">","$rootimg_dir/etc/apt/sources.list");
 | 
			
		||||
   print $aptconfig "deb file://$installroot/$osver/$arch/ $dist main\n";
 | 
			
		||||
   close($aptconfig);
 | 
			
		||||
   
 | 
			
		||||
   #Now let's handle extra packages
 | 
			
		||||
    if (!$imagename) {
 | 
			
		||||
	$otherpkglist=get_profile_def_filename($customdir, "otherpkgs.pkglist");
 | 
			
		||||
@@ -253,57 +256,50 @@ unless ($onlyinitrd) {
 | 
			
		||||
    my %extrapkgnames; 
 | 
			
		||||
 | 
			
		||||
    if (keys(%extra_hash) > 0) {
 | 
			
		||||
      open($yumconfig,">>","/tmp/genimage.$$.yum.conf");
 | 
			
		||||
      open($aptconfig,">>","$rootimg_dir/etc/apt/sources.list.d/genimage.$$.apt.list");
 | 
			
		||||
      my $index=1;
 | 
			
		||||
      foreach $pass (sort (keys(%extra_hash))) {
 | 
			
		||||
        foreach (keys(%{$extra_hash{$pass}})) {
 | 
			
		||||
	  if (($_ eq "PRE_REMOVE") || ($_ eq "POST_REMOVE")) { next;} 
 | 
			
		||||
	  print $yumconfig "[otherpkgs$index]\nname=otherpkgs$index\nbaseurl=file://$srcdir_otherpkgs/$_\ngpgpcheck=0\n\n";
 | 
			
		||||
	  print $aptconfig "deb file://$srcdir_otherpkgs/$_ . /";
 | 
			
		||||
	  $index++;
 | 
			
		||||
	  my $pa=$extra_hash{$pass}{$_};
 | 
			
		||||
	  $extrapkgnames{$pass} .= " " . join(' ', @$pa);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      close($yumconfig);
 | 
			
		||||
      close($aptconfig);
 | 
			
		||||
      $index--;
 | 
			
		||||
      $yumcmd = "yum $non_interactive -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir/ --disablerepo=* ";
 | 
			
		||||
      foreach (0..$repnum) {
 | 
			
		||||
	  $yumcmd .= "--enablerepo=$osver-$arch-$_ ";
 | 
			
		||||
      }
 | 
			
		||||
      for (1..$index) {
 | 
			
		||||
	  $yumcmd .= "--enablerepo=otherpkgs$_ ";
 | 
			
		||||
      } 
 | 
			
		||||
 | 
			
		||||
      foreach $pass (sort (keys(%extra_hash))) {
 | 
			
		||||
      #remove the packages that are specified in the otherpkgs.list files with leading '-'
 | 
			
		||||
          my $yumcmd_remove= "$yumcmd erase ";
 | 
			
		||||
          my $aptcmd_remove= "$aptcmd remove ";
 | 
			
		||||
          if (exists ($extra_hash{$pass}{'PRE_REMOVE'})) {
 | 
			
		||||
	      my $pa=$extra_hash{$pass}{'PRE_REMOVE'};
 | 
			
		||||
	      my $rm_packges= join(' ', @$pa);
 | 
			
		||||
	      if ($rm_packges) {
 | 
			
		||||
                  print "$yumcmd_remove $rm_packges\n";
 | 
			
		||||
	          $rc = system("$yumcmd_remove $rm_packges");
 | 
			
		||||
                  print "$aptcmd_remove $rm_packges\n";
 | 
			
		||||
	          $rc = system("$aptcmd_remove $rm_packges\"");
 | 
			
		||||
	      }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      #install extra packages
 | 
			
		||||
          my $yumcmd_base = $yumcmd;
 | 
			
		||||
          $yumcmd .= "install ";
 | 
			
		||||
          #append extra pkg names to yum command 
 | 
			
		||||
          my $aptcmd_base = $aptcmd;
 | 
			
		||||
          $aptcmd .= "install ";
 | 
			
		||||
          #append extra pkg names to apt-get command 
 | 
			
		||||
          if ($extrapkgnames{$pass}) {
 | 
			
		||||
	      $yumcmd .= " $extrapkgnames{$pass} ";
 | 
			
		||||
	      $aptcmd .= " $extrapkgnames{$pass} ";
 | 
			
		||||
          }   
 | 
			
		||||
          $yumcmd =~ s/ $/\n/;
 | 
			
		||||
          $aptcmd =~ s/ $/\n/;
 | 
			
		||||
    
 | 
			
		||||
          #debug
 | 
			
		||||
          print "yumcmd=$yumcmd\n";
 | 
			
		||||
          #my $repo=`cat /tmp/genimage.$$.yum.conf`;
 | 
			
		||||
          print "aptcmd=$aptcmd\n";
 | 
			
		||||
          #my $repo=`cat $rootimg_dir/etc/sources.list.d/genimage.$$.apt.list`;
 | 
			
		||||
          #print "repo=$repo";
 | 
			
		||||
      
 | 
			
		||||
          my $rc = system($yumcmd);
 | 
			
		||||
          my $rc = system("$aptcmd\"");
 | 
			
		||||
          if ($rc) { 
 | 
			
		||||
	      print "yum invocation failed\n";
 | 
			
		||||
	      print "apt-get invocation failed\n";
 | 
			
		||||
	      exit 1;
 | 
			
		||||
          }
 | 
			
		||||
	
 | 
			
		||||
@@ -312,19 +308,26 @@ unless ($onlyinitrd) {
 | 
			
		||||
	      my $pa=$extra_hash{$pass}{'POST_REMOVE'};
 | 
			
		||||
	      my $rm_packges= join(' ', @$pa);
 | 
			
		||||
	      if ($rm_packges) {
 | 
			
		||||
                  print "$yumcmd_remove $rm_packges\n";
 | 
			
		||||
	          $rc = system("$yumcmd_remove $rm_packges");
 | 
			
		||||
                  print "$aptcmd_remove $rm_packges\n";
 | 
			
		||||
	          $rc = system("$aptcmd_remove $rm_packges");
 | 
			
		||||
	      }
 | 
			
		||||
          }
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   # run yum update to update any installed rpms
 | 
			
		||||
   # run apt-get upgrade to update any installed debs
 | 
			
		||||
   # needed when running genimage again after updating software in repositories
 | 
			
		||||
   my $yumcmd_update = $yumcmd_base . " update  ";
 | 
			
		||||
   $rc = system("$yumcmd_update");
 | 
			
		||||
   my $aptcmd_update = $aptcmd . " upgrade  ";
 | 
			
		||||
   print "$aptcmd_update\n";
 | 
			
		||||
   $rc = system("$aptcmd_update");
 | 
			
		||||
   umount_chroot($rootimg_dir);
 | 
			
		||||
   # ignore any return code
 | 
			
		||||
 | 
			
		||||
   # Add the local repo from MN
 | 
			
		||||
   my $master = xCAT::Utils->get_site_Master();
 | 
			
		||||
   open($aptconfig,">","$rootimg_dir/etc/apt/sources.list");
 | 
			
		||||
   print $aptconfig "deb http://$master$installroot/$osver/$arch/ $dist main\n";
 | 
			
		||||
   close($aptconfig);
 | 
			
		||||
 | 
			
		||||
   postscripts(); #run 'postscripts'
 | 
			
		||||
}
 | 
			
		||||
@@ -375,7 +378,6 @@ while (scalar @checkdeps) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
close($moddeps);
 | 
			
		||||
unlink "/tmp/genimage.$$.yum.conf";
 | 
			
		||||
 | 
			
		||||
#-- run postinstall script
 | 
			
		||||
if (!$imagename) {
 | 
			
		||||
@@ -495,7 +497,7 @@ sub getlibs {
 | 
			
		||||
sub mkinitrd {
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/bin");
 | 
			
		||||
	if($basekernelver eq $kernelver) {
 | 
			
		||||
		copy(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel");
 | 
			
		||||
		copy("$rootimg_dir/boot/vmlinuz*","$destdir/kernel");
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		if(-r "$rootimg_dir/boot/vmlinuz-$kernelver") {
 | 
			
		||||
@@ -519,6 +521,8 @@ sub mkinitrd {
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/dev/mapper");
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/sysroot");
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/etc/ld.so.conf.d");
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/etc/udhcpc");
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/usr/share/udhcpc");
 | 
			
		||||
	mkpath("/tmp/xcatinitrd.$$/var/lib/dhclient");
 | 
			
		||||
	my $inifile;
 | 
			
		||||
 | 
			
		||||
@@ -620,9 +624,8 @@ echo '
 | 
			
		||||
 | 
			
		||||
EOS1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	print $inifile "busybox mount -t proc /proc /proc\n";
 | 
			
		||||
	#print $inifile "busybox --install\n";
 | 
			
		||||
	print $inifile "busybox --install\n";
 | 
			
		||||
	print $inifile "busybox mount -t sysfs /sys /sys\n";
 | 
			
		||||
   print $inifile "mount -o mode=0755 -t tmpfs /dev /dev\n";
 | 
			
		||||
   print $inifile "mkdir /dev/pts\n";
 | 
			
		||||
@@ -945,20 +948,70 @@ EOMS
 | 
			
		||||
   print $inifile "  exit\n";
 | 
			
		||||
   print $inifile "fi\n";
 | 
			
		||||
   print $inifile "cd /\n";
 | 
			
		||||
   print $inifile "cp /var/lib/dhclient/dhclient.leases /sysroot/dev/.dhclient-$prinic.leases\n";
 | 
			
		||||
   print $inifile "cp /var/lib/dhclient/dhclient.leases /sysroot/var/lib/dhclient/dhclient-$prinic.leases\n";
 | 
			
		||||
   print $inifile "mknod /sysroot/dev/console c 5 1\n";
 | 
			
		||||
   print $inifile "cp /etc/hostname /sysroot/etc/hostname\n";
 | 
			
		||||
   print $inifile "cp /etc/resolv.conf /sysroot/etc/resolv.conf\n";
 | 
			
		||||
   print $inifile "exec switch_root -c /dev/console /sysroot /sbin/init\n";
 | 
			
		||||
   close($inifile);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   open($inifile,">"."/tmp/xcatinitrd.$$/bin/netstart");
 | 
			
		||||
   print $inifile "#!/sbin/nash\n";
 | 
			
		||||
   print $inifile "network --device $prinic --bootproto dhcp\n";
 | 
			
		||||
   print $inifile "#!/bin/sh\n";
 | 
			
		||||
   print $inifile "udhcpc -n -q -i $prinic\n";
 | 
			
		||||
   close($inifile);
 | 
			
		||||
 | 
			
		||||
   open($inifile,">"."/tmp/xcatinitrd.$$/usr/share/udhcpc/default.script");
 | 
			
		||||
 | 
			
		||||
print $inifile <<'EOF';
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
 | 
			
		||||
 | 
			
		||||
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
 | 
			
		||||
 | 
			
		||||
RESOLV_CONF="/etc/resolv.conf"
 | 
			
		||||
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
 | 
			
		||||
[ -n "$subnet" ] && NETMASK="netmask $subnet"
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
	deconfig)
 | 
			
		||||
		/sbin/ifconfig $interface 0.0.0.0
 | 
			
		||||
		;;
 | 
			
		||||
 | 
			
		||||
	renew|bound)
 | 
			
		||||
		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
 | 
			
		||||
 | 
			
		||||
		if [ -n "$hostname" ] ; then
 | 
			
		||||
			hostname $hostname
 | 
			
		||||
			echo $hostname > /etc/hostname
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		if [ -n "$router" ] ; then
 | 
			
		||||
			echo "deleting routers"
 | 
			
		||||
			while route del default gw 0.0.0.0 dev $interface ; do
 | 
			
		||||
				:
 | 
			
		||||
			done
 | 
			
		||||
 | 
			
		||||
			for i in $router ; do
 | 
			
		||||
				route add default gw $i dev $interface
 | 
			
		||||
			done
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		echo -n > $RESOLV_CONF
 | 
			
		||||
		[ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
 | 
			
		||||
		for i in $dns ; do
 | 
			
		||||
			echo adding dns $i
 | 
			
		||||
			echo nameserver $i >> $RESOLV_CONF
 | 
			
		||||
		done
 | 
			
		||||
		;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
EOF
 | 
			
		||||
   
 | 
			
		||||
   close($inifile);
 | 
			
		||||
   chmod(0755,"/tmp/xcatinitrd.$$/usr/share/udhcpc/default.script");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	chmod(0755,"/tmp/xcatinitrd.$$/init");
 | 
			
		||||
	chmod(0755,"/tmp/xcatinitrd.$$/bin/netstart");
 | 
			
		||||
   @filestoadd=();
 | 
			
		||||
@@ -970,7 +1023,7 @@ EOMS
 | 
			
		||||
     }
 | 
			
		||||
   }
 | 
			
		||||
   # add rsync for statelite
 | 
			
		||||
   foreach ("bin/cpio","sbin/nash","bin/busybox","bin/bash", "usr/sbin/chroot", "sbin/rmmod","sbin/mount.nfs","/usr/bin/rsync") {
 | 
			
		||||
   foreach ("bin/busybox", "bin/bash", "sbin/mount.nfs","usr/bin/rsync") {
 | 
			
		||||
      getlibs($_);
 | 
			
		||||
      push @filestoadd,$_;
 | 
			
		||||
   }
 | 
			
		||||
@@ -1101,13 +1154,13 @@ sub generic_post { #This function is meant to leave the image in a state approxi
 | 
			
		||||
   close($cfgfile);
 | 
			
		||||
   # Create the ifcfg-x file for diskless node. But keep the ONBOOT=no
 | 
			
		||||
   # to skip the break of nfs-based boot
 | 
			
		||||
   open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$prinic");
 | 
			
		||||
   print $cfgfile "ONBOOT=no\nBOOTPROTO=dhcp\nDEVICE=$prinic\n";
 | 
			
		||||
   open($cfgfile,">","$rootimg_dir/etc/network/interfaces");
 | 
			
		||||
   print $cfgfile "auto $prinic\niface $prinic inet dhcp\n";
 | 
			
		||||
   close($cfgfile);
 | 
			
		||||
   foreach (split /,/,$othernics) {
 | 
			
		||||
      if (/^$/) { next; }
 | 
			
		||||
      open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$_");
 | 
			
		||||
      print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$_\n";
 | 
			
		||||
      open($cfgfile,">","$rootimg_dir/etc/network/interfaces");
 | 
			
		||||
      print $cfgfile "\nauto $_\niface $_ inet dhcp\n";
 | 
			
		||||
      close($cfgfile);
 | 
			
		||||
   }
 | 
			
		||||
   open($cfgfile,">>","$rootimg_dir/etc/securetty");
 | 
			
		||||
@@ -1133,7 +1186,7 @@ sub generic_post { #This function is meant to leave the image in a state approxi
 | 
			
		||||
      copy $_,"$rootimg_dir/root/";
 | 
			
		||||
   }
 | 
			
		||||
   unless (  -r <$rootimg_dir/etc/rc3.d/S??network>) {
 | 
			
		||||
       symlink  "/etc/init.d/network","$rootimg_dir/etc/rc3.d/S10network";
 | 
			
		||||
       symlink  "/etc/init.d/networking","$rootimg_dir/etc/rc3.d/S10networking";
 | 
			
		||||
   }
 | 
			
		||||
   open($cfgfile,">","$rootimg_dir/etc/rc3.d/S60gettyset");
 | 
			
		||||
   print $cfgfile "#!/bin/bash\n"; 
 | 
			
		||||
@@ -1166,6 +1219,24 @@ sub generic_post { #This function is meant to leave the image in a state approxi
 | 
			
		||||
   
 | 
			
		||||
   copy(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); } 
 | 
			
		||||
 | 
			
		||||
sub mount_chroot {
 | 
			
		||||
   my $rootimage_dir = shift;
 | 
			
		||||
   mkdir("$rootimage_dir/install");
 | 
			
		||||
   system("mount -o bind /dev $rootimage_dir/dev");
 | 
			
		||||
   system("mount -o bind /proc $rootimage_dir/proc");
 | 
			
		||||
   system("mount -o bind /sys $rootimage_dir/sys");
 | 
			
		||||
   system("mount -o bind /install $rootimage_dir/install");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub umount_chroot {
 | 
			
		||||
   my $rootimage_dir = shift;
 | 
			
		||||
   system("umount $rootimage_dir/dev");
 | 
			
		||||
   system("umount $rootimage_dir/proc");
 | 
			
		||||
   system("umount $rootimage_dir/sys");
 | 
			
		||||
   system("umount $rootimage_dir/install");
 | 
			
		||||
   rmdir("$rootimage_dir/install");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_package_names {
 | 
			
		||||
   my $plist_file_name=shift;
 | 
			
		||||
   my %pkgnames=();
 | 
			
		||||
							
								
								
									
										1
									
								
								xCAT-server/share/xcat/netboot/ubuntu/geninitrd
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								xCAT-server/share/xcat/netboot/ubuntu/geninitrd
									
									
									
									
									
										Symbolic link
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
genimage
 | 
			
		||||
		Reference in New Issue
	
	Block a user