Reworked Genesis scripting to provide screen managed console

Have mknb correctly create elilo/xnba config files
Have dhcp implement required hooks to start xnba.efi


git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@10533 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
jbjohnso 2011-09-15 22:00:55 +00:00
parent 102a662337
commit 5863eab0ad
4 changed files with 61 additions and 35 deletions

View File

@ -1,16 +1,3 @@
root=1
rootok=1
netroot=xcat
clear
echo '[ -e $NEWROOT/proc ]' > /initqueue-finished/xcatroot.sh
mkdir /dev/cgroup
mount -t cgroup -o cpu,memory,devices cgroup /dev/cgroup
udevd --daemon
udevadm trigger
mkdir -p /var/lib/dhclient/
mkdir -p /var/log
ip link set lo up
echo '127.0.0.1 localhost' >> /etc/hosts
if [ ! -z "$BOOTIF" ]; then
BOOTIF=`echo $BOOTIF|sed -e s/01-// -e s/-/:/g`
echo -n "Waiting for device with address $BOOTIF to appear.."
@ -40,14 +27,6 @@ if [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
duid=$duid'";'
echo $duid > /var/lib/dhclient/dhclient6.leases
fi
#/bin/sh
mkdir -p /etc/ssh
mkdir -p /var/empty/sshd
echo root:x:0:0::/:/bin/sh >> /etc/passwd
echo sshd:x:30:30:SSH User:/var/empty/sshd:/sbin/nologin >> /etc/passwd
echo rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin >> /etc/passwd
echo rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin >> /etc/passwd
echo qemu:x:107:107:qemu user:/:/sbin/nologin >> /etc/passwd
rpcbind
rpc.statd
ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -C '' -N ''
@ -60,8 +39,10 @@ echo "[ req ]
distinguished_name = nodedn
[ nodedn ]" > /etc/pki/tls/openssl.cnf
openssl genrsa -out /etc/xcat/privkey.pem 1024
PUBKEY=`openssl rsa -in /etc/xcat/privkey.pem -pubout|grep -v "PUBLIC KEY"`
echo -n "Generating private key..."
openssl genrsa -out /etc/xcat/privkey.pem 1024 >& /dev/null
echo "Done"
PUBKEY=`openssl rsa -in /etc/xcat/privkey.pem -pubout 2> /dev/null|grep -v "PUBLIC KEY"`
PUBKEY=`echo $PUBKEY|sed -e 's/ //g'`
export PUBKEY
/sbin/rsyslogd -c4
@ -131,7 +112,7 @@ while :; do
elif [ "$destiny" = shell ]; then
echo "Dropping to debug shell, exit to check for further action"
destiny=''
/bin/sh
/bin/bash
elif [ "$destiny" = runcmd ]; then
destiny=`/bin/nextdestiny $XCATMASTER:$XCATPORT`
$destparameter

View File

@ -2,7 +2,7 @@
echo $drivers
dracut_install wget openssl tar ipmitool cpio gzip modprobe touch echo cut wc
dracut_install grep ip hostname awk egrep grep dirname expr
dracut_install mount.nfs sshd vi reboot lspci parted libvirtd /usr/share/libvirt/cpu_map.xml mkfs mkfs.ext4 mkfs.btrfs
dracut_install mount.nfs sshd vi reboot lspci parted screen libvirtd /usr/share/libvirt/cpu_map.xml mkfs mkfs.ext4 mkfs.btrfs
dracut_install mkswap df brctl vconfig ifenslave ssh-keygen /usr/bin/qemu-img /usr/libexec/qemu-kvm scp clear dhclient lldpad
dracut_install lldptool /lib64/libnss_dns-2.12.so /lib64/libnss_dns.so.2
dracut_install poweroff ntpq ntpd hwclock date /usr/share/terminfo/x/xterm /etc/nsswitch.conf /etc/services
@ -591,6 +591,7 @@ inst "$moddir/allowcred.awk" "/bin/allowcred.awk"
inst "$moddir/getipmi" "/bin/getipmi"
inst "$moddir/getdestiny" "/bin/getdestiny"
inst "$moddir/restart" "/bin/restart"
inst "$moddir/doxcat" "/bin/doxcat"
inst "$moddir/nextdestiny" "/bin/nextdestiny"
inst "$moddir/getcert" "/bin/getcert"
inst "$moddir/dhclient.conf" "/etc/dhclient.conf"
@ -608,6 +609,7 @@ inst "/bin/bash" "/bin/sh"
inst "/lib64/libnss_dns-2.12.so"
inst "/root/.ssh/id_rsa.pub" "/.ssh/authorized_keys"
inst "/lib/terminfo/l/linux" "/lib/terminfo/l/linux"
inst "/lib/terminfo/v/vt100" "/lib/terminfo/v/vt100"
inst_hook cmdline 10 "$moddir/xcat-cmdline.sh"
dracut_install /lib64/rsyslog/lmtcpclt.so
dracut_install /lib64/rsyslog/omtesting.so

View File

@ -44,6 +44,7 @@ my $nrhash;
my $machash;
my $vpdhash;
my $iscsients;
my $nodetypeents;
my $chainents;
my $tftpdir = xCAT::Utils->getTftpDir();
use Math::BigInt;
@ -65,6 +66,25 @@ if ( $distro =~ /ubuntu*/ ){
$dhcpconffile = '/etc/dhcp3/dhcpd.conf';
}
sub check_uefi_support {
my $ntent = shift;
my %blacklist = (
"rhels5.*" => 1,
"centos5.*" => 1,
"sl5.*" => 1,
"sles10.*" => 1,
"esxi4.*" => 1);
if ($ntent and $ntent->{os}) {
foreach (keys %blacklist) {
if ($ntent->{os} =~ /$_/) {
return 0;
}
}
}
return 1;
}
sub ipIsDynamic {
#meant to be v4/v6 agnostic. DHCPv6 however takes some care to allow a dynamic range to overlap static reservations
#xCAT will for now continue to advise people to keep their nodes out of the dynamic range
@ -237,6 +257,7 @@ sub addnode
my $nrent;
my $chainent;
my $ient;
my $ntent;
my $tftpserver;
if ($chainents and $chainents->{$node}) {
$chainent = $chainents->{$node}->[0];
@ -244,6 +265,9 @@ sub addnode
if ($iscsients and $iscsients->{$node}) {
$ient = $iscsients->{$node}->[0];
}
if ($nodetypeents and $nodetypeents->{$node}) {
$ntent = $nodetypeents->{$node}->[0];
}
my $lstatements = $statements;
my $guess_next_server = 0;
my $nxtsrv;
@ -361,12 +385,18 @@ sub addnode
$lstatements = 'option root-path \"'.$iscsirootpath.'\";'.$lstatements;
}
}
my $douefi=check_uefi_support($ntent);
if ($nrent and $nrent->{netboot} and $nrent->{netboot} eq 'xnba' and $lstatements !~ /filename/) {
if (-f "$tftpdir/xcat/xnba.kpxe") {
if ($doiscsi and $chainent and $chainent->{currstate} and ($chainent->{currstate} eq 'iscsiboot' or $chainent->{currstate} eq 'boot')) {
$lstatements = 'if exists gpxe.bus-id { filename = \"\"; } else if exists client-architecture { filename = \"xcat/xnba.kpxe\"; } '.$lstatements;
$lstatements = 'if client-architecture = 00:00 and not gpxe.bus-id { filename = \"xcat/xnba.kpxe\"; } else { filename = \"\"; } '.$lstatements;
} else {
$lstatements = 'if option user-class-identifier = \"xNBA\" { filename = \"http://'.$nxtsrv.'/tftpboot/xcat/xnba/nodes/'.$node.'\"; } else if exists client-architecture { filename = \"xcat/xnba.kpxe\"; } '.$lstatements; #Only PXE compliant clients should ever receive xNBA
#TODO: if windows uefi, do vendor-class-identifier of "PXEClient" to bump it over to proxydhcp.c
if ($douefi) {
$lstatements = 'if option user-class-identifier = \"xNBA\" and client-architecture = 00:00 { filename = \"http://'.$nxtsrv.'/tftpboot/xcat/xnba/nodes/'.$node.'\"; } else if option user-class-identifier = \"xNBA\" and client-architecture = 00:09 { filename = \"http://'.$nxtsrv.'/tftpboot/xcat/xnba/nodes/'.$node.'.uefi\"; } else if client-architecture = 00:07 { filename = \"xcat/xnba.efi\"; } else if client-architecture = 00:00 { filename = \"xcat/xnba.kpxe\"; } else { filename = \"\"; }'.$lstatements; #Only PXE compliant clients should ever receive xNBA
} else {
$lstatements = 'if option user-class-identifier = \"xNBA\" and client-architecture = 00:00 { filename = \"http://'.$nxtsrv.'/tftpboot/xcat/xnba/nodes/'.$node.'\"; } else if client-architecture = 00:00 { filename = \"xcat/xnba.kpxe\"; } else { filename = \"\"; }'.$lstatements; #Only PXE compliant clients should ever receive xNBA
}
}
} #TODO: warn when windows
} elsif ($nrent and $nrent->{netboot} and $nrent->{netboot} eq 'pxe' and $lstatements !~ /filename/) {
@ -1293,7 +1323,12 @@ sub process_request
$chainents = undef;
}
$nrhash = $nrtab->getNodesAttribs($req->{node}, ['tftpserver','netboot']);
my $iscsitab = xCAT::Table->new('iscsi');
my $nodetypetab;
$nodetypetab = xCAT::Table->new('nodetype',-create=>0);
if ($nodetypetab) {
$nodetypeents = $nodetypetab->getNodesAttribs($req->{node},[qw(os)]);
}
my $iscsitab = xCAT::Table->new('iscsi',-create=>0);
if ($iscsitab) {
$iscsients = $iscsitab->getNodesAttribs($req->{node},[qw(server target lun iname)]);
}
@ -1820,12 +1855,20 @@ sub addnet
}
# $lstatements = 'if exists gpxe.bus-id { filename = \"\"; } else if exists client-architecture { filename = \"xcat/xnba.kpxe\"; } '.$lstatements;
push @netent, " if option user-class-identifier = \"xNBA\" { #x86, xCAT Network Boot Agent\n";
push @netent, " if option user-class-identifier = \"xNBA\" and option client-architecture = 00:00 { #x86, xCAT Network Boot Agent\n";
push @netent, " filename = \"http://$tftp/tftpboot/xcat/xnba/nets/".$net."_".$maskbits."\";\n";
push @netent, " } else if option user-class-identifier = \"xNBA\" and option client-architecture = 00:09 { #x86, xCAT Network Boot Agent\n";
push @netent, " filename = \"http://$tftp/tftpboot/xcat/xnba/nets/".$net."_".$maskbits.".uefi\";\n";
push @netent, " } else if option client-architecture = 00:00 { #x86\n";
push @netent, " filename \"xcat/xnba.kpxe\";\n";
push @netent, " } else if option vendor-class-identifier = \"Etherboot-5.4\" { #x86\n";
push @netent, " filename \"xcat/xnba.kpxe\";\n";
push @netent,
" } else if option client-architecture = 00:07 { #x86_64 uefi\n ";
push @netent, " filename \"xcat/xnba.efi\";\n";
push @netent,
" } else if option client-architecture = 00:09 { #x86_64 uefi alternative id\n ";
push @netent, " filename \"xcat/xnba.efi\";\n";
push @netent,
" } else if option client-architecture = 00:02 { #ia64\n ";
push @netent, " filename \"elilo.efi\";\n";

