Now it's time to prepare the server to serve diskless clients.
The first thing todo is build a kernel with the nescesarry stuff in to support root over nfs. Take the following steps to build your kernel:
mknod /dev/nfsroot b 0 255.
rdev <path-to-zImage>/zImage /dev/nfsroot
/etc/rc.d/rc.devfs save /etc/sysconfig
The next step is to create and populate /tftpboot
This is all handled by a big script since putting a long list of commands into this howto seemed pretty useless to me. If you want todo this manual just read the script and type it in as you go ;)
This setup script thus some nasty things like nuke /tmp, temporary kill syslog, umount /proc. So make sure that noone is using the machine during this, and that X isn't running. Just making sure your the only one logged in on a text-console is enough, no need to change runlevels.
DISCLAIMER: this script has been tested but nevertheless if it messes up your server your on your own. I can take no responsibility what so ever. Lett me repeat this howto is only for experienced linux sysadmins. Also this is script is designed to be run once and I really mean once. Running it twice will nuke: /etc/fstab, /etc/X11/XF86Config, /etc/X11/X and /etc/conf.modules.
Now with that said, just cut and paste the script make it executable, execute it and pray to the holy penguin that it works ;)
#!/bin/sh SERVER_NAME=`hostname -s` ### echo creating /etc/rc.d/rc.ws #this basicly just echos the entire script ;) echo "#root on nfs stuff SERVER=$SERVER_NAME #we need proc for mtab, route etc mount -t proc /proc /proc IP=\`ifconfig eth0|grep inet|cut --field 2 -d ':'|cut --field 1 -d ' '\` #if the first mount fails we're probably the server, or atleast something is #pretty wrong, so only do the other stuff if the first mount succeeds mount \$SERVER:/tftpboot/\$IP/sysconfig /etc/sysconfig -o nolock && { #other mounts mount \$SERVER:/home /home -o nolock mount \$SERVER:/ /\$SERVER -o ro,nolock #/var echo Creating /var ... mke2fs -q -i 1024 /dev/ram1 1024 mount /dev/ram1 /var -o defaults,rw cp -a /tftpboot/var / #network stuff . /etc/sysconfig/network HOSTNAME=\`cat /etc/hosts|grep \$IP|cut --field 2\` route add default gw \$GATEWAY ifup lo } #restore devfs settings /etc/rc.d/rc.devfs restore /etc/sysconfig umount /proc" > /etc/rc.d/rc.ws ### echo splitting runlevel 3 for the client and server mv /etc/rc.d/rc3.d /etc/rc.d/rc3.server cp -a /etc/rc.d/rc3.server /etc/rc.d/rc3.ws rm /etc/rc.d/rc3.ws/*network rm /etc/rc.d/rc3.ws/*nfs rm /etc/rc.d/rc3.ws/*nfsfs rm /etc/rc.d/rc3.ws/S99local ln -s /etc/sysconfig/rc.local /etc/rc.d/rc3.ws/S99local ln -s /etc/rc.d/rc3.server /etc/sysconfig/rc3.d ln -s /etc/sysconfig/rc3.d /etc/rc.d/rc3.d ### echo making tmp a link to /var/tmp rm -fR /tmp ln -s var/tmp /tmp ### echo moving various files around and create symlinks for them echo mtab /etc/rc.d/init.d/syslog stop umount /proc touch /proc/mounts mount /proc /etc/rc.d/init.d/syslog start rm /etc/mtab ln -s /proc/mounts /etc/mtab echo fstab mv /etc/fstab /etc/sysconfig ln -s sysconfig/fstab /etc/fstab echo X-config files mkdir /etc/sysconfig/X11 mv /etc/X11/X /etc/sysconfig/X11 ln -s ../sysconfig/X11/X /etc/X11/X mv /etc/X11/XF86Config /etc/sysconfig/X11 ln -s ../sysconfig/X11/XF86Config /etc/X11/XF86Config echo conf.modules mv /etc/conf.modules /etc/sysconfig ln -s sysconfig/conf.modules /etc/conf.modules echo isapnp.conf mv /etc/isapnp.conf /etc/sysconfig ln -s sysconfig/isapnp.conf /etc/isapnp.conf ### echo creating a template dir for the ws directories echo /tftpboot/template mkdir /home/tftpboot ln -s home/tftpboot /tftpboot mkdir /tftpboot/template mkdir /$SERVER_NAME echo root ln -s / /tftpboot/template/root echo sysconfig cp -a /etc/sysconfig /tftpboot/template/sysconfig rm -fR /tftpboot/template/sysconfig/network-scripts ln -s /$SERVER_NAME/etc/sysconfig/network-scripts \ /tftpboot/template/sysconfig/network-scripts echo NETWORKING=yes > /tftpboot/template/sysconfig/network echo `grep "GATEWAY=" /etc/sysconfig/network` >> /tftpboot/template/sysconfig/network echo "/dev/nfsroot / nfs defaults 1 1" > /tftpboot/template/sysconfig/fstab echo "none /proc proc defaults 0 0" >> /tftpboot/template/sysconfig/fstab echo "#!/bin/sh" > /tftpboot/template/sysconfig/rc.local chmod 755 /tftpboot/template/sysconfig/rc.local rm /tftpboot/template/sysconfig/rc3.d ln -s /etc/rc.d/rc3.ws /tftpboot/template/sysconfig/rc3.d rm /tftpboot/template/sysconfig/isapnp.conf echo var cp -a /var /tftpboot/var rm -fR /tftpboot/var/lib ln -s /$SERVER_NAME/var/lib /tftpboot/var/lib rm -fR /tftpboot/var/catman ln -s /$SERVER_NAME/var/catman /tftpboot/var/catman rm -fR /tftpboot/var/log/httpd rm -f /tftpboot/var/log/samba/* for i in `find /tftpboot/var/log -type f`; do cat /dev/null > $i; done rm `find /tftpboot/var/lock -type f` rm `find /tftpboot/var/run -type f` echo /sbin/fsck.nfs echo "#!/bin/sh exit 0" > /sbin/fsck.nfs chmod 755 /sbin/fsck.nfs echo all done
Now we need to make a few manual adjustments to the server:
#for root over nfs workstations. /etc/rc.d/rc.ws
The server must ofcourse export the appropriate filesystems and asign the ip addresses to the clients.
We need to export some dir's for the workstations so for the situation here at the university I would add the following to /etc/exports:
/ *.st.hhs.nl(ro,no_root_squash) /home *.st.hhs.nl(rw,no_root_squash)
Ofcourse use the apropriate domain ;) and restart nfs by typing:
/etc/rc.d/init.d/nfs restart
Note for knfsd users: knfsd doesn't allow you to have multiple exports on one partition with different permissions. Also knfsd doesn't allow clients to go past partition boundaries for example if a client mounts / and /usr is a different partition it won't have access to /usr. Thus if you use knfsd, at least /home should be on a different partition, the server prepare script already puts /tftpboot in /home so that doesn't need a seperate partition. If you've got any other partitions your clients should have access to export them seperatly and add mount commands for them to /etc/rc.d/rc.ws.
/etc/rc.d/init.d/inetd restart