NFS & Automount

项目选择


NFS (Network FileSystem)

在 Unix/Linux 的世界中,用来做资料交换存取最常用的方法,莫过於 NFS (Network FileSystem) 机制了,它最早是由 Sun 所提出的,而后来在 Unix/Linux 上一直被广泛的使用。

使用 NFS,它最大的特色就是使用 RPC (Remote Procedure Call) 做 Port 对应,而做 Port 对应的工作,是使用 pormap 来做的,也就是说,一旦决定要使用 NFS 来使 Unix/Linux 之间的档案交换,那么就需要先启动 portmap 来使 RPC 控制,如此 NFS 才能使用。

NFS 分享设定

首先,在做 NFS 分享前,要先编好设定档 /etc/exports,内容非常简单,我们就来看看以下实做吧:

[root@ldap-dns /]# vi /etc/exports
====================================
/misc 192.168.1.0/24(ro)
====================================
[root@ldap-dns /]#

好了,这样设定完,只要是 192.168.1.0/24 的机器都可以来挂载,但是只能读取 (Read Only) 不可写入。

当然,如果你要开於其它权限的话,可以参考下面的参数:

  • ro
    这个分享目录只能唯读。
  • rw
    这个分享目录可以读取和写入。
  • root_squash
    Client 若是以 root 存取,那么会把 root 的权限改为和 anonymous 一样。
  • no_root_squash
    Client 若是以 root 存取,那么就不限制权限。
  • all_squash
    无若 Client 是否为 root,其权限都只跟 anonymous 一样。

启动 NFS 服务

首先,一定要记得启动 NFS 之前一定要先把 portmap 启动才行,否则会出错:

[root@ldap-dns /]# service portmap start
Starting portmap: [ OK ]
[root@ldap-dns /]# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
[root@ldap-dns /]#

Only for SuSE

若你的系统是使用 SuSE,那么因为系统没有 service 指令,所以无法使用 service 来启动 portmap,但启动方法也很简单:

suse:/etc/init.d # /etc/init.d/portmap start
Starting RPC portmap daemon done
suse:/etc/init.d /etc/init.d/nfsserver start
Starting kernel based NFS server done
suse:/etc/init.d #

启动之后,可以使用 showmount 看看有分享那些目录:

[root@ldap-dns /]# showmount -e
Export list for ldap-dns.l-penguin.idv.tw:
/misc 192.168.1.0/24
[root@ldap-dns /]#[root@ldap-dns /]# showmount -e
Export list for ldap-dns.l-penguin.idv.tw:
/misc 192.168.1.0/24
[root@ldap-dns /]#

你可以使用 rpcinfo 这个工具来看看有那些服务使用 rpc 资源:

[root@ldap-dns misc]# rpcinfo -p 192.168.1.211
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 828 rquotad
100011 2 udp 828 rquotad
100011 1 tcp 831 rquotad
100011 2 tcp 831 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 udp 1028 nlockmgr
100021 3 udp 1028 nlockmgr
100021 4 udp 1028 nlockmgr
100021 1 tcp 1037 nlockmgr
100021 3 tcp 1037 nlockmgr
100021 4 tcp 1037 nlockmgr
100005 1 udp 844 mountd
100005 1 tcp 847 mountd
100005 2 udp 844 mountd
100005 2 tcp 847 mountd
100005 3 udp 844 mountd
100005 3 tcp 847 mountd
[root@ldap-dns misc]#

Client 存取设定

若要使用网路上分享出来的 NFS 资源的话,使用 mount 指令就可以帮我们解决了,但是还有一个最重要的前提是,千万不要忘了先把 portmap 启动,如此才能正确的挂载:

[root@mailgw ~]# service portmap start
Starting portmap: [ OK ]
[root@mailgw ~]# mount -t nfs -o ro,soft,intr,timeo=10 192.168.1.211:/misc /mnt
[root@mailgw ~]#

上面的 option 选项里,记得要下 "soft,intr,timeo" 来指定挂载逾时和软性挂载,指定软性挂载的好处是,在 NFS Server 没有回应或关机时,避免 Client 会完全停掉而无法无应,此时就算是关机也无法解决。

当然,你可以使用 mount 指令看看目前有那些目录被挂载起来:

