the code to enable statelite semantics on top of ramdisk is here:

there's one new attribute called "rootfstype" for the osimage;

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@8564 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
mxi1 2011-01-06 06:54:06 +00:00
parent 7e14e139e2
commit b11687c421
9 changed files with 573 additions and 306 deletions

View File

@ -573,13 +573,14 @@ notification => {
},
},
osimage => {
cols => [qw(imagename profile imagetype provmethod osname osvers osdistro osarch synclists postscripts postbootscripts comments disable)],
cols => [qw(imagename profile imagetype provmethod rootfstype osname osvers osdistro osarch synclists postscripts postbootscripts comments disable)],
keys => [qw(imagename)],
table_desc => 'Basic information about an operating system image that can be used to deploy cluster nodes.',
descriptions => {
imagename => 'The name of this xCAT OS image definition.',
imagetype => 'The type of operating system image this definition represents.',
provmethod => 'The provisioning method for node deployment. The valid values are install, netboot or statelite. It is not used by AIX.',
rootfstype => 'The filesystem type for the rootfs is used when the provmethod is statelite. The valid values are nfs or ramdisk. The default value is nfs',
profile => 'The node usage category. For example compute, service.',
osname => 'Operating system name- AIX or Linux.',
osvers => 'Not used.',
@ -1792,6 +1793,11 @@ push(@{$defspec{node}->{'attrs'}}, @nodeattrs);
tabentry => 'osimage.provmethod',
access_tabentry => 'osimage.imagename=attr:imagename',
},
{attr_name => 'rootfstype',
only_if => 'imagetype=linux',
tabentry => 'osimage.rootfstype',
access_tabentry => 'osimage.imagename=attr:imagename',
},
{attr_name => 'profile',
tabentry => 'osimage.profile',
access_tabentry => 'osimage.imagename=attr:imagename',

View File

@ -245,6 +245,7 @@ sub mknetboot
my $rootimgdir;
my $nodebootif; # nodebootif will be used if noderes.installnic is not set
my $dump; # for kdump, its format is "nfs://<nfs_server_ip>/<kdump_path>"
my $rootfstype;
my $ent = $oents{$node}->[0]; #ostab->getNodeAttribs($node, ['os', 'arch', 'profile']);
if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot') and ($ent->{provmethod} ne 'statelite')) {
@ -254,12 +255,13 @@ sub mknetboot
if (!$osimagetab) {
$osimagetab=xCAT::Table->new('osimage', -create=>1);
}
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod');
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod', 'rootfstype');
if ($ref) {
$img_hash{$imagename}->{osver}=$ref->{'osvers'};
$img_hash{$imagename}->{osarch}=$ref->{'osarch'};
$img_hash{$imagename}->{profile}=$ref->{'profile'};
$img_hash{$imagename}->{provmethod}=$ref->{'provmethod'};
$img_hash{$imagename}->{rootfstype} = $ref->{rootfstype};
if (!$linuximagetab) {
$linuximagetab=xCAT::Table->new('linuximage', -create=>1);
}
@ -288,6 +290,8 @@ sub mknetboot
$arch = $ph->{osarch};
$profile = $ph->{profile};
$rootfstype = $ph->{rootfstype};
$rootimgdir=$ph->{rootimgdir};
unless ($rootimgdir) {
$rootimgdir="$installroot/netboot/$osver/$arch/$profile";
@ -302,6 +306,10 @@ sub mknetboot
$arch = $ent->{arch};
$profile = $ent->{profile};
$rootimgdir="$installroot/netboot/$osver/$arch/$profile";
$rootfstype = "nfs"; # TODO: try to get it from the option or table
# $dump; # TODO: set the dump value here
}
#print"osvr=$osver, arch=$arch, profile=$profile, imgdir=$rootimgdir\n";
@ -328,18 +336,25 @@ sub mknetboot
});
next;
}
if (!-r "$rootimgdir/initrd-statelite.gz") {
if (!-r "$rootimgdir/initrd-statelite.gz") {
if (! -r "$rootimgdir/initrd.gz") {
$callback->({
error=>[qq{Did you run "genimage" before running "liteimg"? initrd.gz or initrd-statelite.gz cannot be found}],
errorcode=>[1]
});
});
next;
}
else {
copy("$rootimgdir/initrd.gz", "$rootimgdir/initrd-statelite.gz");
else {
copy("$rootimgdir/initrd.gz", "$rootimgdir/initrd-statelite.gz");
}
}
}
if ( $rootfstype eq "ramdisk" and ! -r "$rootimgdir/rootimg-statelite.gz") {
$callback->({
error=>[qq{No packed image for platform $osver, architecture $arch and profile $profile, please run "liteimg" to create it.}],
errorcode => [1]
});
next;
}
} else {
unless ( -r "$rootimgdir/kernel") {
$callback->({
@ -347,20 +362,20 @@ sub mknetboot
errorcode=>[1]
});
next;
}
if (!-r "$rootimgdir/initrd-stateless.gz") {
}
if (!-r "$rootimgdir/initrd-stateless.gz") {
if (! -r "$rootimgdir/initrd.gz") {
$callback->({
error=>[qq{Did you run "genimage" before running "packimage"? initrd.gz or initrd-stateless.gz cannot be found}],
errorcode=>[1]
});
});
next;
}
else {
copy("$rootimgdir/initrd.gz", "$rootimgdir/initrd-stateless.gz");
else {
copy("$rootimgdir/initrd.gz", "$rootimgdir/initrd-stateless.gz");
}
}
unless ( -r "$rootimgdir/rootimg.gz" or -r "$rootimgdir/rootimg.sfs" ) {
unless ( -r "$rootimgdir/rootimg.gz" or -r "$rootimgdir/rootimg.sfs" ) {
$callback->({
error=>["No packed image for platform $osver, architecture $arch, and profile $profile, please run packimage (e.g. packimage -o $osver -p $profile -a $arch"],
errorcode => [1]});
@ -470,32 +485,36 @@ sub mknetboot
}
my $kcmdline; # add two more arguments: XCAT=xcatmaster:xcatport and ifname=<eth0>:<mac address>
if($statelite){
# get entry for nfs root if it exists:
# have to get nfssvr and nfsdir from noderes table
my $nfssrv = $imgsrv;
my $nfsdir = $rootimgdir;
if($ient->{nfsserver} ){
$nfssrv = $ient->{nfsserver};
}
if($ient->{nfsdir} ne ''){
$nfsdir = $ient->{nfsdir} . "/netboot/$osver/$arch/$profile";
if ($rootfstype ne "ramdisk") {
# get entry for nfs root if it exists:
# have to get nfssvr and nfsdir from noderes table
my $nfssrv = $imgsrv;
my $nfsdir = $rootimgdir;
if($ient->{nfsserver} ){
$nfssrv = $ient->{nfsserver};
}
if($ient->{nfsdir} ne ''){
$nfsdir = $ient->{nfsdir} . "/netboot/$osver/$arch/$profile";
#this code sez, "if nfsdir starts with //, then
#use a absolute path, i.e. do not append xCATisms"
#this is required for some statelite envs.
#still open for debate.
if($ient->{nfsdir} =~ m!^//!) {
$nfsdir = $ient->{nfsdir};
$nfsdir =~ s!^/!!;
}
}
if($ient->{nfsdir} =~ m!^//!) {
$nfsdir = $ient->{nfsdir};
$nfsdir =~ s!^/!!;
}
}
# special case for redhat6, fedora12/13
if ($osver =~ m/rhel6/ || $osver =~ m/rhels6/
|| $osver =~ m/fedora12/ || $osver =~ m/fedora13/ ) {
$kcmdline = "root=nfs:$nfssrv:$nfsdir/rootimg:ro STATEMNT=";
# special case for redhat6, fedora12/13
if ($osver =~ m/rhel6/ || $osver =~ m/rhels6/
|| $osver =~ m/fedora12/ || $osver =~ m/fedora13/ ) {
$kcmdline = "root=nfs:$nfssrv:$nfsdir/rootimg:ro STATEMNT=";
} else {
$kcmdline = "NFSROOT=$nfssrv:$nfsdir STATEMNT=";
}
} else {
$kcmdline = "NFSROOT=$nfssrv:$nfsdir STATEMNT=";
$kcmdline = "imgurl=http://$imgsrv/$rootimgdir/rootimg-statelite.gz STATEMNT=";
}
# add support for subVars in the value of "statemnt"
@ -523,20 +542,22 @@ sub mknetboot
$kcmdline .= $statemnt ." ";
$kcmdline .=
"XCAT=$xcatmaster:$xcatdport ";
# BEGIN service node
my $isSV = xCAT::Utils->isServiceNode();
my $res = xCAT::Utils->runcmd("hostname", 0);
my $sip = xCAT::NetworkUtils->getipaddr($res); # this is the IP of service node
if($isSV and (($xcatmaster eq $sip) or ($xcatmaster eq $res))) {
# if the NFS directory in litetree is on the service node,
# and it is not exported, then it will be mounted automatically
xCAT::SvrUtils->setupNFSTree($node, $sip, $callback);
# then, export the statemnt directory if it is on the service node
if($statemnt) {
xCAT::SvrUtils->setupStatemnt($sip, $statemnt, $callback);
if ($rootfstype ne "ramdisk") {
# BEGIN service node
my $isSV = xCAT::Utils->isServiceNode();
my $res = xCAT::Utils->runcmd("hostname", 0);
my $sip = xCAT::NetworkUtils->getipaddr($res); # this is the IP of service node
if($isSV and (($xcatmaster eq $sip) or ($xcatmaster eq $res))) {
# if the NFS directory in litetree is on the service node,
# and it is not exported, then it will be mounted automatically
xCAT::SvrUtils->setupNFSTree($node, $sip, $callback);
# then, export the statemnt directory if it is on the service node
if($statemnt) {
xCAT::SvrUtils->setupStatemnt($sip, $statemnt, $callback);
}
}
# END service node
}
# END service node
}
else {
$kcmdline =
@ -654,6 +675,12 @@ sub mknetboot
}
my $initrdstr = "xcat/netboot/$osver/$arch/$profile/initrd-stateless.gz";
$initrdstr = "xcat/netboot/$osver/$arch/$profile/initrd-statelite.gz" if ($statelite);
# special case for the dracut-enabled OSes
if ($osver =~ m/rhels6/ || $osver =~ m/rhel6/ || $osver =~ m/fedora12/ || $osver =~ m/fedora13/) {
if($statelite and $rootfstype eq "ramdisk") {
$initrdstr = "xcat/netboot/$osver/$arch/$profile/initrd-stateless.gz";
}
}
$bptab->setNodeAttribs(
$node,
{

View File

@ -311,7 +311,7 @@ sub process_request {
my $verb = "Packing";
my $temppath;
my $oldumask;
my $oldmask;
unless ( -d $rootimg_dir) {
$callback->({error=>["$rootimg_dir does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]});
return;

View File

@ -100,6 +100,7 @@ sub mknetboot
my $profile;
my $rootimgdir;
my $nodebootif; # nodebootif will be used if noderes.installnic is not set
my $rootfstype;
my $ent= $ntents->{$node}->[0];
if ($ent and $ent->{provmethod} and ($ent->{provmethod} ne 'install') and ($ent->{provmethod} ne 'netboot') and ($ent->{provmethod} ne 'statelite')) {
@ -109,11 +110,12 @@ sub mknetboot
if (!$osimagetab) {
$osimagetab=xCAT::Table->new('osimage', -create=>1);
}
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod');
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'rootfstype', 'provmethod');
if ($ref) {
$img_hash{$imagename}->{osver}=$ref->{'osvers'};
$img_hash{$imagename}->{osarch}=$ref->{'osarch'};
$img_hash{$imagename}->{profile}=$ref->{'profile'};
$img_hash{$imagename}->{rootfstype}=$ref->{'rootfstype'};
$img_hash{$imagename}->{provmethod}=$ref->{'provmethod'};
if (!$linuximagetab) {
$linuximagetab=xCAT::Table->new('linuximage', -create=>1);
@ -136,6 +138,7 @@ sub mknetboot
$osver = $ph->{osver};
$arch = $ph->{osarch};
$profile = $ph->{profile};
$rootfstype = $ph->{rootfstype};
$nodebootif = $ph->{nodebootif};
$rootimgdir = $ph->{rootimgdir};
@ -147,6 +150,7 @@ sub mknetboot
$osver = $ent->{os};
$arch = $ent->{arch};
$profile = $ent->{profile};
$rootfstype = "nfs"; # TODO: try to get it from the option or table
$rootimgdir="$installroot/netboot/$osver/$arch/$profile";
}
@ -177,7 +181,6 @@ sub mknetboot
{
$suffix = 'sfs';
}
#statelite images are not packed
if ($statelite) {
unless ( -r "$rootimgdir/kernel") {
@ -187,6 +190,13 @@ sub mknetboot
});
next;
}
if ( $rootfstype eq "ramdisk" and ! -r "$rootimgdir/rootimg-statelite.gz" ) {
$callback->({
error=>[qq{No packed rootimage for the platform $osver, arch $arch and profile $profile, please run liteimg to create it}],
errorcode=>[1]
});
next;
}
if (!-r "$rootimgdir/initrd-statelite.gz") {
if (! -r "$rootimgdir/initrd.gz") {
@ -327,22 +337,27 @@ sub mknetboot
my $kcmdline;
if ($statelite)
{
# get entry for nfs root if it exists;
# have to get nfssvr, nfsdir and xcatmaster from noderes table
my $nfssrv = $imgsrv;
my $nfsdir = $rootimgdir;
if ($restab) {
my $resHash = $restab->getNodeAttribs($node, ['nfsserver', 'nfsdir']);
if($resHash and $resHash->{nfsserver}) {
$nfssrv = $resHash->{nfsserver};
}
if($resHash and $resHash->{nfsdir} ne '') {
$nfsdir = $resHash->{nfsdir} . "/netboot/$osver/$arch/$profile";
if($rootfstype ne "ramdisk") {
# get entry for nfs root if it exists;
# have to get nfssvr, nfsdir and xcatmaster from noderes table
my $nfssrv = $imgsrv;
my $nfsdir = $rootimgdir;
if ($restab) {
my $resHash = $restab->getNodeAttribs($node, ['nfsserver', 'nfsdir']);
if($resHash and $resHash->{nfsserver}) {
$nfssrv = $resHash->{nfsserver};
}
if($resHash and $resHash->{nfsdir} ne '') {
$nfsdir = $resHash->{nfsdir} . "/netboot/$osver/$arch/$profile";
}
}
$kcmdline =
"NFSROOT=$nfssrv:$nfsdir STATEMNT=";
} else {
$kcmdline =
"imgurl=http://$imgsrv/$rootimgdir/rootimg-statelite.gz STATEMNT=";
}
$kcmdline =
"NFSROOT=$nfssrv:$nfsdir STATEMNT=";
# add support for subVars in the value of "statemnt"
my $statemnt="";
if (exists($stateHash->{$node})) {
@ -368,20 +383,22 @@ sub mknetboot
$kcmdline .= $statemnt . " ";
# get "xcatmaster" value from the "noderes" table
#BEGIN service node
my $isSV = xCAT::Utils->isServiceNode();
my $res = xCAT::Utils->runcmd("hostname", 0);
my $sip = xCAT::NetworkUtils->getipaddr($res); # this is the IP of service node
if($isSV and (($xcatmaster eq $sip) or ($xcatmaster eq $res))) {
# if the NFS directory in litetree is on the service node,
# and it is not exported, then it will be mounted automatically
xCAT::SvrUtils->setupNFSTree($node, $sip, $callback);
# then, export the statemnt directory if it is on the service node
if($statemnt) {
xCAT::SvrUtils->setupStatemnt($sip, $statemnt, $callback);
if($rootfstype ne "ramdisk") {
#BEGIN service node
my $isSV = xCAT::Utils->isServiceNode();
my $res = xCAT::Utils->runcmd("hostname", 0);
my $sip = xCAT::NetworkUtils->getipaddr($res); # this is the IP of service node
if($isSV and (($xcatmaster eq $sip) or ($xcatmaster eq $res))) {
# if the NFS directory in litetree is on the service node,
# and it is not exported, then it will be mounted automatically
xCAT::SvrUtils->setupNFSTree($node, $sip, $callback);
# then, export the statemnt directory if it is on the service node
if($statemnt) {
xCAT::SvrUtils->setupStatemnt($sip, $statemnt, $callback);
}
}
#END sevice node
}
#END sevice node
}
else
{

View File

@ -55,14 +55,18 @@ sub process_request {
return;
}
my $rootfstype;
my $exlistloc; # borrowed from packimage.pm
my $osver;
my $arch;
my $profile;
my $rootimg_dir;
my $exlist; # it is used when rootfstype = ramdisk
my $destdir;
my $imagename;
GetOptions(
"rootfstype|t=s" => \$rootfstype,
"profile|p=s" => \$profile,
"arch|a=s" => \$arch,
"osver|o=s" => \$osver,
@ -110,15 +114,26 @@ sub process_request {
return;
}
# get the os, arch, and profile from the image name table.
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile');
(my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'rootfstype', 'osvers', 'osarch', 'profile');
if (!$ref) {
$callback->({error=>["Cannot find image \'$imagename\' from the osimage table."],errorcode=>[1]});
return;
}
$rootfstype = $ref->{'rootfstype'};
$osver=$ref->{'osvers'};
$arch=$ref->{'osarch'};
$profile=$ref->{'profile'};
# get the exlist and rootimgdir attributes
(my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'exlist', 'rootimgdir');
unless($ref1) {
$callback->({error=>[qq{Cannot find image '$imagename' from the osimage table.}], errorcode => [1]});
}
$destdir = $ref1->{'rootimgdir'};
$exlistloc = $ref1->{'exlist'};
$rootimg_dir = "$destdir/rootimg";
} # end of case where they give us osimage.
unless ($osver and $arch and $profile ) {
@ -126,8 +141,10 @@ sub process_request {
return;
}
$destdir="$installroot/netboot/$osver/$arch/$profile";
$rootimg_dir="$destdir/rootimg";
unless ($destdir) {
$destdir="$installroot/netboot/$osver/$arch/$profile";
$rootimg_dir="$destdir/rootimg";
}
my $oldpath=cwd();
# now we have all the info we need:
@ -173,13 +190,28 @@ sub process_request {
# }
#}
my $distname = $osver;
unless ( -r "$::XCATROOT/share/xcat/netboot/$distname/" or not $distname) {
chop($distname);
}
unless($distname) {
$callback->({error=>["Unable to find $::XCATROOT/share/xcat/netboot directory for $osver"], errorcode=>[1]});
return;
}
unless ($imagename) {
#store the image in the DB
if (!$imagename) {
my @ret=xCAT::SvrUtils->update_tables_with_diskless_image($osver, $arch, $profile, 'statelite');
if ($ret[0] != 0) {
$callback->({error=>["Error when updating the osimage tables: " . $ret[1]]});
if ($ret[0]) {
$callback->({error=>["Error when updating the osimage tables: " . $ret[1]]});
}
$imagename="$osver-$arch-statelite-$profile"
$imagename="$osver-$arch-statelite-$profile";
$exlistloc = xCAT::SvrUtils->get_exlist_file_name("$installroot/custom/netboot/$distname", $profile, $osver, $arch);
unless ($exlistloc) {
$exlistloc = xCAT::SvrUtils->get_exlist_file_name("$::XCATROOT/share/xcat/netboot/$distname", $profile, $osver, $arch);
}
}
# check if the file "litefile.save" exists or not
# if it doesn't exist, then we get the synclist, and run liteMe
@ -390,6 +422,84 @@ sub process_request {
system("cp -a $::XCATROOT/share/xcat/netboot/add-on/statelite/rc.statelite $rootimg_dir/etc/init.d/statelite");
}
# newly-introduced code for the rootfs with "ramdisk" as its type
if( $rootfstype eq "ramdisk" ) {
my $xcat_packimg_tmpfile = "/tmp/xcat_packimg.$$";
my $excludestr = "find . ";
my $includestr;
if ($exlistloc) {
my $exlist;
my $excludetext;
open($exlist,"<",$exlistloc);
system("echo -n > $xcat_packimg_tmpfile");
while (<$exlist>) {
$excludetext .= $_;
}
close($exlist);
#handle the #INLCUDE# tag recursively
my $idir = dirname($exlistloc);
my $doneincludes=0;
while (not $doneincludes) {
$doneincludes=1;
if ($excludetext =~ /#INCLUDE:[^#^\n]+#/) {
$doneincludes=0;
$excludetext =~ s/#INCLUDE:([^#^\n]+)#/include_file($1,$idir)/eg;
}
}
my @tmp=split("\n", $excludetext);
foreach (@tmp) {
chomp $_;
s/\s*#.*//; #-- remove comments
next if /^\s*$/; #-- skip empty lines
if (/^\+/) {
s/^\+//; #remove '+'
$includestr .= "-path '". $_ ."' -o ";
} else {
s/^\-//; #remove '-' if any
$excludestr .= "'!' -path '".$_."' -a ";
}
}
}
$excludestr =~ s/-a $//;
if ($includestr) {
$includestr =~ s/-o $//;
$includestr = "find . " . $includestr;
}
print "\nexcludestr=$excludestr\n\n includestr=$includestr\n\n"; # debug
# some rpms like atftp mount the rootimg/proc to /proc, we need to make sure rootimg/proc is free of junk
# before packaging the image
system("umount $rootimg_dir/proc");
my $verb = "Packing";
my $temppath;
my $oldmask;
$callback->({data=>["$verb contents of $rootimg_dir"]});
unlink("$destdir/rootimg-statelite.gz");
if ($exlistloc) {
chdir("$rootimg_dir");
system("$excludestr >> $xcat_packimg_tmpfile");
if ( $includestr) {
system("$includestr >> $xcat_packimg_tmpfile");
}
$excludestr = "cat $xcat_packimg_tmpfile |cpio -H newc -o | gzip -c - > ../rootimg-statelite.gz";
} else {
$excludestr = "find . |cpio -H newc -o | gzip -c - > ../rootimg-statelite.gz";
}
$oldmask = umask 0077;
chdir("$rootimg_dir");
xCAT::Utils->runcmd("$excludestr");
chmod 0644, "$destdir/rootimg-statelite.gz";
umask $oldmask;
system("rm -f $xcat_packimg_tmpfile");
}
chdir($oldpath);
}
sub liteMe {

View File

@ -1,7 +1,7 @@
#!/bin/sh
echo $drivers
dracut_install wget cpio gzip dash modprobe touch echo cut
dracut_install grep ifconfig hostname awk egrep grep dirname
dracut_install fsck.ext3 fsck.ext4
dracut_install wget cpio gzip dash modprobe touch echo cut wc
dracut_install grep ifconfig hostname awk egrep grep dirname expr
dracut_install fsck.ext3 fsck.ext4 mount.nfs
inst "$moddir/xcatroot" "/sbin/xcatroot"
inst_hook cmdline 10 "$moddir/xcat-cmdline.sh"

View File

@ -1,6 +1,6 @@
#!/bin/sh
#!/bin/sh -x
NEWROOT=$3
RWDIR=.statelite
XCATMASTER=$XCAT
if [ ! -z "$imgurl" ]; then
@ -50,6 +50,80 @@ elif [ -r /rootimg.gz ]; then
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 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
while ! mount $SNAPSHOTSERVER:/$SNAPSHOTROOT $NEWROOT/$RWDIR/persistent -o nolock,rsize=32768,tcp,timeo=14; 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
@ -71,24 +145,26 @@ else
exit
fi
cd /
for lf in /tmp/dhclient.*.lease; do
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
done
if [ ! -z "$ifname" ]; then
if [ ! -z "$ifname" ]; then
MACX=${ifname#*:}
ETHX=${ifname%:$MACX*}
elif [ ! -z "$netdev" ]; then
elif [ ! -z "$netdev" ]; then
ETHX=$netdev
MACX=`ip link show $netdev | grep ether | awk '{print $2}'`
elif [ ! -z "$BOOTIF" ]; then
elif [ ! -z "$BOOTIF" ]; then
MACX=$BOOTIF
ETHX=`ifconfig |grep -i $BOOTIF | awk '{print $1}'`
fi
fi
if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then
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
@ -96,6 +172,7 @@ if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then
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/"

View File

@ -789,6 +789,7 @@ sub mkinitrd {
# add some functions
print $inifile <<EOS1;
set -x
NEWROOT="/sysroot"
SHELL="/bin/sh"
RWDIR=".statelite"
@ -998,7 +999,6 @@ for i in `cat /proc/cmdline`; do
rm -f \$FILENAME
fi
done
NFS=0
fi
if [ "nfs" == "`echo \$VALUE|awk -F: '{print \$1}'`" ]; then
NFS=1
@ -1012,16 +1012,19 @@ for i in `cat /proc/cmdline`; do
SERVER=`echo \$VALUE|awk -F: '{print \$1}'`
ROOTDIR=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
elif [ "\$KEY" == 'STATEMNT' ]; then
NFSROOT=1
STATELITE=1
VALUE=`echo \$i |awk -F= '{print \$2}'`
SNAPSHOTSERVER=`echo \$VALUE|awk -F: '{print \$1}'`
SNAPSHOTROOT=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
# may be that there is not server and just a directory.
if [ -z \$SNAPSHOTROOT ]
then
SNAPSHOTROOT=\$SNAPSHOTSERVER
SNAPSHOTSERVER=
fi
# the VALUE may be null
if [ ! -z \$VALUE ]; then
SNAPSHOTSERVER=`echo \$VALUE|awk -F: '{print \$1}'`
SNAPSHOTROOT=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
# may be that there is not server and just a directory.
if [ -z \$SNAPSHOTROOT ]
then
SNAPSHOTROOT=\$SNAPSHOTSERVER
SNAPSHOTSERVER=
fi
fi
fi
done
@ -1031,141 +1034,145 @@ fancydisplay
echo 0 > /proc/sys/vm/zone_reclaim_mode #Avoid kernel bug
# NFSROOT code here:
if [ "\$NFSROOT" = "1" ]; then
echo Setting up Statelite
# for loop back mounting capability!
mknod /dev/loop0 b 7 0
mkdir -p \$NEWROOT
MAXTRIES=5
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 "You're dead. rpower \$ME boot to play again."
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?"
shell
exit
fi
echo -e "\${RED}Could not mount \$SERVER:\$ROOTDIR on \$NEWROOT \$RESET"
RS=`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 -e "\${RED}Hmmm... this NFS root directory doesn't have a /\$RWDIR directory for me to mount a rw filesystem. You'd better create it... \${NORMAL}"
echo "."
shell
fi
while [ ! -e "\$NEWROOT/etc/init.d/statelite" ]
do
echo ""
echo -e "\${RED}Hmmm... \$NEWROOT/etc/init.d/statelite doesn't exist. Perhaps you didn't run liteimg for the current osimage"
echo ""
shell
done
grep '\\(shell\\)' /proc/cmdline >/dev/null && shell
mount -t tmpfs rw -o mode=$permission \$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 -e "\${RED}Hmmm... Can't mount \$SNAPSHOTSERVER:\$SNAPSHOTROOT. \${NORMAL}"
RS=`expr \$RANDOM % 20`
echo -e "Trying again in \$RS seconds"
sleep \$RS
done
fi
grep '\\(shell\\)' /proc/cmdline >/dev/null && shell
# 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
cp -fp /var/lib/dhclient/dhclient.leases \${NEWROOT}/\${RWDIR}/tmpfs/var/lib/dhclient/dhclient-\$IFACE.leases
cp -fp /var/lib/dhclient/dhclient.leases \${NEWROOT}/\${RWDIR}/tmpfs/var/lib/dhcp/dhclient-\$IFACE.leases
[ -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 [ ! -e \$NEWROOT/etc/init.d/statelite ]
do
echo "\$NEWROOT/etc/init.d/statelite does not exist in image!"
shell
# STATELITE code here:
if [ "\$STATELITE" = "1" ]; then
echo Setting up Statelite
# for loop back mouting capability!
mknod /dev/loop0 b 7 0
mkdir -p \$NEWROOT
MAXTRIES=5
ITER=0
ME=`hostname`
if [ "\$NFSROOT" = "1" ]; then
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 "You are dead. rpower \$ME boot to play again."
echo "Possible problems:
1. This initrd wasn't craeted for the statelite node?
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?"
shell
exit
fi
echo -e "\${RED}Could not mount \$SERVER:\$ROOTDIR on \$NEWROOT \$RESET"
RS=`expr \$RANDOM % 30`
echo -e "Trying again in \$RS seconds"
sleep \$RS
done
elif [ "\$NFS" = "1" ]; then
echo -e "\${RED}The \"imgurl=\" value should not be nfs-type if statelite mode is enabled \$RESET"
shell
exit
done
else
# for statelite mode on top of the ramdisk
EOMS
print $inifile "if [ -r /rootimg-statelite.gz ]; then\n";
print $inifile "echo Setting up RAM-root tmpfs.\n";
if ($rootlimit) {
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs \$NEWROOT \n";
} else {
print $inifile " mount -o mode=755 -t tmpfs rootfs \$NEWROOT\n";
}
print $inifile <<EOMS;
modprobe nfs
cd \$NEWROOT
echo -n "Extracting root file system:"
if [ -x /bin/cpio ]; then
gzip -cd /rootimg-statelite.gz |/bin/cpio -idum
else
gzip -cd /rootimg-statelite.gz |cpio -idum
fi
echo Done
else
echo -e "\${RED} Couldnot find rootimg-statelite.gz for statelite on top of ramdisk \$RESET"
shell
exit
fi
# do all the mounts:
\$NEWROOT/etc/init.d/statelite
fi
# now we need to mount the rest of the system.
if [ ! -e "\$NEWROOT/\$RWDIR" ]; then
echo ""
echo -e "\${RED}Hmmm... this NFS root directories doesn't have a /\$RWDIR directory for me to mount a rw filesystem. You'd better to create it... \${NORMAL}"
echo ""
shell
exit
fi
# give the debug shell just before we go if specified!
grep '\(shell\)' /proc/cmdline > /dev/null && shell
while [ ! -e "\$NEWROOT/etc/init.d/statelite" ]; do
echo ""
echo -e "\${RED}Hmmm... \$NEWROOT/etc/init.d/statelite doesn't exist. Perhaps you didn't run liteimg for the current osimage"
echo ""
shell
exit
done
echo 0x100 > /proc/sys/kernel/real-root-dev
export keep_old_ip=yes
export fastboot=yes
export READONLY=yes
grep '\\(shell\\)' /proc/cmdline >/dev/null && shell
mount -n --bind /dev /sysroot/dev
umount /sys
umount /proc
mount -t tmpfs rw -o mode=$permission \$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; 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 -e "\${RED}Hmmm... Can't mount \$SNAPSHOTSERVER:\$SNAPSHOTROOT. \${NORMAL}"
RS=\$(expr \$RANDOM % 20 )
echo -e "Trying again in \$RS seconds"
sleep \$RS
done
fi
# have to preserve the initial DHCP request.
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
cp -fp /var/lib/dhclient/dhclient.leases \$NEWROOT/\$RWDIR/tmpfs/var/lib/dhclient/dhclient-\$IFACE.leases
cp -fp /var/lib/dhclient/dhclient.leases \$NEWROOT/\$RWDIR/tmpfs/var/lib/dhcp/dhclient-\$IFACE.leases
[ -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/
while [ ! -e \$NEWROOT/etc/init.d/statelite ]; do
echo -e "\${RED} \$NEWROOT/etc/init.d/statelite doesn't exist in the osimge! \${NORMAL}"
shell
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 && shell
echo 0x100 > /proc/sys/kernel/real-root-dev
export keep_old_ip=yes
mount -n --bind /dev/ \$NEWROOT/dev
umount /sys
umount /proc
if ! exec /sbin/switch_root -c /dev/console \$NEWROOT /sbin/init; then
echo ""
echo -e "\${RED}Couldn't switch_root. Something must be wrong with the root image.\${RESET}"
shell
fi
if ! exec /sbin/switch_root -c /dev/console \$NEWROOT /sbin/init
then
echo ""
echo -e "\${RED}Couldn't switch_root. Something must be wrong with NFS root image.\${RESET}"
# mount -t proc proc /proc
shell
fi
exit
fi
# END NFSROOT/Statelite code
@ -1176,20 +1183,20 @@ if [ -r /rootimg.sfs ]; then
mkdir -p /rw
mount -t squashfs /rootimg.sfs /ro
mount -t tmpfs rw /rw
mount -t aufs -o dirs=/rw:/ro mergedroot /sysroot
mkdir -p /sysroot/ro
mkdir -p /sysroot/rw
mount --move /ro /sysroot/ro
mount --move /rw /sysroot/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
EOMS
print $inifile "elif [ -r /rootimg.gz ]; then\n";
print $inifile "echo Setting up RAM-root tmpfs.\n";
if ($rootlimit) {
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs /sysroot\n";
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs \$NEWROOT\n";
} else {
print $inifile " mount -o mode=755 -t tmpfs rootfs /sysroot\n";
print $inifile " mount -o mode=755 -t tmpfs rootfs \$NEWROOT\n";
}
print $inifile " cd /sysroot\n";
print $inifile " cd \$NEWROOT\n";
print $inifile " echo -n \"Extracting root filesystem:\"\n";
print $inifile " if [ -x /bin/cpio ]; then\n";
print $inifile " zcat /rootimg.gz |/bin/cpio -idum\n";
@ -1220,11 +1227,11 @@ EOMS
print $inifile " exit\n";
print $inifile "fi\n";
print $inifile "cd /\n";
print $inifile "cp /var/lib/dhclient/dhclient.leases /sysroot/dev/.dhclient-\$IFACE.leases\n";
print $inifile "cp /var/lib/dhclient/dhclient.leases /sysroot/var/lib/dhclient/dhclient-\$IFACE.leases\n";
print $inifile 'if [ -z "$SNAPSHOTSERVER" ]; then cp /etc/resolv.conf /sysroot/etc/resolv.conf; fi'."\n";
print $inifile "mknod /sysroot/dev/console c 5 1\n";
print $inifile "exec switch_root -c /dev/console /sysroot /sbin/init\n";
print $inifile "cp /var/lib/dhclient/dhclient.leases \$NEWROOT/dev/.dhclient-\$IFACE.leases\n";
print $inifile "cp /var/lib/dhclient/dhclient.leases \$NEWROOT/var/lib/dhclient/dhclient-\$IFACE.leases\n";
print $inifile 'if [ -z "$SNAPSHOTSERVER" ]; then cp /etc/resolv.conf \$NEWROOT/etc/resolv.conf; fi'."\n";
print $inifile "mknod \$NEWROOT/dev/console c 5 1\n";
print $inifile "exec switch_root -c /dev/console \$NEWROOT /sbin/init\n";
close($inifile);
open($inifile,">"."/tmp/xcatinitrd.$$/bin/netstart");
@ -1301,29 +1308,27 @@ EOMS
}
}
# Copy udev and network scripts into initrd for s390x
if ($arch eq "s390x") {
# udev
system("mkdir -p /tmp/xcatinitrd.$$/etc/udev");
system("cp -r $rootimg_dir/etc/udev/* /tmp/xcatinitrd.$$/etc/udev");
system("mkdir -p /tmp/xcatinitrd.$$/lib/udev");
system("cp -r $rootimg_dir/lib/udev/* /tmp/xcatinitrd.$$/lib/udev");
system("mkdir -p /tmp/xcatinitrd.$$/proc/self");
system("cp -r /proc/self/oom_adj /tmp/xcatinitrd.$$/proc/self");
# Network related scripts
system("mkdir -p /tmp/xcatinitrd.$$/etc/sysconfig");
system("cp -r $rootimg_dir/etc/sysconfig/* /tmp/xcatinitrd.$$/etc/sysconfig");
system("mkdir -p /tmp/xcatinitrd.$$/sbin");
system("cp -r $rootimg_dir/sbin/* /tmp/xcatinitrd.$$/sbin");
system("mkdir -p /tmp/xcatinitrd.$$/lib/modules/$kernelver");
system("cp -r $rootimg_dir/lib/modules/$kernelver/modules.dep /tmp/xcatinitrd.$$/lib/modules/$kernelver/modules.dep");
system("mkdir -p /tmp/xcatinitrd.$$/etc/init.d");
system("cp -r $rootimg_dir/etc/init.d/* /tmp/xcatinitrd.$$/etc/init.d");
system("mkdir -p /tmp/xcatinitrd.$$/lib64");
system("cp -r $rootimg_dir/lib64/* /tmp/xcatinitrd.$$/lib64");
system("mkdir -p /tmp/xcatinitrd.$$/var/run/netreport");
}
# Copy udev and network scripts into initrd for s390x, which also works for other platforms
# udev
system("mkdir -p /tmp/xcatinitrd.$$/etc/udev");
system("cp -r $rootimg_dir/etc/udev/* /tmp/xcatinitrd.$$/etc/udev");
system("mkdir -p /tmp/xcatinitrd.$$/lib/udev");
system("cp -r $rootimg_dir/lib/udev/* /tmp/xcatinitrd.$$/lib/udev");
system("mkdir -p /tmp/xcatinitrd.$$/proc/self");
system("cp -r /proc/self/oom_adj /tmp/xcatinitrd.$$/proc/self");
# Network related scripts
system("mkdir -p /tmp/xcatinitrd.$$/etc/sysconfig");
system("cp -r $rootimg_dir/etc/sysconfig/* /tmp/xcatinitrd.$$/etc/sysconfig");
system("mkdir -p /tmp/xcatinitrd.$$/sbin");
system("cp -r $rootimg_dir/sbin/* /tmp/xcatinitrd.$$/sbin");
system("mkdir -p /tmp/xcatinitrd.$$/lib/modules/$kernelver");
system("cp -r $rootimg_dir/lib/modules/$kernelver/modules.dep /tmp/xcatinitrd.$$/lib/modules/$kernelver/modules.dep");
system("mkdir -p /tmp/xcatinitrd.$$/etc/init.d");
system("cp -r $rootimg_dir/etc/init.d/* /tmp/xcatinitrd.$$/etc/init.d");
system("mkdir -p /tmp/xcatinitrd.$$/lib64");
system("cp -r $rootimg_dir/lib64/* /tmp/xcatinitrd.$$/lib64");
system("mkdir -p /tmp/xcatinitrd.$$/var/run/netreport");
#copy("$rootimg_dir/lib/modules/*d","/tmp/xcatinitrd.$$/$_");
system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $destdir/initrd-$mode.gz");

View File

@ -949,14 +949,17 @@ for i in `cat /proc/cmdline`; do
SERVER=`echo \$VALUE|awk -F: '{print \$1}'`
ROOTDIR=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
elif [ "\$KEY" == 'STATEMNT' ]; then
NFSROOT=1
STATELITE=1
VALUE=`echo \$i |awk -F= '{print \$2}'`
SNAPSHOTSERVER=`echo \$VALUE|awk -F: '{print \$1}'`
SNAPSHOTROOT=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
# may be that there is not server and just a directory.
if [ -z \$SNAPSHOTROOT ]; then
SNAPSHOTROOT=\$SNAPSHOTSERVER
SNAPSHOTSERVER=
# VALUE may be null
if [ ! -z \$VALUE ]; then
SNAPSHOTSERVER=`echo \$VALUE|awk -F: '{print \$1}'`
SNAPSHOTROOT=`echo \$VALUE|awk -F/ '{for(i=2;i<=NF;i++) printf "/%s",\$i}'`
# may be that there is not server and just a directory.
if [ -z \$SNAPSHOTROOT ]; then
SNAPSHOTROOT=\$SNAPSHOTSERVER
SNAPSHOTSERVER=
fi
fi
fi
done
@ -964,35 +967,57 @@ done
# show xCAT logo
fancydisplay
# begin NFSROOT/Statelite code
if [ "\$NFSROOT" = "1" ]; then
# Statelite code is here
if [ "\$STATELITE" = "1" ]; then
echo Setting up Statelite
# for loop back mounting capability!
mknod /dev/loop0 b 7 0
mkdir -p \$NEWROOT
MAXTRIES=15
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 "You're dead. rpower \$ME boot to play again."
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?"
shell
exit
fi
echo -e "\${RED}Could not mount \$SERVER:\$ROOTDIR on \$NEWROOT \$RESET"
RS=`expr \$RANDOM % 30`
echo -e "Trying again in \$RS seconds"
sleep \$RS
done
if [ "\$NFSROOT" = "1" ]; then
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 "You're dead. rpower \$ME boot to play again."
echo "Possible problems:
1. This initrd wan't created for the statelite node?
2. IS DNS set up? Maybe that's why I can't mount \${SERVER}.
3. The nfs modules aren't set right in this initial ramdisk?"
shell
exit
fi
echo -e "\${RED}Couldn't mount \$SERVER:\$ROOTDIR on \$NEWROOT \$RESET"
RS=\$(expr \$RANDOM % 30)
echo -e "Trying again in \$RS seconds"
sleep \$RS
done
else
# for statelite mode on top of the ramdisk
EOMS
print $inifile "if [ -r /rootimg-statelite.gz ]; then \n";
print $inifile "echo Setting up RAM-root tmpfs.\n";
if ($rootlimit) {
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs \$NEWROOT \n";
} else {
print $inifile " mount -o mode=755 -t tmpfs rootfs \$NEWROOT \n";
}
print $inifile <<EOMS;
cd \$NEWROOT
echo -n "Extracting root file system:"
if [ -x /bin/cpio ]; then
gzip -cd /rootimg-statelite.gz | /bin/cpio -idum
else
gzip -cd /rootimg-statelite.gz | cpio -idum
fi
echo "Done"
else
echo -e "\${RED} Couldn't find rootimg-statelite.gz for statelite semantics on top of ramdisk \${RESET}"
shell
exit
fi
fi
# now we need to mount the rest of the system. This is the read/write portions
#echo "Mounting Snapshot directories"
if [ ! -e "\$NEWROOT/\$RWDIR" ]
@ -1111,9 +1136,9 @@ EOMS
print $inifile "elif [ -r /rootimg.gz ]; then\n";
print $inifile "echo Setting up RAM-root tmpfs.\n";
if ($rootlimit) {
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs /sysroot\n";
print $inifile " mount -o size=$rootlimit mode=755 -t tmpfs rootfs \$NEWROOT\n";
} else {
print $inifile " mount -o mode=755 -t tmpfs rootfs /sysroot\n";
print $inifile " mount -o mode=755 -t tmpfs rootfs \$NEWROOT\n";
}
print $inifile " cd /sysroot\n";
print $inifile " echo -n \"Extracting root filesystem:\"\n";
@ -1142,12 +1167,12 @@ EOMS
print $inifile " exit\n";
print $inifile "fi\n";
print $inifile "cd /\n";
print $inifile "mkdir /sysroot/var/lib/dhcpcd/\n"; #neccessary for SLES11, not sure for SLES10
print $inifile "cp /var/lib/dhcpcd/* /sysroot/var/lib/dhcpcd/\n";
print $inifile "cp /etc/resolv.conf /sysroot/etc/\n";
print $inifile "cp /etc/HOSTNAME /sysroot/etc/\n";
print $inifile "mknod /sysroot/dev/console c 5 1\n";
print $inifile "exec /lib/mkinitrd/bin/run-init -c /dev/console /sysroot /sbin/init\n";
print $inifile "mkdir \$NEWROOT/var/lib/dhcpcd/\n"; #neccessary for SLES11, not sure for SLES10
print $inifile "cp /var/lib/dhcpcd/* \$NEWROOT/var/lib/dhcpcd/\n";
print $inifile "cp /etc/resolv.conf \$NEWROOT/etc/\n";
print $inifile "cp /etc/HOSTNAME \$NEWROOT/etc/\n";
print $inifile "mknod \$NEWROOT/dev/console c 5 1\n";
print $inifile "exec /lib/mkinitrd/bin/run-init -c /dev/console \$NEWROOT /sbin/init\n";
close($inifile);
open($inifile,">"."/tmp/xcatinitrd.$$/bin/netstart");
print $inifile "#!/bin/bash \n";
@ -1175,7 +1200,7 @@ END
}
}
if($mode eq "statelite") {
foreach ("sbin/ifconfig", "usr/bin/clear", "sbin/mount.nfs","sbin/umount.nfs","bin/hostname","usr/bin/egrep","bin/ln","bin/ls","usr/bin/dirname","usr/bin/expr","usr/bin/chroot","usr/bin/grep","bin/cpio","bin/sleep","bin/mount","bin/umount","sbin/dhcpcd","bin/bash","sbin/insmod","bin/mkdir","bin/mknod","sbin/ip","bin/cat","usr/bin/awk","usr/bin/wget","bin/cp","usr/bin/cpio","usr/bin/zcat","usr/bin/gzip","lib/mkinitrd/bin/run-init","usr/bin/uniq","usr/bin/sed","usr/bin/wc") {
foreach ("sbin/ifconfig", "usr/bin/clear", "sbin/mount.nfs","sbin/umount.nfs","bin/hostname","usr/bin/egrep","bin/ln","bin/ls","usr/bin/dirname","usr/bin/expr","usr/bin/chroot","usr/bin/grep","bin/cpio","bin/sleep","bin/mount","bin/umount","sbin/dhcpcd","bin/bash","sbin/insmod","bin/mkdir","bin/mknod","sbin/ip","bin/cat","usr/bin/awk","usr/bin/wget","bin/cp","usr/bin/cpio","usr/bin/zcat","usr/bin/gzip","lib/mkinitrd/bin/run-init","usr/bin/uniq","usr/bin/sed","usr/bin/wc", "bin/sed") {
getlibs($_);
push @filestoadd,$_;
}