NFS 和 NIS 发挥网络功能[转帖]

由 北南南北 在 04-30-2002 13:50 发表:

NFS 和 NIS 发挥网络功能

NFS 和 NIS 发挥网络功能

作者未知[如果知道的弟兄请来电子邮件告之]

本篇文章来自一张D版光盘

当您的 Linux 主机安装好并连上网络之后﹐那么很自然会进行远程操作吧。最常用的服务就是 telnet 了﹐它可以让您从一台机器登录到另外一台机器﹐然后完成所有远程的作业。使用 telnet ﹐有点像“网络基础”中的“Telecommunication”那里所说的 remote control ﹐也就是﹐您可以利用其它机器键盘和荧幕远程使用 Linux 主机。如果您使用 Windows 98 连接 Linux 的话﹕

按 ‘开始’--> ‘执行’--> 然后输入﹕ telnet 192.168.100.23 (如果 dns 或 hosts 档案设定好了﹐可以输入机器名称)﹐您就会看到一个登录画面了﹐不过﹐先别急着输入您的大名和密码﹐做做下面的动作﹕

联机 --> 中断

联机 --> 远程系统 --> Term Type:

选择 DEC-VT100

按‘联机’

然后再进行登录不迟。为什么这样做﹖我也不知道啦﹐本来我用以前的 Redhat 好好的﹐但后来换了 Redhat 6.0 之后﹐只要进入 vi 等文书编辑器﹐方向键就不听使唤了﹐只有做了上面动作才可以。后来发现﹐只要在 /etc/bashrc 档案里面加下面这一行就解决了﹕

export TERM=vt100

然而﹐在 RH7.1 上面预设是将 telnet 功能关闭的﹐您得修改 /etc/xinetd.d/telnet 里面的设定﹐设定 disable = no 才可以提供 telnet 服务。不过﹐系统之所以要关闭 telnet ﹐是因为它在网络上使用明码(clear text) 方式传送数据的缘故。为此﹐在 RH7.1 上面使用 ssh 服务来取代 telnet 服务﹐只是再提醒您一次﹕能用 ssh 就不要用 telnet ﹗

Okay﹐不管您使用 telnet 还是 ssh﹐所使用的档案系统和资源都在远程系统上面﹐如果您要将资料回存在本地计算机上面就不那么方便了。除了用 ftp 之外﹐您有否想过将远程的资料 mount 进本地的档案系统中呢﹖那么﹐NFS(Network File System) 就可以帮到你了。

另外﹐在网络环境中﹐理想的情况下是让使用者能够从网络上任何一台系统进行登录﹐也只有这样﹐您才能在登录之后使用 telnet 服务。然而﹐为了让使用者能够在网络上登录﹐您就必须为每一个使用者在所有 Linux 机器上建立独立的帐号。是否太麻烦了呢﹖您是否希望 Linux 能像 NT 那样有一个中央的 DOMAIN 登录数据库呢﹖有此念头完全正确﹐而好消息是﹕您在 Linux 上面使用 NIS (Network InFORMation Service) 就能做到﹗

或许﹐在一些大型的网络服务器设计上﹐例如设定多台 email server 来进行 load balancing 服务﹐除了前端需要 DNS 和其它一些负载分流技术之外﹐在后端﹐也不能避免的碰到帐号同步和资料同步的需求。前端的技术我们留代日后慢慢探讨﹐至于后端的技术﹐完全可以用 NFS 和 NIS 来做到。这也是我们这章的重点﹐假如您是一个 windows 用户﹐在看完下面的文章后﹐肯定让您震撼于 Linux 的强大网络功能而目瞪口呆﹗

先将我的网络环境说说吧(您可以参考上一章所介绍的环境)﹕

系统

主机名称

IP 地址

伺服端

RedHat 7.1

rh71.siyongc.domain

192.168.100.23

客户端

Mandrak 8.0

mdk.siyongc.domain

192.168.100.24

设定 NFS

