This HOW-TO of the is a supplement to the Rembo Server's documentation, The Rembo Wizard plug-in module's documentation and to the Internet Software Consortium's documentation for the DHCP 3.0 software. The example Rembo Server platform below is RedHat Linux 7.1 server. Configuration procedure has following objectives:

close this window

Installing ISC 3.0 DCHP

In the following procedure DHCP server will be installed on the same RedHat 7.1 Linux machine that is already hosting a Rembo Server. Apart few exceptions, the procedure is know to be the same with SuSE 7.2 Linux and with Sun/Solaris 7/8/9 systems. Differences are explained below where applicable.

Uninstall the existing dhcp2.x version from a SuSE / RedHat Linux systems

- Verify that the dhcpd is _not_ installed:

ls -l /etc/init.d/dhcpd
ls -l /usr/sbin/dhcpd

- If installed, uninstall from the RPMs (you can use rpm(8) if you like instead of graphical interface)

export DISPLAY=yourworkstation:0
/usr/bin/kpackage
* Find dhcp-package
* Uninstall the server from the RPM

Installation of the ISC's 3.0 DHCP server

In below example, the source code distribution of ISC  <revision> DHCP server is placed in the shared NFS-directory /csadmin/common/install/rembo/dist/. (Not at the ESRF? Obtain your copy from DHCP home page).

cd /usr/local
tar xvzf /csadmin/common/install/rembo/dhcpd/dhcp-<revision>.tar.gz

- or Solaris: -
gzcat /csadmin/common/install/rembo/dhcpd/dhcp-<revision>.tar.gz | tar xvf -

- no gcc on Solaris? install it first -
gcc
cd /csadmin/common/sw/install
./cswinstall gcc

cd dhcp-<revision>
./configure
make
make install
make clean

touch /var/state/dhcp/dhcpd.leases
- or Solaris: -
touch /etc/dhcpd.leases

- do you want to remove gcc from Solaris?
cd /csadmin/common/sw/install
./cswremove gcc

Make the DCHP server's restart available for non-root users

The System V init() startup script is OS-dependent, with .sh extension. In below example, the example script is placed in the shared NFS-directory /csadmin/common/install/rembo/dhcpd/. An example of dhcpd.sh for RedHat Linux 7.1 server is available in Appendices.

cd /etc/init.d
cp /csadmin/common/install/rembo/dhcpd/initd.<your_os>/dhcpd.sh .

- Compile on the target system a program that allows any user to call the above /etc/init.d/dhcpd.sh with supervisor's privileges. For example (the dhcpd.c referred below is in the Appendices),

cd /tmp
cc -o dhcpd /csadmin/common/install/rembo/dhcpd/initd/dhcpd.c
mv dhcpd /etc/init.d/dhcpd
chmod +s /etc/init.d/dhcpd

- non-root users should be able to edit dhcpd.conf, create a directory for it (In below example, the example configuration file is placed in the shared NFS-directory /csadmin/common/install/rembo/dhcpd. An example of dhcpd.conf is available in Appendices. In the example, group comp is for the installation personnel):

mkdir -p /etc/dhcpdir/RCS
chmod -R 775 /etc/dhcpdir
chown -R <you> /etc/dhcpdir
chgrp -R comp /etc/dhcpdir
cp /csadmin/common/install/rembo/dhcpd/dhcpd.conf_example /etc/dhcpdir/dhcpd.conf
chmod 664 /etc/dhcpdir/dhcpd.conf
chown <you> /etc/dhcpdir/dhcpd.conf
chgrp comp /etc/dhcpdir/dhcpd.conf

Configure and test DHCP services

On an other window, login as <you> and modify the DHCP configuration to correspond your needs.

cd /etc/dhcpdir
ci -l dhcpd.conf
........ do some heavy editing on /etc/dhcpdir/dhcpd.conf .......
* add a network definition for all networks in your system *

- On the root user's window, check that your modifications do not contain errors

/usr/sbin/dhcpd -d -cf /etc/dhcpdir/dhcpd.conf 2>&1 | less

*Common Error* "Can't bind to dhcp address, Address already in use"
*Reason* Remboserver is running and is programmed for DHCPProxy:
*Resolve* Add to rembo.conf:
	DisableDHCPProxy
	BootNoMulticastDiscovery

- (use ctrl-C with to kill the above process if no errors were reported)

- Satisfied? Back in the <you> window, save your work

ci -u dhdpc.conf (and to get it out next time, use "co -l dhcpd.conf")

