NFS和NIS

发表于:2007-07-04来源:作者:点击数: 标签:
使用Te .net 之後您就无需再要在荧幕和键盘之间跑来跑去了。不过通过Telnet连接所使用的档案系统都是远端系统如果您要将资料回存在本地 电脑 上面就不那麽方便了。您有否想过将远端的资料mount进本地的档案系统中呢那麽NFS(NetworkFileSystem)就可以帮到你了
使用 Te.net 之後您就无需再要在荧幕和键盘之间跑来跑去了。不过通过 Telnet 连接所使用的档案系统都是远端系统如果您要将资料回存在本地电脑上面就不那麽方便了。您有否想过将远端的资料 mount 进本地的档案系统中呢那麽NFS(Network File System) 就可以帮到你了。 

另外使用 telnet 的时候您有否发觉到一个麻烦现在的 telnet 已经禁止使用 root 进行登录了您如果要使用到 root 的权限您得使用其他帐号登录然後用 su 切换到 root 的身份去。这样在使用 telnet 之前您就必须为每一个使用者在每一台Linux机器上建立独立的帐号。您是否希望好像 NT 那样有一个中央的 DOMAIN 登录资料库呢有此念头完全正确而好消息是您也可以在 Linux 上面使用 NIS (Network Information Service) 来做到 

我们只需指定某一台 Linux 机器做 NIS 伺服器而其他则可以做为 NIS 客户使用。如果您的网路较大也可以考虑安装 Slave NIS 伺服器来分担 Master NIS 的工作。这里我只说说 NIS Server 和 Client 的设定Slave NIS 则留给您自己去研究了。 

设定NFS

要设定 NFS关键是在 server 那端/etc/exports 这个档案。在下建议您先输入 man exports  


看一下如何设定这个档案。如果这个档案设定错误了以後重新开机的时候您可等得非常不耐烦了。下面是我这里的设定 /tmp (rw,no_root_squash)
/home/public/sw *.siyongc.domain(ro,insecure)
/home/public/upload 192.168.0.22(rw,all_squash,anonuid=2043,anongid=2044)

 


这里您可以看到我将 /tmp 这个目录完全分享出去了在括号里面的‘rw’就是 Read&Write 的意思而‘no_root_squash’呢则是允许让使用者具备 root 的权限在某些特殊情况下例如使用 bootp 登录的无磁碟工作站是相当好用的。因为预设情况下 NFS 会将 root 的身份 squash 为权限较低的 anonymous (nobody) 身份而其它身份则以 client 端机器上当时拥有的 User ID 和 Group ID 来建立档案。 

第二行我将 /home/public/sw 这个目录分享给以 siyongc.domain 这个 domain 做结尾的所有机器而无需使用 secure port (insecure)但只具备唯读权限(ro)。 

第三行我将 /home/public/upload 这个目录只分享给 192.168.0.22 这台机器且具备了读和写的权限(rw)但在 server 上写入的档案必须换成 anonymous 身份进行。但是其後的设定又将所有 anonymous 换成设定的 UID 和 GID这样的安排是要确定所有写入都按指定身份进行。 

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

然後就是重新启动 nfsd  /etc/rc.d/init.d/nfs restart  


测试 NFS

一但 server 设定好了您只需在 client 端输入 mount -t nfs redhat52:/tmp /mnt  


就可以将伺服器端的分享目录 mount 进自己的机器了。 

通常最常见的错误信息是: mount: redhat52:/tmp, reason given by server: Permission denied 

 


造成这样的原因多数是因为 /etc/exports 档案没设定好也就是在分享目录後面的“( )”里面的权限设定建议从简单的设定测试起。或是从 /var/log/messages 这个档案找找原因检查一下被拒绝的原因例如可能会发现客户主机的名称不怎麽对那您就必须要确定 client 的机器名称已经在 /etc/hosts 被“正确”的建立起来或者能够通过 DNS 查询得到(包括正反两解)。 

在我的实践中‘link_relative’有时候会造成‘Unknown keyword’这样会引至 nfsd 无法正常启动。所以当你修改过 NFS 设定最好用下面的 script 来确定 nfsd 能够正常启动才好关机 /etc/rc.d/init.d/nfs stop 
/etc/rc.d/init.d/nfs start  


确定没有 failure 信息才好继续。切记 

如果您碰到 rpc 相关的错误信息可能是您的 portmap 问题了您可以试试将之重新启动: /etc/rc.d/init.d/portmap restart  


不过执行之後请重新启动 nfsd 以及其它所有和 portmap 相关的服务(因为它们会因为 portmap 重启而失效。 

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

有时候您或许会突发兴致给电脑改改名称或转换 domain这样也容易造成 NFS 在启动的时候延迟而且是延迟非常厉害的那种造成这样的问题可能有多方面的如 hostsname 设定不正确或 DNS 那里有误。不过有一个地方您可以考虑的就是把下面这个档案内容清一下 
/var/lib/nfs/rmtab 

如果还有问题先熟读一下 exports 的 man page (man exports)更详细的就请参考 NFS 的 HOWTO 文章。 

设定NIS

首先让我们架设好中央的 NIS 伺服器吧。在设定之前您必须确定网路工作正常。 (以下步骤是本人实践之作或许会有更好的方法的。如果您有更好的主意欢迎告诉网中人。) 

修改 /etc/inetd.conf确定下两行的解(‘#’)给拿掉 time    stream  tcp     nowait  root    internal
time    dgram   udp     wait    root    internal

 



重新启动 inetd /etc/rc.d/init.d/inet restart  


修改 /var/yp/securenets确定有这样的叙述(请针对您的网路设定做适当修改) # Always allow aclearcase/" target="_blank" >ccess for localhost
255.0.0.0       127.0.0.0
# This line gives access to everybody. PLEASE ADJUST!
255.255.255.0   192.168.0.0

 



修改 /etc/ypserv.conf或许会有这样的叙述(但不是很确定是否必须如此) dns: no
*             : passwd.byname    : port       : yes

 



然後输入 rpcinfo -u localhost ypserv  


确定 YP server 是工作的您应该会看到这样的信息 program 100004 version 1 ready and waiting
program 100004 version 2 ready and waiting

 


如果您没看到那就执行 /etc/rc.d/init.d/ypserv start  


同时确定 setup --> System services --> 
[ * ] yppasswdd 和 [ * ] ypserv 。 

然後再重 rpcinfo 确定服务正确的跑起来了。 


建立这两个档案(如果它们不存在的话) touch /etc/gshadow /etc/netgroup  


设定 NIS 的domain name /bin/nisdomainname chen  


最好起一个有别於目前 domain 的名字这主要是出於安全考量。如果以後测试成功的话您可以将这行加进 /etc/rc.d/rc.local 里面同时在 /etc/sysconfig/network 档案里面修改这行 NISDOMAIN=chen

 



然後初始设定 NIS 服务 /usr/lib/yp/ypinit -m  


记住要用 Ctrl + D 来结束不是用 Ctrl + C 哦切记切记 

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


重新启动 ypserver 和 yppasswdd /etc/rc.d/init.d/ypserv restart 
/etc/rc.d/init.d/yppasswdd restart  



然後是设定 NIS Client 。这里是在 redhat62.siyongc.domain (192.168.0.22) 这台机器上面设定 
执行 netconf 然後选择 ‘Network Information System (NIS) 再按 Enter进入後设定好 NIS domain(如chen要和 server 那端一致)和NIS server(如redhat52.siyongc.domain要确定该 server 在 /etc/hosts 里面指定正确)。如果您的系统没有 netconf 也不要紧可以自己修改後面提到的档案(如 /etc/yp.conf 和 /etc/sysconfig/network)。 


接着执行 /bin/nisdomainname chen  



然後修改 /etc/yp.conf加进这行 domain chen 
ypserver redhat52.siyongc.domain

 



然後执行 setup 选择‘System Services’确定 [*]ypbind 被选择了。 


修改 /etc/passwd在末尾加入 +

 



然後启动 ypbind: ypbind 
(或者/etc/rc.d/init.d/ypbind restart)  


测试 NIS

在客户端上面以 root 身份登录之後请输入 ypcat passwd  


看看 server 端的帐号是否被列出来了。 

您也可以执行 getent passwd netman  


这里的‘netman’是在 NIS 伺服器上面的一个使用者帐号名称请改成您欲查询的帐号。这个命令的作用是让我们确定该帐号出现在 NIS 登录之中。如果您看不到任何信息回应那麽好可能上面的步骤(包括伺服器和客户端)还没正确完成您则需要找出原因所在。 

如果您能得到信息回应例如 netman:x:1001:1001::/home/netman:/bin/bash

 


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

然後输入 yppasswd netman 
Please enter root passwd: 
Please enter new passwd: 
Please retype password:  
(#注意: 最後两行是设定 netman 的 NIS password。最好和原来的密码一致因为原来的密码也会被更改为 nis 的密码。) 

其实上面这步不是必须的如果您能够从另外的机器用 NIS帐号登录就可以略过此步骤。 

接着请在本地主机上面建立起该使用者的家目录 mkdir /home/netman 
chown netman:netman /home/netman  


当然了您也可以设定 Linux 在开机的时候通过 NFS 挂载到使用者原本的家目录(tips修改 /etc/fstab)。但如何做您自己去尝试吧这里暂时卖个关子。 

如果该使用者需要使用到本机上面的邮件系统也请为之建立信箱 touch /var/spool/mail/netman 
chown netman:mail /var/spool/mail/netman 
chmod 660 /var/spool/mail/netman  


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

当您有新的使用者增加之後欲加入 NIS 中的话您要先 cd /var/yp 然後执行 make 来更新 nis 资料。如果登录失败重新启动 yppasswdd 服务然後用 yppasswd 来设定他/她的 NIS 密码但要注意一点原使用者帐号必须已经设定过密码管此时可以取而代之为新的密码。然而有趣的是之後您再於原来主机上更改原帐号的密码却不会影响 NIS 的哦。 

如果还有问题您要检查一下 server 端的 ypserv 和 yppasswdd以及 client 端的 ypbind 是否被启动成功(tips执行rpcinfo -p尤其注意 yppasswdd)。其中portmap 是一个很重要的服务(有些系统会显示为 rpcbind)在您执行 ypserv 和 yppasswdd 之前要确定它已经被启动了。如果您需要重启 portmap 要确定所有基於它的服务也要重新启动。 

同时留意一下 client 和 server 的 NIS domain name 是否一致。必要时您或许要执行/usr/lib/yp/ypinit -m重新建立 ypserv 资料但这样您就需要重新执行 yppasswd 来设定使用者的 NIS 密码了。 

设定 NIS在 server 端牵涉的档案比较多诸如 rpcportmapypnsswitch等等。您可以看一下关於 NIS 的HOWTO 文章或相关的 manuals。 

另有一篇和网友的讨论文章我也觉得蛮值得参考一下的:

wkhuang  wrote in message
news:3aZSaR$GvO@bbs.cis.nctu.edu.tw...
> ==> 在 "网中人"  的文章中提到:
> > 2000/05/28
> > 网中人今天对 NIS 系统再进行测试。对原来的文章做了小小修改主要是针对测
试过
> > 程中需要注意的地方增加了说明。希望读者留意和共同参与测试。
> > http://pds.nchu.edu.tw/study_area/linux/linux_nfs.htm
>
> 不知您可否测试一下redhat6.2上yp之後,finger有个小bug。
> 比如同一台电脑是yp server, 也是yp client.

抱歉因为弟还的 RH6.2 还没安装或许过两天再测试吧。

> 在建立yp帐号时,若依照你的方法,你的yp map database的来源,应该是在
> /etc下的一些档案, 主要就是/etc/passwd,/etc/shadow, /etc/group,
/etc/gshadow

嗯的确如此修改 /var/yp/Makefile 里面的参数可以改变预设内容。

> (其实这样不太好,因为这样root,和一些根本不该上yp的帐号都跟着进去了,建议去
> 改/var/yp/Makefile中更改YPPWDDIR = /etc改为某个另外的目录,并将几个
> 档, 如passwd, shadow, group, gshadow拷过去,并只留你想让他上yp的帐号和
> group)

您的建议非常好。不过在弟的 RH6.0 上面 (後面的测试相同)
 ypcat passwd 只会显示 uid 500 以上的使用者不知道是否正常呢

>
> 我遇到的finger的bug(或是linux yp的bug,描述如下)
>
> 若yp map database的来源仍如网中人例中的/etc目录
> 1. 首先先在/etc/passwd和/etc/shadow中建立一个使用者帐号user1,
> 试着把他的fullname 栏位设为空白,就是::

这可以用 useradd 来做。

> 2. 之後让他进入yp的map database,若是已在yp server跑起来之後,应该是
> 到/var/yp下执行make以更新yp map database(这才是正确的)

对。如果是第一次可以执行 /usr/lib/yp/ypinit -m 。

> 3. 要砍掉原本/etc/passwd和/etc/shadow中的user1帐号记录,确定local端
> 无此帐号,由YP Server取得。

只要执行过 make 就可以这样做了。
但风险是假如日後增加使用者重新执行 make 的话
这个帐号在 NIS 中也会消失掉。

使用您刚才的建议(即另设 YPPWDDIR )
在技术上可以化解这个顾虑
但必须手工的修改 passwd 档而不能单纯的 copy 了。

> 4. 测试user1帐号确定可以登入

嗯在我的测试中还必须使用 yppasswd user1 设定密码之後才行
而且原帐号也必须已经经过密码设定。

> 5. 但在这台server兼client上执行finger user1,竟会造成Segmentation
>    fault (core dumped),跑不出正确结果

在我的测试中这个在 client 端执行会出现。
但在 sever 端则工作正常当然了我这台 server 并没有作为其它 server 的
client 。
但测试过 ypbind 向自己(从 ypwhich 可以确定)也没问题。

>
> 後来我依上述方式重建user1帐号,但是full name栏位这次填字进去。
> finger user1命令就正常了。

这个在我的测试中并没有什麽影响和以前的测试一样
client 端出现 Segmentation fault (core dumped)。

> 我试过solaris 2.6, 7, 没这个问题.. :)
> 也试着抓gun finger 1.37.tar.gz要下来装看看, 无奈功力不足, 就是
> make 不成
>
> 有否高手能指点一二呢

对不起小弟绝非高手。
对 NIS 也不熟许多测试还是看到您的回应才(会得)进行。

不过倒非常乐意有其它更有经验的朋友一起来探讨一下。

非常多谢您的 feedback

原文转自:http://www.ltesting.net