下一步 上一步 目录

3. 准备服务器

现在是时候准备服务器,以便为无盘客户端提供服务。

3.1 构建内核

首先要做的是构建一个内核,其中包含支持 root over nfs 的必要组件。 按照以下步骤构建您的内核

  1. 由于我们将使用带有 kernel-2.2 的 redhat-5.2,您应该确保您的 redhat-5.2 已为 kernel-2.2 做好准备。 RedHat 有一个关于此的优秀 howto。
  2. 我为服务器和工作站 (ws) 使用相同的内核,以避免模块冲突,因为它们共享相同的 /lib/modules。 如果在您的情况下这不可能,请通过编辑内核顶级 makefile 中的版本号来伪造不同的内核版本。 这些不同的版本号将避免任何冲突。
  3. 除了通常的内容外,内核还应具有以下内容
  4. 需要编辑 kernel-src 以使默认的 root-over-nfs 挂载点为: /tftpboot/<ip>/root 而不是仅仅 /tftpboot/<ip>。 这是为了在 /tftpboot 中获得一个干净的树,每个工作站一个目录,其中包含它的 root 目录(指向实际服务器 root 目录的链接)和任何工作站特定的目录。
  5. 现在像往常一样编译内核,请参阅 kernel-howto。
  6. 如果您还没有 /dev/nfsroot,请通过键入以下命令创建它
    mknod /dev/nfsroot b 0 255.
  7. 编译内核后,通过键入以下命令将 root 设置为 nfsroot
    rdev <path-to-zImage>/zImage /dev/nfsroot
  8. 在使用 devfs 启动之前,您需要对 /etc/conf.modules 进行一些更改,将 devfs 文档中 conf.modules 的内容附加到它。
  9. 由于这个新内核是为 ip 的自动配置编译的,它会在启动期间尝试自动配置服务器的 ip。 这当然会失败,因为它会分配 ip。 为了避免长时间超时,请将: append="ip=off" 添加到 /etc/lilo.conf 的 linux 部分。
  10. 运行 lilo 并启动新内核。
  11. 由于 devfs,您将丢失服务器上的所有符号链接。 在 redhat 中,这通常是 /dev/mouse 和 /dev/cdrom。 重新创建这些。 如果您还曾经使用特殊的属主关系,请 chown 到 /dev 中适当的文件。 现在保存 /dev 设置(在 /etc/sysconfig 中,因为它们可能是工作站特定的)

3.2 创建和填充 /tftpboot,为 /tmp 等创建符号链接。

下一步是创建和填充 /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
 

手动调整一些文件

现在我们需要对服务器进行一些手动调整

  1. ws 设置脚本必须在 rc.sysinit 的最开始处被 source,因此在设置 PATH 后立即添加以下行
    #for root over nfs workstations.
    /etc/rc.d/rc.ws
      
    

  2. 将 /etc/rc.d/rc3.ws 剥离到最基本的状态。 创建类似 rc.local.ws 的东西可能很有用,但这取决于您。 网络和 nfsfs 已经设置好了。以下内容已被自动化脚本删除/更新

3.3 导出适当的文件系统并设置 bootp

服务器当然必须导出适当的文件系统并为客户端分配 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。

设置 bootp

  1. 如果尚未安装 bootp,请安装它。 它随 RedHat 一起提供。
  2. 编辑 /etc/inetd.conf 并取消注释以 bootps 开头的行,如果您想使用 bootprom,请同时取消注释 tftp。
  3. 通过键入以下命令重新启动 inetd
    /etc/rc.d/init.d/inetd restart

下一步 上一步 目录