请先确定 nfs-utils 套件有装起来(rpm -qa | grep nfs)﹐如果没有﹐请用 rpm 安装。假如需要在一开机的时候就激活 nfs 服务的话﹐那就用 ntsysv 将 nfs 选起来吧。喜欢的话﹐把 nfslock 也一并开启也无妨(请 man lockd)。

事实上﹐要设定 NFS 一点都不难﹐关键是 server 那端﹕/etc/exports 这个档案。在真正动手设定之前﹐我建议您先看看它的 manual ﹕

man 5 exports

请小心设定这个档﹐如果设定错误了﹐以后重新开机的时候您可就得非常不耐烦了。我是这样设定﹕﹕

/tmp *(rw,no_root_squash)

/usr/src .siyongc.domain(ro,insecure) 192.168.100.(ro,insecure)

/var/ftp/pub/incoming 192.168.100.24(rw,all_squash,anonuid=50,anongid=50)

第一行﹐我将 /tmp 这个目录完全分享出去了﹐不管客户端来自哪里。在括号里面的‘rw’就是 Read&Write 的意思﹐而‘no_root_squash’呢﹐则是允许让使用者具备 root 的权限﹐在某些特殊情况下﹐例如使用 bootp 登录的无磁盘工作站﹐是相当好用的。因为预设情况下 NFS 会将 root 的身份 squash 为权限最低的 anonymous (nobody) 身份﹐而其它身份则以 client 端机器上当时拥有的 User ID 和 Group ID (指号码的值)来建立档案。注意哦﹐在进权限判断的时候﹐ 不是以 UserName 来作为身份依据哦﹐UID 和 GID 的号码最后必须对应到 server 端的 /etc/passwd ﹐而非 client 那边的。

第二行﹐我将 /usr/src 这个目录分享给以 siyongc.domain 这个 domain 做结尾或是以 192.168.100 开头的所有机器﹐而无需使用 secure port (insecure)﹐但只具备只读权限(ro)。这里﹐您要留意 " * " 的使用﹐在一些旧版本的 NFS 您不能用在 IP 上。不过﹐我这里的测试却是可行的。

第三行﹐我将 /var/ftp/pub/incoming 这个目录只分享给 192.168.0.22 这台机器﹐且具备了读和写的权限(rw)﹐但在 server 上写入的档案﹐必须换成 anonymous 身份进行。但是其后的设定又将所有 anonymous 换成设定的 UID 和 GID (这里都是 ftp)﹐这样的安排是要确定所有存取都按指定身份进行。这个 incoming 目录预设是不存在的﹐日后在讨论到 FTP 服务设定时候会提到﹐但您可以自行用 mkdir 建立﹐而且为 group 和 others 加上 +w 权限以及 sgid 和 sticky bit (3777)。

Tips﹕如果您不知道或不想直接修改 /etc/exports 档案﹐您可以使用 netconf 然后选择‘Exported file system (NFS)’来进行设定。

完成 exports 设定后﹐就是重新激活 nfsd ﹕

service nfs stop

service nfs start

哦﹐我不建议您用 restart 来进行﹐最好用 stop 和 start ﹐并且重复两次﹐确定在第二次 stop 的时候﹐没看到红色的 [ FAILED ] 信息。因为我发现如果设定不正确﹐就算您执行 start ﹐也看到了四个 [ OK] ﹐但事实上未必真的成功跑起来﹐只能在 stop 的时候才能发现。另外一个原因是﹕如果设定错误﹐很可能导致 nfs 在激活的时候要等非常久的时间﹐这是不胜其烦的﹐尤其在开机的时候。所以﹐当您每次修改完 nfs 的设定﹐一定要 stop 再 start 看看﹐没问题才关机﹐否则下次开机可要培养耐性了。

Tips﹕如果您确定 /etc/exports 档设定无误﹐要重新读取其设定﹐只需输入如下命令就可以了﹕

exportfs -rv

假如有错误的话﹐应该会得到提示的。

为求确定﹐您最好执行﹕

