From 8b79ce8d4ecf3337394c78b5eb71df88569d3ac8 Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Thu, 7 Feb 2008 18:54:58 +0000 Subject: [PATCH] -Fix rspreset for blades -Stateless image tweaks including squashfs ram hosted image git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@414 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server-2.0/lib/xcat/plugins/blade.pm | 20 ++-- xCAT-server-2.0/lib/xcat/plugins/fedora.pm | 9 +- xCAT-server-2.0/lib/xcat/plugins/packimage.pm | 92 +++++++++++++++++++ .../share/xcat/netboot/fedora/compute.exlist | 1 + .../share/xcat/netboot/fedora/genimage | 62 ++++++++++--- 5 files changed, 162 insertions(+), 22 deletions(-) create mode 100644 xCAT-server-2.0/lib/xcat/plugins/packimage.pm diff --git a/xCAT-server-2.0/lib/xcat/plugins/blade.pm b/xCAT-server-2.0/lib/xcat/plugins/blade.pm index 6a8548ac3..2aa5d3ed0 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/blade.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/blade.pm @@ -23,6 +23,7 @@ sub handled_commands { rvitals => 'nodehm:vitals,mgt', rinv => 'nodehm:inv,mgt', rbeacon => 'nodehm:beacon,mgt', + rspreset => 'nodehm:mgt', rbootseq => 'nodehm:bootseq,mgt', reventlog => 'nodehm:eventlog,mgt', }; @@ -186,14 +187,17 @@ sub resetmp { my $data; my $stat; my $rc; - $data = $session->set($mpresetoid.".$slot", 1); + #$data = $session->set($mpresetoid.".$slot", 1); + $data = $session->set(new SNMP::Varbind([".".$mpresetoid,$slot,1,'INTEGER'])); + unless ($data) { return (1,$session->{ErrorStr}); } + return (0,"mpreset"); #if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } - if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } - if ($data->{$mpresetoid.".$slot"} == 1) { - return (0, "mpreset"); - } else { - return (1,"error"); - } + #if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } + #if ($data->{$mpresetoid.".$slot"} == 1) { + # return (0, "mpreset"); + #} else { + # return (1,"error"); + #} } sub walkelog { @@ -1008,7 +1012,7 @@ sub dompa { SecLevel => 'authPriv', UseNumeric => 1, Retries => 2, # Give up sooner to make commands go smoother - Timeout=>1200000, #Beacon, for one, takes a bit over a second to return + Timeout=>1300000, #Beacon, for one, takes a bit over a second to return PrivPass => $mpahash->{$mpa}->{password}); if ($session->{ErrorStr}) { return 1,$session->{ErrorStr}; } unless ($session) { diff --git a/xCAT-server-2.0/lib/xcat/plugins/fedora.pm b/xCAT-server-2.0/lib/xcat/plugins/fedora.pm index e785d0b5a..90d141da7 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/fedora.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/fedora.pm @@ -114,7 +114,12 @@ sub mknetboot { my $arch = $ent->{arch}; my $profile = $ent->{profile}; #packimage($osver,$arch,$profile,$installroot,$callback); - unless (-r "/$installroot/netboot/$osver/$arch/$profile/rootimg.gz" and + my $suffix = 'gz'; + if (-r "/$installroot/netboot/$osver/$arch/$profile/rootimg.sfs") { + $suffix = 'sfs'; + } + unless ((-r "/$installroot/netboot/$osver/$arch/$profile/rootimg.gz" or + -r "/$installroot/netboot/$osver/$arch/$profile/rootimg.sfs") and -r "/$installroot/netboot/$osver/$arch/$profile/kernel" and -r "/$installroot/netboot/$osver/$arch/$profile/initrd.gz") { $callback->({error=>["No packed image for platform $osver, architecture $arch, profile $profile, please run packimage -o $osver -p $profile -a $arch"],errorcode=>[1]}); @@ -143,7 +148,7 @@ sub mknetboot { $callback->({error=>["Unable to determine image server for $node"]}); next; } - my $kcmdline = "imgurl=$imgsrv/install/netboot/$osver/$arch/$profile/rootimg.gz "; + my $kcmdline = "imgurl=http://$imgsrv/install/netboot/$osver/$arch/$profile/rootimg.$suffix "; if (defined $ent->{serialport}) { my $sent = $hmtab->getNodeAttribs($node,['serialspeed','serialflow']); unless ($sent->{serialspeed}) { diff --git a/xCAT-server-2.0/lib/xcat/plugins/packimage.pm b/xCAT-server-2.0/lib/xcat/plugins/packimage.pm new file mode 100644 index 000000000..fa62d026f --- /dev/null +++ b/xCAT-server-2.0/lib/xcat/plugins/packimage.pm @@ -0,0 +1,92 @@ +package xCAT_plugin::packimage; +use xCAT::Table; +use Getopt::Long; +use File::Path; +use Cwd; +use File::Temp; +Getopt::Long::Configure("bundling"); +Getopt::Long::Configure("pass_through"); + +sub handled_commands { + return { + packimage => "packimage", + } +} + +sub process_request { + my $sitetab = xCAT::Table->new('site'); + my $request = shift; + my $callback = shift; + my $doreq = shift; + my $ent = $sitetab->getAttribs({key=>'installdir'},['value']); + my $installroot = "/install"; + + if ($ent and $ent->{value}) { + $installroot = $ent->{value}; + } + @ARGV = @{$request->{arg}}; + my $osver; + my $arch; + my $profile; + my $method='cpio'; + GetOptions( + "profile|p=s" => \$profile, + "arch|a=s" => \$arch, + "osver|o=s" => \$osver, + "method|m=s" => \$method + ); + my $distname = $osver; + $distname =~ s/\d+$//; + unless ($installroot) { + $callback->({error=>["No installdir defined in site table"],errorcode=>[1]}); + return; + } + my $oldpath=cwd(); + my $exlistloc; + if (-r "$::XCATROOT/share/xcat/netboot/$distname/$profile.$osver.$arch.exlist") { + $exlistloc = "$::XCATROOT/share/xcat/netboot/$distname/$profile.$osver.$arch.exlist"; + } elsif (-r "$::XCATROOT/share/xcat/netboot/$distname/$profile.$arch.exlist") { + $exlistloc = "$::XCATROOT/share/xcat/netboot/$distname/$profile.$arch.exlist"; + } elsif (-r "$::XCATROOT/share/xcat/netboot/$distname/$profile.$osver.exlist") { + $exlistloc = "$::XCATROOT/share/xcat/netboot/$distname/$profile.$osver.exlist"; + } elsif (-r "$::XCATROOT/share/xcat/netboot/$distname/$profile.exlist") { + $exlistloc = "$::XCATROOT/share/xcat/netboot/$distname/$profile.exlist"; + } else { + $callback->({error=>["Unable to finde file exclusion list under $::XCATROOT/share/xcat/netboot/$distname/ for $profile/$arch/$osver"],errorcode=>[1]}); + next; + } + my $exlist; + open($exlist,"<",$exlistloc); + my $excludestr = "find . "; + while (<$exlist>) { + chomp $_; + $excludestr .= "'!' -wholename '".$_."' -a "; + } + close($exlist); + $callback->({data=>["Packing contents of $installroot/netboot/$osver/$arch/$profile/rootimg"]}); + my $temppath; + if ($method =~ /cpio/) { + $excludestr =~ s!-a \z!|cpio -H newc -o | gzip -c - > ../rootimg.gz!; + } elsif ($method =~ /squashfs/) { + $temppath = mkdtemp("/tmp/packimage.$$.XXXXXXXX"); + $excludestr =~ s!-a \z!|cpio -dump $temppath!; + } + + if (! -d "$installroot/netboot/$osver/$arch/$profile/rootimg") { + $callback->({error=>["$installroot/netboot/$osver/$arch/$profile/rootimg does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]}); + return; + } + chdir("$installroot/netboot/$osver/$arch/$profile/rootimg"); + system($excludestr); + if ($method =~ /squashfs/) { + my $flags; + if ($arch =~ /x86/) { + $flags="-le"; + } elsif ($arch =~ /ppc/) { + $flags="-be"; + } + system("mksquashfs $temppath ../rootimg.sfs $flags"); + chmod(0644,"../rootimg.sfs"); + } + chdir($oldpath); +} diff --git a/xCAT-server-2.0/share/xcat/netboot/fedora/compute.exlist b/xCAT-server-2.0/share/xcat/netboot/fedora/compute.exlist index 23963520f..fb4fb072b 100644 --- a/xCAT-server-2.0/share/xcat/netboot/fedora/compute.exlist +++ b/xCAT-server-2.0/share/xcat/netboot/fedora/compute.exlist @@ -9,4 +9,5 @@ ./usr/share/info* ./usr/share/omf* ./usr/lib/locale* +./usr/lib/perl5* ./boot* diff --git a/xCAT-server-2.0/share/xcat/netboot/fedora/genimage b/xCAT-server-2.0/share/xcat/netboot/fedora/genimage index fa4bd61f5..0c008a582 100755 --- a/xCAT-server-2.0/share/xcat/netboot/fedora/genimage +++ b/xCAT-server-2.0/share/xcat/netboot/fedora/genimage @@ -16,6 +16,7 @@ my %libhash; my @filestoadd; my $profile; my $osver; +my $pathtofiles=dirname($0); GetOptions( #'a=s' => \$architecture, 'p=s' => \$profile, @@ -48,14 +49,26 @@ unless ( -d $srcdir."/repodata" ) { print "Need $installroot/$osver/$arch/repodata available from a system that has ran copycds on $osver $arch"; exit 1; } -my $pathtofiles=dirname($0); my $yumconfig; open($yumconfig,">","/tmp/genimage.$$.yum.conf"); print $yumconfig "[$osver-$arch]\nname=$osver-$arch\nbaseurl=file://$srcdir\ngpgpcheck=0\n"; close($yumconfig); my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$installroot/netboot/$osver/$arch/$profile/rootimg/ --disablerepo=* --enablerepo=$osver-$arch install "; mkpath("$installroot/netboot/$osver/$arch/$profile/rootimg/var/lib/yum"); -open($yumconfig,"<","$pathtofiles/$profile.pkglist"); +my $pkglist; +if (-r "$pathtofiles/$profile.$osver.$arch.pkglist") { + $pkglist = "$pathtofiles/$profile.$osver.$arch.pkglist"; +} elsif (-r "$pathtofiles/$profile.$arch.pkglist") { + $pkglist = "$pathtofiles/$profile.$arch.pkglist"; +} elsif (-r "$pathtofiles/$profile.$osver.pkglist") { + $pkglist = "$pathtofiles/$profile.$osver.pkglist"; +} elsif (-r "$pathtofiles/$profile.$arch.pkglist") { + $pkglist = "$pathtofiles/$profile.pkglist"; +} else { + print "Unable to find package list for $profile!"; + return 1; +} +open($yumconfig,"<","$pkglist"); while (<$yumconfig>) { chomp; $yumcmd .= $_ . " "; @@ -149,13 +162,28 @@ sub mkinitrd { print $inifile "cd /\n"; print $inifile "for i in `cat /proc/cmdline`; do\n"; print $inifile " KEY=`echo \$i |awk -F= '{print \$1}'`\n"; - print $inifile " if [ \"\$KEY\" = 'imgurl' ]; then\n"; - print $inifile " wget http://`echo \$i | awk -F= '{print \$2}'`\n"; + print $inifile " if [ \"\$KEY\" == 'imgurl' ]; then\n"; + print $inifile " VALUE=`echo \$i |awk -F= '{print \$2}'`\n"; + print $inifile " if [ \"http\" == \"`echo \$VALUE|awk -F: '{print \$1}'`\" ]; then\n"; + print $inifile " wget \$VALUE\n"; + print $inifile " fi\n"; print $inifile " fi\n"; print $inifile "done\n"; - print $inifile "mount -t tmpfs rootfs /sysroot\n"; - print $inifile "cd /sysroot\n"; - print $inifile "if [ ! -r /rootimg.gz ]; then\n"; + print $inifile "if [ -r /rootimg.sfs ]; then\n"; + print $inifile " echo Setting up squashfs with ram overlay\n"; + print $inifile " mknod /dev/loop0 b 7 0\n"; + print $inifile " mkdir -p /ro\n"; + print $inifile " mkdir -p /rw\n"; + print $inifile " mount -t squashfs /rootimg.sfs /ro\n"; + print $inifile " mount -t tmpfs rw /rw\n"; + print $inifile " mount -t aufs -o dirs=/rw:/ro mergedroot /sysroot\n"; + print $inifile "elif [ -r /rootimg.gz ]; then\n"; + print $inifile " mount -t tmpfs rootfs /sysroot\n"; + print $inifile " cd /sysroot\n"; + print $inifile " echo -n \"Extracting root filesystem:\"\n"; + print $inifile " zcat /rootimg.gz |cpio -idum\n"; + print $inifile " echo Done"; + print $inifile "else\n"; print $inifile " echo -n Failed to download image, panicing in 5...\n"; print $inifile " for i in 4 3 2 1 0; do\n"; print $inifile " /bin/sleep 1\n"; @@ -164,9 +192,6 @@ sub mkinitrd { print $inifile " echo\n"; print $inifile " exit\n"; print $inifile "fi\n"; - print $inifile "echo -n \"Extracting root filesystem:\"\n"; - print $inifile "zcat /rootimg.gz |cpio -idum\n"; - print $inifile "echo Done"; print $inifile "cd /\n"; print $inifile "cp /var/lib/dhclient/dhclient.leases /sysroot/dev/.dhclient-eth0.leases\n"; print $inifile "mknod /sysroot/dev/console c 5 1\n"; @@ -179,6 +204,11 @@ sub mkinitrd { chmod(0755,"/tmp/xcatinitrd.$$/init"); chmod(0755,"/tmp/xcatinitrd.$$/bin/netstart"); @filestoadd=(); + foreach (@ndrivers) { + if (-f "$pathtofiles/$_") { + push @filestoadd,[$_,"lib/$_"]; + } + } foreach ("sbin/nash","sbin/busybox.anaconda","sbin/rmmod") { getlibs($_); push @filestoadd,$_; @@ -187,10 +217,18 @@ sub mkinitrd { find(\&isnetdriver, <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*>); foreach (@filestoadd) { if (ref($_)) { - copy("$installroot/netboot/$osver/$arch/$profile/rootimg/".$_->[0],"/tmp/xcatinitrd.$$/".$_->[1]); + my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/".$_->[0]; + if (-f "$pathtofiles/".$_->[0]) { + $srcpath="$pathtofiles/".$_->[0]; + } + copy($srcpath,"/tmp/xcatinitrd.$$/".$_->[1]); chmod 0755,"/tmp/xcatinitrd.$$/".$_->[1]; } else { - copy("$installroot/netboot/$osver/$arch/$profile/rootimg/$_","/tmp/xcatinitrd.$$/$_"); + my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/$_"; + if (-f "$pathtofiles/$_") { + $srcpatch = "$pathtofiles/$_"; + } + copy("$srcpath","/tmp/xcatinitrd.$$/$_"); chmod 0755,"/tmp/xcatinitrd.$$/".$_; } }