View File

@ -189,15 +189,15 @@ sub process_request {
close($cfg);
if ($invisibletouch and $arch =~ /x86_64/) { #UEFI time
open($cfg,">","$tftpdir/xcat/xnba/nets/$net.elilo");
print $cfg "default=xCAT Genesis\ndelay=5\n\n";
print $cfg 'image=xcat/genesis.kernel.'."$arch\n";
print $cfg " label=xCAT Genesis\n";
print $cfg " initrd=xcat/genesis.fs.$arch.gz\n";
print $cfg " append=\"quiet xcatd=".$normnets->{$_}.":$xcatdport destiny=discover $consolecmdline\n";
print $cfg "default=\"xCAT Genesis\"\ndelay=5\n\n";
print $cfg 'image=/tftpboot/xcat/genesis.kernel.'."$arch\n";
print $cfg " label=\"xCAT Genesis\"\n";
print $cfg " initrd=/tftpboot/xcat/genesis.fs.$arch.gz\n";
print $cfg " append=\"quiet xcatd=".$normnets->{$_}.":$xcatdport destiny=discover $consolecmdline BOOTIF=%B\"\n";
close($cfg);
open($cfg,">","$tftpdir/xcat/xnba/nets/$net.uefi");
print $cfg "#!gpxe\n";
print $cfg 'chain http://${next-server}/tftpboot/elilo-x64.efi'."\n";
print $cfg 'chain http://${next-server}/tftpboot/xcat/elilo-x64.efi -C /tftpboot/xcat/xnba/nets/'."$net.elilo\n";
close($cfg);
}