showmount -e localhost

如果这个命令不能正确显示您所 export 的内容﹐那就重新检查设定步骤吧。

测试 NFS

一但 server 设定好之后﹐您只需在 client 端建立 mount point﹐然后用 mount 命令来挂载即可。不过﹐mount 之前最好用 showmount 来确定一下﹕

showmount -e rh71

Tips﹕假如在 server 那边 showmount -e localhost 有结果﹐而在 client 这边 showmount -e server 却不成功﹐那可能是防火墙或是 xinetd 的问题(参考后面的说明)。当然﹐前提是要确定联机是通的啦﹐ping 一下就知道了。

当 showmount 能顺利找到 server 的 exports 之后﹐那就可以放心 mount 了﹕

mkdir /mnt/nfs

mount -t nfs -o bg,soft,intr rh71:/tmp /mnt/nfs

然后﹐就好象自己的硬盘一样使用~~ 要卸载它﹐用 umount 命令就可以。不过﹐如果没有那些 -o 参数﹐然后在卸载之前您将 server 的 nfs 关闭了﹐或是网络联机出了问题﹐这时候再进行 umount 的话﹐很可能将您的机器‘定格’在那里哦﹗﹗小心小心~~~ 所以﹐最好在 mount 的时候加上 soft 参数﹐并且在关闭 nfs 服务器端之前﹐一定要先将所有的 client 所挂载的 mount point 进行 umount 才好进行。

Tips﹕如果 client 机器在激活的时候能连上网络﹐您还可以直接将挂载写进 /etc/fstab 檔中呢﹗

如果您遇到问题﹐通常最常见的错误信息是﹕

mount: xxxxx:/yyyyyyyy, reason given by server: Permission denied

造成这样的原因多数是 /etc/exports 档案没设定好的缘故﹐也就是在分享目录后面的“( )”里面的权限设定﹐建议从简单的设定测试起﹐例如 "/tmp *(ro)"。或是从 /var/log/messages 这个档案找找原因﹐检查一下被拒绝的原因。

还有﹐您最好确定 client 和 server 的机器名称已经在 /etc/hosts 被“正确”的设定起来﹐或者能够通过 DNS 查询得到(包括正反两解)。

在我的实践中﹐‘link_relative’有时候会造成‘Unknown keyword’﹐这样会引至 nfsd 无法正常激活﹐测试的时候请留意。

如果您碰到 rpc 相关的错误信息﹐例如﹕

mount: RPC: Unable to receive; errno = Connection refused

可能出现的问题很多﹐首先确定 portmap 服务是否有跑起来﹐可以用 rpcinfo 来检查﹕

rpcinfo -p rh71

如果没发现用 portmapper 的服务﹐您可以试试将之重新激活﹕

service portmap restart