[root@mailgw mnt]# mount
192.168.1.211:/misc on /mnt type nfs (ro,soft,intr,timeo=10,addr=192.168.1.211)
[root@mailgw mnt]#

上面只截取 NFS 挂载部份。

现在,就来看看 /mnt 里,是否能看到 192.168.1.211 分享出来的 /misc 目录:

[root@mailgw mnt]# ls -l /mnt
total 8
-rw-r--r-- 1 root root 0 Aug 17 22:38 example
drwxr-xr-x 2 root root 4096 Aug 17 22:39 java
drwxr-xr-x 2 root root 4096 Aug 17 22:39 tomcat
[root@mailgw mnt]#

当然,可想而知,你是不可以在上面建立档案的,因为在 NFS Server 挂载的选项就是只能唯读呀!

Automount

使用了 NFS 之后,我想大家应该会知道,若大家连线越多,那么对 Server 的资源也就浩用越大,若是 Client 能设定成只在需要的时候才自动挂上必要的目录,而在一段时间之后若没有再使用就卸载,如此对於 Server 的使用也能相对的减少资源使用。

autofs 可以用来自动挂载资料,也就是我们这次的重点,而 autofs 是一个 daemon,一旦启动后它会驻列在系统中,他会先载入设定档然后监视指定的目录,一旦使用者要存取所指定的目录时就会开始自动挂载起来。以下的范列,我将示范在主机里分享 /home 目录可供 Client 挂载,而在 Server 的设定,完全就跟往前一样设定好分享条件,然后启动 NFS 就可以了。所以我们要调整的是 Client 的部份。

/etc/auto.master

auto.master 主要是设定需要监控那一个目录,然后再指定其设定档:

[root@mailgw ~]# vi /etc/auto.master
=====================================
/home /etc/auto.home --timeout=30
=====================================

上面的意思是,autofs 要去监控 /home 目录,而设定档在 /etc/auto.home 这个档案里,而 timeout 时间是 30 秒。

Only for SuSE

若你的系统是使用 SuSE,那么请改为下面的设定:

[root@mailgw ~]# vi /etc/auto.master
=====================================
/home /etc/auto.home "--timeout 30"
=====================================

/etc/auto.home

auto.home 是由 auto.master 设定而来的,里面设定了 /home 目录下的挂载来源和参数:

[root@mailgw ~]# vi /etc/auto.home
=====================================
* -rw,soft,intr 192.168.1.211:/home/&
=====================================

上面的意思是,/home 目录下的任何子目录,其子目录都可以读写,并且是软性挂载,而来源是 192.168.1.211 的 /home 目录。"&" 的意思是,对应到 "*" 的值,若是要进入 /home/steven 时,那么就会自动把 192.168.1.211 的 /home/steven 挂进来。

启动 autofs

要启动 autofs 之前,因为我们的来源是使用 NFS,所以 portmap 是一定要先开的,再来启动 autofs。

[root@mailgw ~]# service portmap start
Starting portmap: [ OK ]
[root@mailgw ~]# service autofs start
Starting automount: [ OK ]
[root@mailgw ~]#
Only for SuSE

若你的系统是使用 SuSE Linux,设定方法都是一样的,而启动方法则请参考下面的范例:

suse:/var/log # /etc/init.d/autofs start
Starting service automounter/usr/sbin/automount: done
suse:/var/log #

现在再来看看目前的 mount 状态:

[root@mailgw ~]# mount
/dev/sda1 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
automount(pid2774) on /home type autofs (rw,fd=4,pgrp=2774,minproto=2,maxproto=4)
[root@mailgw ~]#

上面可以看到 automount 正在监控 /home 目录,而且为我们还没有进入 /home 目录里的任何资料夹,所以会没有其它的 mount 资讯。

现在可以试著进入 /home/steven 这个资料夹里:

[root@mailgw ~]# cd /home/steven
[root@mailgw steven]#

接著马上来看看 mount 的变化:

[root@mailgw steven]# mount
/dev/sda1 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
automount(pid2774) on /home type autofs (rw,fd=4,pgrp=2774,minproto=2,maxproto=4)
192.168.1.211:/home/steven on /home/steven type nfs (rw,soft,intr,addr=192.168.1 .211)
[root@mailgw steven]#

看到了吧,最后一行正显示著 192.168.1.211 的 /home/steven 正被我们挂载。

08/21/2005


首页