现在是时候准备服务器,以便为无盘客户端提供服务。
首先要做的是构建一个内核,其中包含支持 root over nfs 的必要组件。 按照以下步骤构建您的内核
mknod /dev/nfsroot b 0 255.
rdev <path-to-zImage>/zImage /dev/nfsroot
/etc/rc.d/rc.devfs save /etc/sysconfig
下一步是创建和填充 /tftpboot
这一切都由一个大型脚本处理,因为将一长串命令放入此 howto 对我来说似乎毫无意义。 如果您想手动执行此操作,只需阅读脚本并在您进行时键入即可 ;)
因此,此设置脚本会执行一些糟糕的事情,例如清除 /tmp、临时杀死 syslog、卸载 /proc。 因此,请确保在此期间没有人使用该机器,并且 X 没有运行。 只需确保您是唯一登录到文本控制台的人就足够了,无需更改运行级别。
免责声明:此脚本已经过测试,但尽管如此,如果它搞砸了您的服务器,您将自行承担责任。 我不承担任何责任。 让我重申一遍,此 howto 仅适用于有经验的 linux 系统管理员。 此外,此脚本旨在运行一次,我真的是指一次。 运行两次将清除:/etc/fstab, /etc/X11/XF86Config, /etc/X11/X 和 /etc/conf.modules。
现在说了这么多,只需剪切并粘贴脚本,使其可执行,执行它并祈祷神圣的企鹅让它工作 ;)
#!/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
现在我们需要对服务器进行一些手动调整
#for root over nfs workstations. /etc/rc.d/rc.ws
服务器当然必须导出适当的文件系统并为客户端分配 ip 地址。
我们需要为工作站导出一些目录,因此对于大学这里的情况,我将在 /etc/exports 中添加以下内容
/ *.st.hhs.nl(ro,no_root_squash) /home *.st.hhs.nl(rw,no_root_squash)
当然,使用适当的域 ;) 并通过键入以下命令重新启动 nfs
/etc/rc.d/init.d/nfs restart
knfsd 用户注意事项:knfsd 不允许您在一个分区上使用具有不同权限的多个导出。 此外,knfsd 不允许客户端超出分区边界,例如,如果客户端挂载 / 并且 /usr 是不同的分区,则它将无法访问 /usr。 因此,如果您使用 knfsd,则至少 /home 应该位于不同的分区上,服务器准备脚本已经将 /tftpboot 放在 /home 中,因此不需要单独的分区。 如果您有任何其他分区,您的客户端应该有权访问它们,请分别导出它们,并将它们的挂载命令添加到 /etc/rc.d/rc.ws。
/etc/rc.d/init.d/inetd restart