不过﹐执行之后﹐请重新激活 nfs ﹐以及其它所有和 portmap 相关的服务(因为它们会因为 portmap 重启而失效(最好用 rpcinfo 来确认)。

还有另外的情形﹐可能是 portmap (tcp & udp port 111) 的联机被防火墙挡掉了。或是 xinetd 那边没开放 portmap 服务﹐例如在 /etc/hosts.deny 中设定了 "ALL: ALL"﹐那您可以修改 /etc/hosts.allow ﹕

portmap: 192.168.100., .siyongc.domain

还有﹐就是可能 nfs 还没起来﹐请确定服务能正确跑起来﹐可以用 stop 和 start 或是 rpcinfo 来判断。

另外﹐当您升级 server 的 kernal 之后﹐最好也将 client 的 kernal 一起同步。否则您会遇到 mount version 的警告﹐不过﹐您还是可以成功的实现 nfs mount 这动作。

有时候﹐您或许会突发兴致给计算机改改主机名称或转换 domain﹐这样也容易造成 NFS 在激活的时候延迟﹐而且是延迟得难以忍受﹗造成这样的问题可能有多方面的﹐如 hostsname 设定不正确﹐或 DNS 那里有误。不过﹐有一个地方您可以考虑的﹐就是把这个档案内容清一清﹕/var/lib/nfs/rmtab

如果还有问题﹐先熟读一下 exports 的 man page (man 5 exports)﹐更详细的就请参考 NFS 的帮助 文件。

设定 NIS

设定 NIS 一点都不难~~ 嘿嘿﹐又来了~~~

难的是当它不工作的时候却不知道问题出在哪里﹖哈哈﹐废话~~

好了﹐言归正传。我们只需指定某一台 Linux 机器做 NIS 服务器﹐然后其它机器就老实的当 NIS 客户就好了。如果您的网络较大﹐也可以考虑安装 Slave NIS 服务器来分担 Master NIS 的工作。不过﹐我们这里只说说 NIS Server 和 Client 的设定﹐Slave NIS 则留给您自己去研究了﹐若有成果的话﹐最好能回来和大家分享分享。

或许﹐您还听说过 NIS+ 这个名称﹐它是 NIS 增强版本﹐尤其在网络安全方面有所改善。不过﹐这里不针对 NIS+ 说明了。

首先﹐让我们架设好中央的 NIS 服务器吧。

在设定之前﹐您必须确定网络工作正常﹐例如联机﹑hosts﹑xined﹑诸如此类的﹐这应该不用多提了吧。

再来确定 ypserv 套件有安装起来(rpm -qa | grep yp)﹐否则用 rpm 安装。

执行 ntsysv 将 ypserv 和 yppasswdd 选择起来﹐确定在开机的时候就能抓取到。

修改 /etc/xined.d 目录下面的 time 和 time-udp 两个档案﹐确定 "disable = no" 。﹕

重新激活 xinetd﹕

service xinetd restart

修改 /var/yp/securenets﹐确定有这样的叙述(请针对您的网络设定做适当修改)﹕

Always allow access for localhost

255.0.0.0 127.0.0.0

This line gives access to everybody. PLEASE ADJUST!

#0.0.0.0 0.0.0.0

255.255.255.0 192.168.100.0

接下来﹐输入﹕

rpcinfo -u localhost ypserv

6. 确定 ypserv 是工作的﹐您应该会看到这样的信息﹕

program 100004 version 1 ready and waiting

program 100004 version 2 ready and waiting

7. 如果您没看到﹐那就执行﹕

service ypserv start

8. 重复同样的步骤﹐确定 yppasswdd 也是工作的。并且用 rpcinfo -p localhost 确定 ypserv 和 yppasswdd 均列其上。

接下来﹐建立这下面两个档案(如果它们不存在的话)﹕

设定 NIS 的domain name﹕

nisdomainname chen

注﹕最好起一个有别于目前 domain 的名字﹐这主要是出于安全考量。 您可以将上面这行命令加进 /etc/rc.d/rc.local 里面。 (不过我在实作上﹐发现 server 端不设定 nisdomainname 也可以的﹐不知道是否真的﹖)

touch /etc/gshadow /etc/netgroup

然后初始设定 NIS 服务﹕

/usr/lib/yp/ypinit -m

11.记住要用 Ctrl + D 来结束﹐不是用 Ctrl + C 哦﹐切记切记﹗

12.然后输入 y 按 Enter 。

13.注﹕每次您新增了帐号﹐或修改过 /etc/passwd 档﹐都要重复这个动作。

14.留意一下有否错误﹐有则根据信息做适当修改﹐无则继续。例如﹐如果它响应说 "No rule to mak target xxxxxx, needed by yyyyyyyy."﹐通常是在 /etc 下面找不到档案而已﹐用 touch /etc/xxxxxxx 就可以解决之。

重新激活 ypserver 和 yppasswdd﹕

service ypserv restart

service yppasswdd restart

为求保险﹐最好用 rpcinfo 命令来确认一下。就这样﹐NIS 的 server 就设定好了﹗很容易~~ 没骗您吧﹖^_^

设定 NIS client

接下来﹐是设定 NIS Client 。这里是在 mdk.siyongc.domain (192.168.100.24) 这台机器上面设定﹕

先确定 ypbind 和 yp-tools 套件有安装起来(rpm -qa | grep yp)﹐否则用 rpm 安装。并执行 ntsysv﹐确定 ypbind 被选择了。

再来执行﹕

/bin/nisdomainname chen

然后修改 /etc/yp.conf﹐加进这两行﹕

domain chen

ypserver redhat52.siyongc.domain

注﹕必须确定 client 和 server 的 nisdomain 一致。并修改 /etc/sysconfig/network 檔中的句子(不存在则自行建立)﹕

NISDOMAIN=chen

修改 /etc/passwd﹐在末尾加入﹕

+:::::: # 就是 + 号后带六个小数点﹐之间没空格键。

然后激活 ypbind﹕

service ypbind restart

如果顺利这命令很快就完成﹐要不然要检查 server 和 client 双方的设定和联机了。

测试 NIS

接下来﹐就是检验劳动成果的时候了。先以 root 身份登入 server﹐并新增一个测试帐号﹕

useradd ypu1

passwd ypu1

然后转到客户端上面以 root 身份登录﹐并输入﹕

ypcat passwd

如果顺利的话﹐ server 端 UID 大于 500 的帐号都会被列出来。您也可以执行下面命令来确定某帐号是否出现在 NIS 登录之中﹕

getent passwd ypu1

假如您看不到任何信息响应﹐那么﹐很可能是前面的步骤(包括服务器和客户端)还没正确完成﹐您则需要找出原因所在。

如果您能得到信息响应﹐例如﹕

ypu1:$1$BzYQtUua$n68UwKiNVDjWS/UJGHFU4/:1001:1001::/home/ypu1:/bin/bash

那是好消息﹗否则您得从头进行 debug 方好继续。

当上一步骤过关之后﹐如果您觉得有需要﹐那您可以再修改帐号的 yp 密码。但这步不是必须的﹐如果您能够从另外的机器用 NIS 帐号登录就可以略过此步骤(我建议您不必修改 yp 密码)。﹕

yppasswd ypu1

Please enter root passwd:

Please enter new passwd:

Please retype password:

注意﹕第一行是 root 密码﹐最后两行是设定 yp 的 NIS password。最好和原来的密码一致﹐因为原来的密码也会被更改为 nis 的密码﹐小心﹗(请参考后面的说明)

接着请在本地主机上面建立起该使用者的家目录﹕

cp -a /etc/skel /home/ypu1

chown -R ypu1.ypu1 /home/ypu1

这样﹐您就可以使用 NIS 登录了﹗

当然﹐您也可以设定 Linux 在开机的时候通过 NFS 挂载到使用者原本的家目录(tips﹕修改 /etc/fstab)。但如何做﹖您自己去尝试吧﹐这里暂时卖个关子。不过﹐下面我有更好的提议﹐请不要错过了哦~~

在使用 NIS 的时候﹐您需要注意的地方大致有如下这些﹕

当您有新的使用者增加之后﹐或是执行过 usermod﹐或是修改过 /etc/passwd 檔﹐您要 cd /var/yp 然后执行 make (或重新执行 /usr/lib/yp/ypinit -m) 以更新 nis 资料。但这样做的结果﹐会将 yp 密码同步为系统的密码。如果在 client 端以 root 身份执行 yppasswd 来重设 NIS 帐号的密码的话﹐新帐号必须已经设定过系统密码﹐但执行 yppasswd 之后﹐会将系统密码同步为 yp 密码。然而有趣的是﹐之后您再于 server 主机上更改原帐号的密码﹐却不会影响 NIS 的哦﹐不过 user 在 client 端却只能用 yppasswd 而不能用 passwd 来修改密码。

但这似乎是个矛盾﹕修改了 yp 密码会改变系统密码﹐修改系统密码却不改变 yp 密码﹐然后新增帐号后需要同步

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus