#!/bin/csh -f # Script to make a ClusterNFS-ready client node root filesystem # on a RedHat 7.1 server (2.4.14 SMP kernel) # Last revision: 2001.12.12 (ajw) if ( $1 == "" ) then echo "Usage: makeclusternfsclient.csh " exit endif setenv CLIENTID $1 # Delete ALL existing client directories echo -n "Removing old 192.168.1.${CLIENTID} and 192.168.2.${CLIENTID} directories... " rm -rf /etc\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /root\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /var\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /dev\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /proc\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /tmp\$\$IP=192.168.1.${CLIENTID}\$\$ rm -rf /etc\$\$IP=192.168.2.${CLIENTID}\$\$ rm -rf /root\$\$IP=192.168.2.${CLIENTID}\$\$ rm -rf /var\$\$IP=192.168.2.${CLIENTID}\$\$ rm -rf /dev\$\$IP=192.168.2.${CLIENTID}\$\$ rm -rf /proc\$\$IP=192.168.2.${CLIENTID}\$\$ rm -rf /tmp\$\$IP=192.168.2.${CLIENTID}\$\$ echo "Done." # Copy needed server directories (Recursively, preserving permissions) echo -n "Copying server /etc, /root, /var directories to client... " cp -R -p /etc /etc\$\$IP=192.168.1.${CLIENTID}\$\$ cp -R -p /root /root\$\$IP=192.168.1.${CLIENTID}\$\$ cp -R -p /var /var\$\$IP=192.168.1.${CLIENTID}\$\$ echo "Done." # Make empty /dev, /dev/pts, /proc, /tmp client directories # (with correct permissions) echo -n "Making (empty) client /dev, /dev/pts, /proc and /tmp directories... " mkdir /dev\$\$IP=192.168.1.${CLIENTID}\$\$ chmod 0755 /dev\$\$IP=192.168.1.${CLIENTID}\$\$ mkdir /dev\$\$IP=192.168.1.${CLIENTID}\$\$/pts chmod 0755 /dev\$\$IP=192.168.1.${CLIENTID}\$\$/pts mkdir /proc\$\$IP=192.168.1.${CLIENTID}\$\$ chmod 0555 /proc\$\$IP=192.168.1.${CLIENTID}\$\$ mkdir /tmp\$\$IP=192.168.1.${CLIENTID}\$\$ chmod 0777 /tmp\$\$IP=192.168.1.${CLIENTID}\$\$ echo "Done." # Make symlinks for Myrinet root filesystem echo -n "Making symlinks for 192.168.2.${CLIENTID} root filesystem... " ln -sf /etc\$\$IP=192.168.1.${CLIENTID}\$\$ /etc\$\$IP=192.168.2.${CLIENTID}\$\$ ln -sf /root\$\$IP=192.168.1.${CLIENTID}\$\$ /root\$\$IP=192.168.2.${CLIENTID}\$\$ ln -sf /var\$\$IP=192.168.1.${CLIENTID}\$\$ /var\$\$IP=192.168.2.${CLIENTID}\$\$ ln -sf /dev\$\$IP=192.168.1.${CLIENTID}\$\$ /dev\$\$IP=192.168.2.${CLIENTID}\$\$ ln -sf /proc\$\$IP=192.168.1.${CLIENTID}\$\$ /proc\$\$IP=192.168.2.${CLIENTID}\$\$ ln -sf /tmp\$\$IP=192.168.1.${CLIENTID}\$\$ /tmp\$\$IP=192.168.2.${CLIENTID}\$\$ echo "Done." # Create ONLY the necessary devices in client /dev # NOTE: see /proc/devices for hints on needed devices # NOTE: see "devices.txt" for device documentation echo -n "Making devices in client /dev ... " # Change to client /dev directory cd /dev\$\$IP=192.168.1.${CLIENTID}\$\$ # Make the "bare minimum" list of devices (/etc/makedev.d/std) # floppy drive(s) (282 devices) of which ONLY fd0* are needed (43 devices) # core -> ../proc/kcore # fd -> ../proc/self/fd/ File descriptors # fd0*..7* floppy drive(s) # full (1,7) # kmem (1,2) # mem (1,1) # null (1,3) # port (1,4) # random (1,8) # stdin -> ../proc/self/fd/0 # stdout -> ../proc/self/fd/1| # stderr -> ../proc/self/fd/2 # urandom (1,9) /dev/MAKEDEV -d . std rm -f fd[1-7]* # Make hdc* devices and symlink for CD-ROM (16 devices) /dev/MAKEDEV -d . ide1 rm -f hdd* ln -sf hdc cdrom # Make psaux and symlink for PS/2-style mouse port (1 device) /dev/MAKEDEV -d . psaux ln -sf psaux mouse # Make virtual console devices set i = 0 while ( ${i} < 64 ) mknod tty${i} c 4 ${i} @ i = ${i} + 1 end # Make current TTY device (5,0) mknod tty c 5 0 # Make system console (5,1) mknod console c 5 1 # Make PTY master multiplex (5,2) mknod ptmx c 5 2 # Make virtual console CAPTURE devices # Make current vc text contents (64 devices, vcs, vcs1..63) # Make current vc text/attribute contents (64 devices, vcsa, vcsa1..63) /dev/MAKEDEV -d . vcs # Make Pseudo-TTY masters (256 devices, pty*) /dev/MAKEDEV -d . pty # Make Pseudo-TTY slaves (16 devices, ttyp0..f) /dev/MAKEDEV -d . ttyp # Make Myrinet GM devices (adapted from GM_INSTALL script) # NOTE: the default GM_INSTALL script can't do this because of some # clusterNFS difficulty with the "mknod" command (ajw,2001.12.03) foreach i ( 0 1 2 3 4 5 6 7 ) /bin/rm -f gm$i gmp$i \ && mknod gm$i c 41 `expr $i "*" 2` \ && chmod 666 gm$i \ && mknod gmp$i c 41 `expr $i "*" 2 + 1` \ && chmod 600 gmp$i end # Make I2C devices (for lm-sensors hardware monitoring) foreach i ( 0 1 2 3 4 5 6 7 ) /bin/rm -f i2c-$i \ && mknod i2c-$i c 89 $i \ && chmod 600 i2c-$i end # Change back to root directory cd / echo "Done." # Create client-specific /etc/inittab so client boots into runlevel 3 echo -n "Editing /etc/inittab... " sed -e 's/id:5:initdefault:/id:3:initdefault:/g' /etc/inittab > \ /etc\$\$IP=192.168.1.${CLIENTID}\$\$/inittab echo "Done." # Create client-specific /etc/sysconfig/network file echo -n "Creating client-specific /etc/sysconfig/network file... " echo "NETWORKING=no" > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/sysconfig/network echo "Done." # Delete copied /etc/sysconfig/hwconf file echo -n "Removing copied /etc/sysconfig/hwconf file... " rm -f /etc\$\$IP=192.168.1.${CLIENTID}\$\$/sysconfig/hwconf echo "Done." # Create client-specific /etc/fstab file echo -n "Creating client-specific /etc/fstab file... " echo "192.168.1.254:/ / nfs rw 0 0" \ > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/fstab echo "none /proc proc defaults 0 0" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/fstab echo "none /dev/pts devpts gid=5,mode=620 0 0" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/fstab echo "/dev/fd0 /mnt/floppy auto noauto,owner 0 0" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/fstab echo "/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/fstab echo "Done." # Create empty client-specific /etc/mtab file echo -n "Creating client-specific /etc/mtab file... " echo -n "" > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/mtab echo "Done." # Delete client /etc/exports file echo -n "Removing client /etc/exports file... " rm -f /etc\$\$IP=192.168.1.${CLIENTID}\$\$/exports* echo "Done." # Create client-specific /etc/hosts file echo -n "Creating client-specific /etc/hosts file... " echo "127.0.0.1 localhost.localdomain localhost" \ > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "# ClusterNFS server (via Ethernet)" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "192.168.1.254 ws000" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "# ClusterNFS server (via Myrinet)" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "192.168.2.254 sirius" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "# ClusterNFS Ethernet test node" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "192.168.1.99 ws099" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "# ClusterNFS Ethernet IPs" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts set i = 1 while ( ${i} < 10 ) echo "192.168.1.${i} ws00${i}" >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts @ i = ${i} + 1 end while ( ${i} < 32 ) echo "192.168.1.${i} ws0${i}" >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts @ i = ${i} + 1 end echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts echo "# ClusterNFS Myrinet IPs" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts set i = 1 while ( ${i} < 10 ) echo "192.168.2.${i} gm00${i}" >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts @ i = ${i} + 1 end while ( ${i} < 32 ) echo "192.168.2.${i} gm0${i}" >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/hosts @ i = ${i} + 1 end echo "Done." # Create client-specific /etc/resolv.conf file (DNS) echo -n "Creating client-specific /etc/resolv.conf file... " echo "nameserver 192.168.1.254" > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/resolv.conf echo "Done." # Create client-specific /etc/ntp.conf file (NTP) echo -n "Creating client-specific /etc/ntp.conf file... " echo "server 192.168.1.254" > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ntp.conf echo "driftfile /etc/ntp.drift" >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ntp.conf echo "Done." # Create empty client-specific log files echo -n "Creating (empty) client-specific log files... " rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/boot.log* touch /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/boot.log chmod 0600 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/boot.log rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/cron* touch /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/cron chmod 0600 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/cron rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/maillog* touch /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/maillog chmod 0600 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/maillog rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/messages* touch /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/messages chmod 0600 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/messages rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/secure* touch /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/secure chmod 0600 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/secure echo -n "" > /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/lastlog chmod 0644 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/lastlog echo -n "" > /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/wtmp chown root.utmp /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/wtmp chmod 0664 /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/wtmp echo "Done." # Delete copied system activity (sa) log files echo -n "Removing copied server system activity (sa) files... " rm -f /var\$\$IP=192.168.1.${CLIENTID}\$\$/log/sa/sa* echo "Done." # Create client-specific SSH keys echo -n "Removing copied server SSH keys... " rm -f /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ssh/ssh_host*key* echo "Done." echo -n "Generating client-specific rsa1 SSH keys... " ssh-keygen -t rsa1 -f \ /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ssh/ssh_host_key -C '' -N '' >&/dev/null echo "Done." echo -n "Generating client-specific rsa SSH keys... " ssh-keygen -t rsa -f \ /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ssh/ssh_host_rsa_key -C '' -N '' >&/dev/null echo "Done." echo -n "Generating client-specific dsa SSH keys... " ssh-keygen -t dsa -f \ /etc\$\$IP=192.168.1.${CLIENTID}\$\$/ssh/ssh_host_dsa_key -C '' -N '' >&/dev/null echo "Done." # Create client-specific /etc/rc.local # => copy first 37 lines of server /etc/rc.local to client echo -n "Generating client-specific /etc/rc.local file... " sed -e '1,37\!d' /etc/rc.d/rc.local \ > /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Reset client hostname (so GM mapper gets Myrinet node names, see below) echo -n "Resetting client hostname (in /etc/rc.local)... " echo "# Set client hostname to Myrinet node name" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local if ( ${CLIENTID} < 10 ) then echo "/bin/hostname gm00${CLIENTID}" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local else if ( ${CLIENTID} >= 10 ) then echo "/bin/hostname gm0${CLIENTID}" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local endif echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Set up client loopback interface echo -n "Set up client loopback device (in /etc/rc.local)... " echo "# Set up loopback device" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/etc/sysconfig/network-scripts/ifup ifcfg-lo" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Install client Myrinet GM driver (in /etc/rc.local) # # NOTE: this fails with the following error--- # /bin/rm: cannot remove `/dev/gm0': Input/output error # This is probably a problem with "mknod" over clusterNFS. # So, created GM_INSTALL_clusternfs_client script which omits creation of # /dev/gm* devices. Instead, the devices are created above in THIS script. # # NOTE: must "cd" to /home/weaver/gm-1.5_Linux/binary for the install # script to execute without the following error: # insmod: /etc/sbin/gm: No such file or directory # ################################# # Error installing GM driver module. # ################################# # This is probably a simple environment problem (ajw,2001.12.03) # echo -n "Install client Myrinet (in /etc/rc.local)... " echo "# Install Myrinet GM driver" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "cd /home/weaver/gm-1.5_Linux/binary" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "./GM_INSTALL_clusternfs_client" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "# Read static GM maps" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "cd /home/weaver/gm-1.5_Linux/binary/sbin" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "./file_mapper file.args" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "cd /" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "# Tune networking parameters for NFS-v3 over TCP" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "echo 262144 > /proc/sys/net/core/rmem_max" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "echo 262144 > /proc/sys/net/core/wmem_max" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "echo 262144 > /proc/sys/net/core/rmem_default" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "echo 262144 > /proc/sys/net/core/wmem_default" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "# Set up IP over GM" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/sbin/ifconfig myri0 192.168.2.${CLIENTID} up" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Load hardware monitoring kernel modules (in /etc/rc.local) echo -n "Load client hardware monitoring kernel modules (in /etc/rc.local)... " echo "Load hardware monitoring kernel modules" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "# I2C adapter drivers" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/sbin/modprobe i2c-amd756" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "# I2C chip drivers" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/sbin/modprobe w83781d init=0" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/sbin/modprobe eeprom" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Start NTP daemon (in /etc/rc.local) echo -n "Start client NTP daemon (in /etc/rc.local)... " echo "# Start NTP daemon" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "/usr/local/bin/ntpd" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done." # Finally, remount client root filesystem (in /etc/rc.local) # NOTE: This is NOT working---but, no error msg is returned echo -n "Remount client root filesystem (in /etc/rc.local)... " echo "# Remount root filesystem" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "mount -o remount,rw,nfsvers=3,rsize=8192,wsize=8192,hard,udp,nolock /" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "" \ >> /etc\$\$IP=192.168.1.${CLIENTID}\$\$/rc.d/rc.local echo "Done."