由 北南南北 在 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 密码﹐然后新增帐号后需要同步