Welcome, Guest! Log In | Create Account

SLES11.0

From xcat

Jump to: navigation, search

Contents

Step 1

Install base OS, nothing special except:

  • Turn off firewall unless you want to go through the hassle of configuring it. (Most of our sites are well protected already)
  • Make a directory to install everything in
mkdir -p /install/packages/xcat
  • Copy the SLES 11 iso image to /install/packages - you may also need the SDK iso.

Step 2

  • Setup /etc/hosts
  • Use YaST to add the SLES11 iso to your local repository. Zypper doesn't work for adding iso images. Use the iso image you copied to /install/packages. Run yast->software->software repositories. There, you can add the ISO(s).
  • vi /etc/sysconfig/network/ifcfg-eth(0/1) the way you want
    • TIP: To change the order of your ethernet interfaces change /etc/udev/30_persistant_names ... (or something like that, I'm doing this from memory...

Step 3

Add the xCAT and xCAT-dep repositories for SLES

zypper ar http://xcat.sf.net/yum/core-snap/xCAT-core.repo
zypper ar http://xcat.sf.net/yum/xcat-dep/sles11/x86_64/xCAT-dep.repo

install xCAT

zypper install xCAT

Step 4

Set up environment and services

. /etc/profile.d/xcat.sh
tabdump site # just to check to make sure it works
chkconfig –add nfsserver; service nfsserver restart
chkconfig –add ntp; service ntp restart
# correct this xCAT BUG
cp /etc/httpd/conf.d/xcat.conf /etc/apache2/conf.d/
chkconfig –add apache2; service apache2 restart
chkconfig –add tftpd; service tftpd restart
chkconfig -add named; service named start
zypper install dhcp-server
chkconfig -add dhcpd;

Edit the dhcp server config to use the appropritate interface:

vi /etc/sysconfig/dhcpd
DHCPD_INTERFACE="eth1"

Starting dhcp won't work until makedhcp -n is run (after setting up tables)

Step 5

Setup tables as usual (see here for more info)

Run copycds... no changes here, just make sure the nodetype OS is set to sles11.


Notes from SLES 10

Stateless

If you are deploying a stateless image, genimage in /opt/xcat/share/xcat/netboot/sles does not work because zypper is buggy. (Its fixed in SP2)

To install stateless you need to install YUM from the SDK DVD that comes with SLES10.1 as well as createrepo and all the dependencies.

Once you have it do:

cd /install/sles10.1/x86_64
createrepo .

Note: You need to do it in /install/sles10.1/x86_64 instead of /install/sles10.1/x86_64/1 otherwise it will ruin your YAST diskful installs.
Once done you need to use genimage.yum to make this work. Copy the code below into /opt/xcat/share/xcat/netboot/sles/genimage.yum


Note: You need to do it in /install/sles10.1/x86_64 instead of /install/sles10.1/x86_64/1 otherwise it will ruin your YAST diskful installs.

Once done you need to use genimage.yum to make this work. Copy the code below into /opt/xcat/share/xcat/netboot/sles/genimage.yum

#!/usr/bin/env perl
use Data::Dumper;
use File::Basename;
use File::Path;
use File::Copy;
use File::Find;
use Getopt::Long;
#use strict;
Getopt::Long::Configure("bundling");
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 = `uname -m`;
chomp($arch);
if ($arch =~ /i.86$/) {
$arch = x86;
}
my %libhash;
my @filestoadd;
my $profile;
my $osver;
my $pathtofiles=dirname($0);
my $name = basename($0);
my $onlyinitrd=0;
if ($name =~ /geninitrd/) {
$onlyinitrd=1;
}
my $rootlimit;
my $tmplimit;
my $installroot = "/install";
my $kernelver = ""; #`uname -r`;
my $basekernelver; # = $kernelver;

sub xdie {
system("rm -rf /tmp/xcatinitrd.$$");
die @_;
}

$SIG{INT} = $SIG{TERM} = sub { xdie "Interrupted" };
GetOptions(
'a=s' => \$arch,
'p=s' => \$profile,
'o=s' => \$osver,
'n=s' => \$netdriver,
'i=s' => \$prinic,
'r=s' => \$othernics,
'l=s' => \$rootlimit,
't=s' => \$tmplimit,
'k=s' => \$kernelver
);
#Default to the first kernel found in the install image if nothing specified explicitly.
#A more accurate guess than whatever the image build server happens to be running
#If specified, that takes precedence.
#if image has one, that is used
#if all else fails, resort to uname -r like this script did before
my @KVERS= <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*>;
if (scalar(@KVERS)) {
$basekernelver = basename($KVERS[0]);
}
unless ($basekernelver) {
$basekernelver = `uname -r`;
}
unless ($kernelver) {
$kernelver=$basekernelver;
}
chomp($kernelver);
unless ($osver and $profile and $netdriver and $prinic) {
print 'Usage: genimage -i  -n  [-r ] -o  -p  -k '."\n";
print "Examples:\n";
print " genimage -i eth0 -n tg3 -o centos5.1 -p compute\n";
print " genimage -i eth0 -r eth1,eth2 -n tg3,bnx2 -o centos5.1 -p compute\n";
exit 1;
}
my @ndrivers;
foreach (split /,/,$netdriver) {
unless (/\.ko$/) {
s/$/.ko/;
}
if (/^$/) {
next;
}
push @ndrivers,$_;
}
unless (grep /af_packet/,@ndrivers) {
unshift(@ndrivers,"af_packet.ko");
}

unless ($onlyinitrd) {
my $srcdir = "$installroot/$osver/$arch/";
find(\&isyumdir, <$srcdir/>);
print Dumper(@yumdirs);
unless (scalar(@yumdirs)) {
#unless ( -d $srcdir."/repodata" ) {
print "Need $installroot/$osver/$arch/ available from a system that has ran copycds on $osver $arch\n";
exit 1;
}
my $yumconfig;
open($yumconfig,">","/tmp/genimage.$$.yum.conf");
my $repnum=0;
foreach $srcdir (@yumdirs) {
print $yumconfig "[$osver-$arch-$repnum]\nname=$osver-$arch-$repnum\nbaseurl=file://$srcdir\ngpgpcheck=0\n\n";
$repnum += 1;
}
$repnum-=1;
close($yumconfig);
mkpath "$installroot/netboot/$osver/$arch/$profile/rootimg/etc";
mkpath "$installroot/netboot/$osver/$arch/$profile/rootimg/dev";
#system "mount -o bind /dev $installroot/netboot/$osver/$arch/$profile/rootimg/dev";
system "mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/zero c 1 5";
open($fd,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab");
print $fd "#Dummy fstab for rpm postscripts to see\n";
close($fd);
my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$installroot/netboot/$osver/$arch/$profile/rootimg/ ";
$yumcmd .= "install ";
mkpath("$installroot/netboot/$osver/$arch/$profile/rootimg/var/lib/yum");
#my $yumcmd = "zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ install -y ";
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.pkglist") {
$pkglist = "$pathtofiles/$profile.pkglist";
} else {
print "Unable to find package list for $profile!";
return 1;
}
open($yumconfig,"<","$pkglist");
while (<$yumconfig>) {
chomp;
$yumcmd .= $_ . " ";
}
$yumcmd =~ s/ $/\n/;
my $rc = system($yumcmd);
if ($rc) {
print "zypper invocation failed\n";
exit 1;
}
postscripts(); #run 'postscripts'
}
unlink "/tmp/genimage.$$.yum.conf";
mkinitrd();

sub getlibs {
my $file = shift;
my $liblist = `chroot $installroot/netboot/$osver/$arch/$profile/rootimg ldd $file`;
my @libs = split/\n/,$liblist;
my @return;
foreach (@libs) {
unless (/=>/) {
(my $wjnk, my $lib,my $jnk) = split /\s+/,$_,3;
$lib =~ s/^\///;
$libhash{$lib}=1;
next;
}
(my $temp1,my $temp2) = split />/,$_,2;
(my $whitespace,$temp1,$temp2) = split /\s+/,$temp2,4;
unless ($temp1 =~ /\//) {
next;
}
$temp1 =~ s/^\///;
$libhash{$temp1}=1;
}
}

sub mkinitrd {
mkpath("/tmp/xcatinitrd.$$/bin");
if($basekernelver eq $kernelver) {
rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel");
}
else {
if(-r "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver") {
rename("$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel");
} elsif(-r "/boot/vmlinuz-$kernelver") {
copy("/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel");
}
else {
xdie("Cannot read /boot/vmlinuz-$kernelver");
}
}
symlink("bin","/tmp/xcatinitrd.$$/sbin");
mkpath("/tmp/xcatinitrd.$$/usr/bin");
mkpath("/tmp/xcatinitrd.$$/usr/sbin");
mkpath("/tmp/xcatinitrd.$$/usr/lib");
mkpath("/tmp/xcatinitrd.$$/usr/lib64");
mkpath("/tmp/xcatinitrd.$$/lib/firmware");
mkpath("/tmp/xcatinitrd.$$/tmp");
mkpath("/tmp/xcatinitrd.$$/var/run");
mkpath("/tmp/xcatinitrd.$$/lib64/firmware");
mkpath("/tmp/xcatinitrd.$$/lib/mkinitrd/bin");
mkpath("/tmp/xcatinitrd.$$/proc");
mkpath("/tmp/xcatinitrd.$$/sys");
mkpath("/tmp/xcatinitrd.$$/dev/mapper");
mkpath("/tmp/xcatinitrd.$$/sysroot");
mkpath("/tmp/xcatinitrd.$$/etc/ld.so.conf.d");
mkpath("/tmp/xcatinitrd.$$/var/lib/dhcpcd");
my $inifile;
open($inifile,">","/tmp/xcatinitrd.$$/init");
print $inifile "#!/bin/bash\n";
print $inifile "mount -t proc /proc /proc\n";
print $inifile "mount -t sysfs /sys /sys\n";
print $inifile "mount -o mode=0755 -t tmpfs /dev /dev\n";
print $inifile "mkdir /dev/pts\n";
print $inifile "mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts\n";
print $inifile "mkdir /dev/shm\n";
print $inifile "mkdir /dev/mapper\n";
print $inifile "mknod /dev/null c 1 3\n";
print $inifile "mknod /dev/zero c 1 5\n";
print $inifile "mknod /dev/systty c 4 0\n";
print $inifile "mknod /dev/tty c 5 0\n";
print $inifile "mknod /dev/console c 5 1\n";
print $inifile "mknod /dev/ptmx c 5 2\n";
print $inifile "mknod /dev/rtc c 10 135\n";
print $inifile "mknod /dev/tty0 c 4 0\n";
print $inifile "mknod /dev/tty1 c 4 1\n";
print $inifile "mknod /dev/tty2 c 4 2\n";
print $inifile "mknod /dev/tty3 c 4 3\n";
print $inifile "mknod /dev/tty4 c 4 4\n";
print $inifile "mknod /dev/tty5 c 4 5\n";
print $inifile "mknod /dev/tty6 c 4 6\n";
print $inifile "mknod /dev/tty7 c 4 7\n";
print $inifile "mknod /dev/tty8 c 4 8\n";
print $inifile "mknod /dev/tty9 c 4 9\n";
print $inifile "mknod /dev/tty10 c 4 10\n";
print $inifile "mknod /dev/tty11 c 4 11\n";
print $inifile "mknod /dev/tty12 c 4 12\n";
print $inifile "mknod /dev/ttyS0 c 4 64\n";
print $inifile "mknod /dev/ttyS1 c 4 65\n";
print $inifile "mknod /dev/ttyS2 c 4 66\n";
print $inifile "mknod /dev/ttyS3 c 4 67\n";
foreach (@ndrivers) {
print $inifile "insmod /lib/$_\n";
}
print $inifile <<"."/tmp/xcatinitrd.$$/bin/netstart");
print $inifile "#!/bin/bash\n";
print $inifile "dhcpcd $prinic\n";
print $inifile "echo -n 'search '> /etc/resolv.conf\n";
print $inifile "grep DOMAIN /var/lib/dhcpcd/*info|awk -F= '{print \$2}'|awk -F\\' '{print \$2}' >> /etc/resolv.conf\n";
print $inifile "grep HOSTNAME /var/lib/dhcpcd/*info|awk -F= '{print \$2}'|awk -F\\' '{print \$2}' >> /etc/HOSTNAME\n";
print $inifile "for names in `grep DNS /var/lib/dhcpcd/*info|awk -F= '{print \$2}'`; do\n";
print $inifile '   echo nameserver $names >> /etc/resolv.conf'."\n";
print $inifile "done\n";

close($inifile);
chmod(0755,"/tmp/xcatinitrd.$$/init");
chmod(0755,"/tmp/xcatinitrd.$$/bin/netstart");
@filestoadd=();
foreach (@ndrivers) {
if (-f "$pathtofiles/$_") {
push @filestoadd,[$_,"lib/$_"];
}
}
foreach ("usr/bin/grep","bin/cpio","bin/sleep","bin/mount","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","lib/mkinitrd/bin/run-init") {
getlibs($_);
push @filestoadd,$_;
}
if ($arch =~ /x86_64/) {
push @filestoadd,"lib64/libnss_dns.so.2";
}
else {
push @filestoadd,"lib/libnss_dns.so.2";
}
push @filestoadd,keys %libhash;
if($basekernelver ne $kernelver) {
system("rm -rf $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$basekernelver");
unless (-d "$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver") {
if(-d "/lib/modules/$kernelver") {
system("cd /lib/modules;cp -r $kernelver $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/");
}
else {
xdie("Cannot read /lib/modules/$kernelver");
}
}
}
find(\&isnetdriver, <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver/*>);
foreach (@filestoadd) {
if (ref($_)) {
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 {
my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/$_";
if (-f "$pathtofiles/$_") {
$srcpatch = "$pathtofiles/$_";
}
copy("$srcpath","/tmp/xcatinitrd.$$/$_");
chmod 0755,"/tmp/xcatinitrd.$$/".$_;
}
}

#copy("$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*d","/tmp/xcatinitrd.$$/$_");
system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $installroot/netboot/$osver/$arch/$profile/initrd.gz");
system("rm -rf /tmp/xcatinitrd.$$");

}

sub isyumdir {
if ($File::Find::name =~ /\/repodata$/ and $File::Find::name !~ /patches/) {
my $location = $File::Find::name;
$location =~ s/\/repodata$//;
push @yumdirs,$location;
}
}

sub isnetdriver {
foreach (@ndrivers) {
if ($File::Find::name =~ /\/$_/) {
my $filetoadd = $File::Find::name;
$filetoadd =~ s!$installroot/netboot/$osver/$arch/$profile/rootimg/!!;
push @filestoadd,[$filetoadd,"lib/$_"];
}
}
}







sub postscripts { # TODO: customized postscripts
generic_post();
if (-d "$installroot/postscripts/hostkeys") {
for my $key (<$installroot/postscripts/hostkeys/*key>) {
copy ($key,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/ssh/");
}
chmod 0600,;
}
if (-d "/$installroot/postscripts/.ssh") {
mkpath("/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh");
chmod(0700,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/");
for my $file () {
copy ($file,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/");
}
chmod(0600,);
}

}

sub generic_post { #This function is meant to leave the image in a state approximating a normal install
my $cfgfile;
unlink("$installroot/netboot/$osver/$arch/$profile/rootimg/dev/null");
system("mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/null c 1 3");
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab");
print $cfgfile "devpts  /dev/pts devpts   gid=5,mode=620 0 0\n";
print $cfgfile "tmpfs   /dev/shm tmpfs    defaults       0 0\n";
print $cfgfile "proc    /proc    proc     defaults       0 0\n";
print $cfgfile "sysfs   /sys     sysfs    defaults       0 0\n";
if ($tmplimit) {
print $cfgfile "tmpfs   /tmp     tmpfs    defaults       0 0\n";
print $cfgfile "tmpfs   /var/tmp     tmpfs    defaults       0 0\n";
}
close($cfgfile);
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network");
print $cfgfile "NETWORKING=yes\n";
close($cfgfile);
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/resolv.conf");
print $cfgfile "#Dummy resolv.conf to make boot cleaner";
close($cfgfile);
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$prinic");
print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$prinic\n";
close($cfgfile);
foreach (split /,/,$othernics) {
if (/^$/) { next; }
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$_");
print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$_\n";
close($cfgfile);
}
open($cfgfile,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/securetty");
print $cfgfile "ttyS0\n";
print $cfgfile "ttyS1\n";
close($cfgfile);
my @passwd;
open($cfgfile,"<","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd");
@passwd = <$cfgfile>;
close($cfgfile);
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd");
foreach (@passwd) {
if (/^root:/) {
s/^root:\*/root:x/
}
print $cfgfile $_;
}
close($cfgfile);
foreach (<$installroot/netboot/$osver/$arch/$profile/rootimg/etc/skel/.*>) {
if (basename($_) eq '.' or basename($_) eq '..') {
next;
}
copy $_,"$installroot/netboot/$osver/$arch/$profile/rootimg/root/";
}
open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/gettyset");
print $cfgfile "#!/bin/bash\n";
print $cfgfile "for i in `cat /proc/cmdline`; do\n";
print $cfgfile '  KEY=`echo $i|cut -d= -f 1`'."\n";
print $cfgfile "  if [ \"\$KEY\" == \"console\" ]; then\n";
print $cfgfile "    VALUE=`echo \$i | cut -d= -f 2`\n";
print $cfgfile "     COTTY=`echo \$VALUE|cut -d, -f 1`\n";
print $cfgfile "     COSPEED=`echo \$VALUE|cut -d, -f 2|cut -dn -f 1`\n";
print $cfgfile "     if echo \$VALUE | grep n8r; then\n";
print $cfgfile "        FLOWFLAG=\"-h\"\n";
print $cfgfile "     fi\n";
print $cfgfile "     echo xco:2345:respawn:/sbin/agetty \$FLOWFLAG \$COTTY \$COSPEED xterm >> /etc/inittab\n";
print $cfgfile "     init q\n";
print $cfgfile "  fi\n";
print $cfgfile "done\n";
print $cfgfile "/etc/init.d/boot.localnet start\n";
print $cfgfile "/opt/xcat/xcatdsklspost\n";
close($cfgfile);
chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/gettyset");
#link("$installroot/netboot/$osver/$arch/$profile/rootimg/sbin/init","$installroot/netboot/$osver/$arch/$profile/rootimg/init");
my $rc = system("grep sshd $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start");
if ($rc) {
system("sed -i '".'s/^\(TARGETS = .*\)$/\1 sshd/'."' $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start");
system("ln -s ../sshd $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/rc3.d/S20sshd");
}
my $rc = system("grep gettyset $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start");
if ($rc) {
system("sed -i '".'s/^\(TARGETS = .*\)$/\1 gettyset/'."' $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start");
system("ln -s ../gettyset $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/rc3.d/S60gettyset");
}
rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel");
}