- Check that the startup works, again, being <you>, say

/etc/init.d/dhcpd start
/etc/init.d/dhcpd stop
/etc/init.d/dhcpd debug
- stop with CTRL-C -
/etc/init.d/dhcpd start
/etc/init.d/dhcpd restart

Install the dhcpd-service in the startup procedures for System V init()

cd /etc/rc.d/rc3.d
- or Solaris:-
cd /etc/rc3.d

ln -s ../init.d/dhcpd.sh S64dhcpd
ln -s ../init.d/dhcpd.sh K64dhcpd

- RedHat Linux only: -
cd /etc/rc.d/rc5.d
ln -s ../init.d/dhcpd.sh S64dhcpd
ln -s ../init.d/dhcpd.sh K64dhcpd

 

Appendices

etc/init.d/dhcpd.sh used at the ESRF for RedHat 7.1 servers

#!/bin/sh
#
# dhcpd         This shell script takes care of starting and stopping
#               dhcpd.
#
# chkconfig: - 65 35
# description: dhcpd provide access to Dynamic Host Control Protocol.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -f /usr/sbin/dhcpd ] || exit 0
[ -f /etc/dhcpdir/dhcpd.conf ] || exit 0
[ -f /var/state/dhcp/dhcpd.leases ] || exit 0

RETVAL=0
prog="dhcpd"

start() {
	# Start daemons.
	echo -n $"Starting $prog: "
	daemon /usr/sbin/dhcpd -cf /etc/dhcpdir/dhcpd.conf
	RETVAL=$?
	echo
	[ $RETVAL -eq 0 ] && touch /var/lock/subsys/dhcpd
	return $RETVAL
}

stop() {
	# Stop daemons.
	echo -n $"Shutting down $prog: "
	killproc dhcpd
	RETVAL=$?
	echo
	[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/dhcpd
	return $RETVAL
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	stop
	start
	RETVAL=$?
	;;
  condrestart)
	if [ -f /var/lock/subsys/dhcpd ]; then
	    stop
	    start
	    RETVAL=$?
	fi
	;;
  status)
	status dhcpd
	RETVAL=$?
	;;
  *)
	echo $"Usage: $0 {start|stop|restart|condrestart|status}"
	exit 1
esac

exit $RETVAL

/etc/dhcpdir/dhcpd.conf example with PXE option space pointing to Rembo Boot

# dhcpd.conf ESRF DHCP configuration file 3.0
#    Modified: $Date: 2001/11/28 08:53:13 $
# ------------------------------------------------------------------------------
# You may want to have two windows open on this system,
# - one with your own account, one with root priviledges
# 1) The actual location of this file is $Source: /etc/dhcpdir/dhcpd.conf$
#    - move into that directory
# 2) Check out the file for modifications "co -l dhcpd.conf"
# 3) Once modified you may want to stop the dhcpd services
#    "/etc/init.d/dhcp stop
# 4) Check your files against syntax errors by starting dhcpd services with
#    /usr/sbin/dhcpd -d
#    (stop with Ctrl-C)
# 5) Save the modified file, check it in "ci -u dhcpd.conf"
#                                         Please give a meaningful comment.
# 6) run "/etc/initd.d/dhcpd restart"
#    (suid executable that run /etc/initd./dhcpd.sh restart)
# 7) At the end of script: Verify that the dhcpd process actually do start
# ------------------------------------------------------------------------------
# ============================= PXE OPTION SPACE ===============================
# Definition of PXE-specific options where the services required by
# the PXE client are answered by the DHCP proxy of the PXE server.
# Rembo server, for example may be located on a different machine than this
# DHCP server. The client is as per Intel's PXE 2.1 specification and the
# byte ordering is for the Intel processor architecture.

option space PXE;

# Option descriptions and the default values for the ESRF will follow:
# ------------------------------------------------------------------------------
# multicast ip address    : multicast address of boot file
#
# size 4
option PXE.mtftp_ip code 1 = ip-address;

# ------------------------------------------------------------------------------
# discovery control    : find bootserver using .. multicast = 1
#                                                 broadcast = 2
#                                                 use list  = 7
option PXE.discovery_control code 6 = unsigned integer 8;

# ------------------------------------------------------------------------------
# discovery multicast address : Multicast capable Boot Servers listening on this
#
option PXE.discovery_mcast_addr code 7 = array of unsigned integer 8;

# ------------------------------------------------------------------------------
# boot servers         : List of Boot Servers
#			 { type MSB, type LSB, IPcnt, IP-addr-list,
#			   type MSB ... }
#                        - if more boot servers to be listed, redefine
#			   the structure  by adding type MSB,
#			   type LSB and so on.
option PXE.boot_servers code 8 = array of unsigned integer 8;

# ------------------------------------------------------------------------------
# boot menu            : Boot possibilities:
#			 { type MSB, type LSB, desclen, "text", type MSB ... }
#                        - if more items to be listed, redefine the structure
#			   by adding type MSB, type LSB and so on.
#			 - to find out the decimal text format, say ex.:
#			   echo MyMenuText | od -t u1
#
option PXE.boot_menu code 9 = array of unsigned integer 8;

# ------------------------------------------------------------------------------
# menu prompt	       : What to display: { timeout, "prompt" }
#
option PXE.menu_prompt code 10 = { unsigned integer 8, text };

# ---------------------- PXE REMBO BOOT CLIENT CLASSES -------------------------
# Create a generic class for PXE clients who wants to boot from the ESRF
# Rembo server(s):
# - Use unicast to connect to the server
# - Boot Server type = 15
# - Rembo Server #1 = example.myprivate.domain (192.168.1.1)
# - Boot menu is currently:
#   (1) "Rembo Server" (default, type 15)
#   (2) "PXE/BootP Server" (if not defined in boot_servers, then local, type 0)

class "pxeremboclient_example" {
	match hardware;
	option vendor-class-identifier	"PXEClient";
	vendor-option-space PXE;
	option PXE.discovery_control 7;
	option PXE.discovery_mcast_addr 0,0,0,0;
	option PXE.boot_servers 0,15,1,10,0,0,1;
	option PXE.boot_menu
	  0,15,12,
	  82,101,109,98,111,32,83,101,114,118,101,114,
	  0,0,9,
	  80,88,69,47,66,111,111,116,80;
	option PXE.menu_prompt 3
       	"EXAMPLE responded: Boot from a Rembo Server: EXAMPLE (F8=menu)";
}
# Following is the list of all Rembo clients, selected by the first broadcast
# packet's hardware information fields.
# - The format is <ARP-hardware type><hardware address>, for Ethernet
#   1:<MAC-address>
# 
subclass "pxeremboclient_example" 1:00:02:b3:1a:5f:16;	# node1

# ============================= DHCP OPTION SPACE ==============================

# option definitions common to all hosts
#
server-identifier               example.myprivate.domain;
server-name                     "example";
option domain-name              "myprivate.domain";
option domain-name-servers      192.168.1.1;
option subnet-mask              255.255.255.0;
# make sure Windows clients work fine
# Hybrid node - WINS first. Then broadcast
# for WINS servers see on each sub network
# lease time = 3 hours
default-lease-time              10800;
max-lease-time                  10800;
deny unknown-clients;
use-host-decl-names             on;
# from 3.0b2pl11 - No DDNS registration
ddns-update-style               none;                                           
# ---------------------------- GROUP DEFINITIONS -------------------------------
#
group {
  host node1 {
        # if the DHCP server is on a different machine than the Rembo Server,
        # declare in the following two lines the Rembo Server's name
        # server-identifier                       myremboserv.mydomain.org;
        # server-name                             "myremboserv";
        hardware ethernet                       00:02:b3:1a:5f:16;
        fixed-address                           192.168.1.1;
        option host-name                        "pctest";
  }
}
# ------------------------- SUBNET DEFINITIONS  -------------------------------
#
# Private networks that the DHCP should listen
#
subnet 192.168.1.0 netmask 255.255.255.0 {
   option broadcast-address   192.168.1.255;
}
#
# Public networks that the DHCP should listen
#
subnet 123.123.123.0 netmask 255.255.255.0 {
   option routers            123.123.123.99;
   option broadcast-address   12.123.123.255;
}
# end of dhcpd.conf

dhcpd.c source code for the /etc/init.d/dhcpd used at the ESRF for RedHat 7.1 servers

/* This is a wrapper program to execute dhcpd.sh script */
#include <sys/wait.h>
int main(int narg,
	  char *argv[])

{
  char command[128];
  char buff[80];
  int i,rc;
  strcpy(command,"/etc/init.d/dhcpd.sh ");
  strcat(command,argv[1]);
  /* get stdin and stdout, stderr OK */
  setuid(0);
  rc=system(command);
  if ( WIFEXITED(rc) != 0 ) {
    return(WEXITSTATUS(rc));
  }
  else {
    return(0);
  }
}

18 Nov 2002


close this window