讲解NFS服务器的使用
NFS的使用,我们通常是在Linux一级Unix系统下完成的。那么对于这个NFS服务器的应用,你是否有所了解呢?这里,我们就来介绍一下有关的知识。NFS是一种Unix之间通过网络共享文件的标准方式.使用NFS,就能够透明的安装和访问网络上远程主机上的文件系统,将其安装到本机的文件系统中.
NFS客户支持
安装NFS服务器上的文件系统的方式与安装本机磁盘文件系统非常相似,同样是通过 mount命令:
# mount nfssrv:/exports /mnt
这个命令将nfssrv主机上的/exports目录安装到本机的/mnt目录下.可以看到安装 NFS与本地磁盘文件系统的不同在于 ── 文件系统的描述方法不同.本地磁盘文件系统使用/dev下的设备文件来描述,而NFS文件系统使用远程主机名和主机上的共享目录名(中间使用:分隔)来描述.当然其执行的实质是不同的,事实上mount根据文件系统的类型,执行mount_nfs来真正安装nfs文件系统.
/mnt应该是本地文件系统上的一个空目录,没有安装其他文件系统.如果这个目录非空,那么使用mount之后,原有的本地文件系统中的内容将不可被访问,只能看到新安装上的文件系统中的内容.
由此来看,NFS客户不需要进行复杂的配置,只需知道NFS服务器的主机名和共享出的目录名即可.事实上,知道了NFS服务器的主机名,就可以使用showmount命令,来查看这台服务器共享出的目录名和访问限制.
# showmount -e nfssrv
使用NFS文件系统只需要内核支持,而不需其他额外设置,但是同时使用nfsiod进程能够提供高效的缓冲机制,从而改善nfs文件系统的性能,应该可以在装载NFS文件系统之前执行这个守护进程.
# nfsiod -n 4
参数-n 4用于限制nfsiod的副本数量,每一个nfsiod用于辅助处理一次I/O操作,因此如果通过NFS文件系统进行频繁的I/O操作,就要考虑增加nfsiod的副本数量.
由于使用nfsiod能够提升系统性能,对于NFS客户计算机,就可以在系统启动时执行这个守护进程.这需要在FreeBSD的系统配置文件rc.conf中设置nfs_client_enable参数的值为"YES",系统启动时就自动执行nfsiod.
使用fstab
对于经常用到的NFS文件系统,并且提供NFS服务的Unix主机也非常可靠.那么就可以将这些系统加入/etc/fstab文件中,在系统启动时自动安装该NFS文件系统.由于NFS文件系统不在本地,因此在服务器不能提供NFS服务时就会造成故障,系统会遇到启动障碍,而不同正常启动.因此对于一台不稳定的服务器系统,最好不要使用/etc/fstab来装载NFS文件系统,或者在/etc/fstab的设置参数选项中使用noauto参数,不让系统自动装载这个文件系统.
# DeviceMountpoint FStype Options DumpPass#
/dev/wd0s3b noneswapsw 0 0
/dev/wd0s3a / ufs rw 1 1
/dev/wd0s3f /usrufs rw 2 2
/dev/wd0s3e /varufs rw 2 2
proc/proc procfs rw 0 0
/dev/wcd0c /cdrom cd9660 ro,noauto 0 0
nfssrv:/exports /nfsnfs ro,noauto 0 0
/etc/fstab文件中的第四列为安装文件系统时使用的安装参数,如果增加了noauto选项,这样系统启动时并不立即安装这个文件系统,而是直到管理员输入mount命令之后才进行安装.但是此时mount命令的参数就可以比较简单,对应前面安装nfssrv的命令,可以简化为 mount /nfs,mount会查看fstab文件寻找匹配的行,以使用正确的参数安装文件系统.
自动安装守护进程AMD
为了更方便的使用NFS,可以使用自动安装软件amd(automounter daemon,自动安装守护进程)自动维护文件系统,这就使在访问具体目录时能够立即安装该文件系统,而经过一端时间间隔内没有任何访问发生,再自动卸载这个文件系统.
amd需要指定一个进行监视的空目录,所有要安装的文件系统与这个目录下的子目录一一对应;它还需要一个维护用的空目录,用于安装远程文件系统,而监视目录中的子目录将是正确安装的文件系统的符号连接.这些子目录和符号连接并不需要管理员创建,而是要在映射文件中指明,由amd来创建和维护.当监视子目录被访问时,amd守护进程就会安装相应的文件系统并建立正确的连接,使得目录和文件能被正常访问.
通常使用/etc/amd.map用作amd的映射文件,这个文件就用于告诉amd子目录与文件系统的对应关系.下面是一个最简单的映射文件amd.map:
# cat /etc/amd.map
/defaults type:=host;fs:=${autodir}/${rhost};rhost:=${key}
nfssrv typs:=nfs;rhost:=nfssrv;rfs:=/exports
第一行使用/defaults定义缺省的设置,type参数用于定义维护的文件系统的类型, host类型为通过NFS安装远程服务器中直接在exports文件中输出的目录,fs参数为amd安装文件系统使用的安装位置,变量autodir为amd维护安装文件系统的目录,而rhost变量为远程计算机的名字,需要进行设置.缺省的rhost变量设置为${key}的值,当用户访问amd监视目录的子目录时,key就被设置为这个子目录的名字.通过这个缺省设置,当用户访问amd监视目录的任意一个子目录时,这个子目录名就被转换为远程NFS服务器的名字,amd就自动将这个服务器共享的目录安装到fs定义的安装位置上.
第二行设置
一个专有的映射关系,第一列也是amd设置的key值,当访问对应的子目录时就启动这个设置,这一个安装点为nfs类型,nfs类型与host略有不同,host类型只需要rhost 定义,而查询服务器上的共享出的目录来自动安装,而nfs类型则要配置者手工指定远程主机共享的目录,这就需要设置rfs参数.通常在自动维护的计算机数量较少时,使用nfs类型更明确,否则可以使用host类型以简化配置工作.
设置好映射文件之后,就可以运行amd守护进程了.
# amd -a /net -c 1800 /host /etc/amd.map
# ls /host
# cd /host/nfssrv
# ls -l /host
nfssrv
上面的amd的命令参数为,第一个-a参数告诉amd将真实的文件系统安装到/net这个临时目录下,在执行amd之前必须建立这个空目录,这个目录将被amd作为autodir变量设置映射关系;-c参数用于指明超时参数,经过这个时间间隔内没有访问这个文件系统上的内容,就卸载已安装的文件系统,设置为1800秒;而/host目录为amd监视用户访问的目录,访问这个目录中的子目录,就会触发amd守护进程,例如上例中使用cd /host/nfssrv访问nfssrv子目录,那么amd 就将启动,将nfssrv设置为key值,因此amd就读取/defauts设置的缺省参数和nfssrv这个key值对应的参数,然后执行自动安装过程.最后一个参数就是指定映射文件为/etc/amd.map.
因此,amd的处理过程可以总结为:用户首先访问/host目录下的子目录,触发amd;amd 使用子目录的名字作为key值,读取相应映射文件中的设置,将文件系统安装到/net目录下的相应目录上(fs定义的目录);最后amd在/host目录下以key值建立符号连接,指向已经安装到/net 目录下的真实文件系统,使得用户访问子目录的操作能够正常完成.
amd主要是和NFS结合使用,用于维护多台服务器的用户和文件目录的一致性,然而amd 不仅仅能用于维护NFS文件系统,同样也可以用于维护其他种类的文件系统,如CD9660、本地文件目录的连接,以及扩展到运行一个程序等方式自动安装相应的文件系统,对于这些非NFS文件系统,就需要使用不同的type参数定义不同的类型.例如可以使用amd将所有用户的个人目录维护在同一个路径下,而不是事实上分布在不同目录和主机上,等等.此时,amd.map应为:
/defaults opts:=rw,grpid,nosuid,nodev
wb host==wb;type:=link;fs:=/home/wb
cd opts:=ro;host==wb;type:=cdfs;dev:=/dev/wcd0c
dos host==wb;type:=program;mount:="/sbin/mount_msdos mount_msdos /dev/wd0s1 ${path}"
这个映射文件中的缺省设置中首先使用opts设置了几个安装选项,用于安装文件系统时使用.由于这个例子中维护的文件系统NFS文件系统,因此没有使用变量定义相应的参数,而且在维护的文件系统不多的条件下,可以直接定义各个自动安装所需要的各个参数.
第一个设置为是一个link类型,它必须在主机为wb(本地主机的名字,amd将自动设置 host变量)时才有效.这个类型只是用于建立连接,因此就没有必要定义rhost和rfs,而通过 fs定义需要建立连接的目标.因此当访问/host/wb目录时,amd就自动建立一个到/home/wb的符号连接.
第二个设置为cdfs类型,这用于访问时自动安装CDROM,它通过dev参数设置安装使用的设备文件.第三个设置为program类型,当访问/host/dos目录时,amd会自动执行后面的mount_msdos 程序,装载上dos分区,安装点被使用变量path传递给外部程序的参数.
为了在启动时自动执行amd,需要修改rc.conf中的设置,更改其中的选项amd_enable为"YES", amd的执行参数在amd_flags项中设置,缺省为:
amd_flags="-a /net -c 1800 -k i386 -d my.domain -l syslog /host /etc/amd.map"
这个参数使用了另一些有用的参数,-k参数用于运行amd的计算机内核体系,-d参数用于定义计算机的domain名,修改这个参数可以帮助amd侦测计算机所在的domain名字,因此要修改为计算机实际的域名,-l参数定义审计记录文件,缺省使用syslog.amd的设置相当复杂,这里只是通过一个映射文件来提供针对一个目录的自动安装维护,实际上amd可以同时维护多个目录,这就需要设置一个配置文件,来定义多个监视目录.对于一般的目的,使用命令行指定一个映射就够用了.
NFS服务器
为了使得其他系统能使用FreeBSD上的硬盘空间,就需要运行NFS服务进程.NFS服务器使用了几个守护进程用于提供NFS服务.最基本的提供NFS服务的系统至少要运行nfsd和mountd 守护进程,nfsd用于处理NFS协议,而mountd用于处理客户的mount请求.此外,由于NFS使用RPC 远程调用,因此portmap、rpc_lockd、rpc_statd等RPC守护进程都可以用来帮助提供更高效的服务.
这些守护进程一般应该在系统启动时载入,因此需要在rc.conf中更改相关的参数: nfs_server_enable, rpc_statd_enable, rpc_lockd.enable和portmap_enable参数将对应相应的守护进程.
那么系统重起之后,就有了能共享文件出去的能力,余下的工作只是用来配置需要共享那些目录,以及进行何种限制以保证安全性,这些设置工作需要更改/etc/exports文件:
# cat /etc/exports
/usr/src/sys -maproot=daemon ns host2
/usr/ports -ro -network 192.168.1.0
从这个例子中可以看出exports文件的格式,首先是定义要共享出去的文件目录,必须使用绝对路径,而不能使用是符号连接.后面就是对这个目录进行访问限制的参数,用于保证安全性.第一行设置中,
将/usr/sys/src目录共享出去,但限制客户机上的root用户等价于本机上的daemon用户,以避免客户机上的root用户拥有这个服务器上的root权力,进行非法操作,此后的ns和host2参数是主机名,这就限制只有ns和host2才能共享这个/usr/sys/src目录.第二行设置共享了/usr/ports目录,但限制为只允许读取,并且也只有192.168.1.0网络上的计算机才能访问这个共享目录.
目录的访问限制中具有多种选项,这些选项对于保证NFS的安全性相当重要.
-ro---以只读形式输出文件系统,远程客户只能读不能写这个目录
-maproot---将客户机上的root用户映射为服务器中的某个用户和族,也可以使用UID 和GID的形式,如maproot=root,maproot=10,或maproot=10:1.这个设置选项可以用来保护服务器上的文件系统不被客户中的使用者非法访问.
-mapall---将客户上的所有用户都映射为本机的某个用户,使用形式与maproot相同.它同样也是用于保护服务器文件系统的安全性的.
-alldirs---允许安装该目录下的所有子目录.
-network---允许一定网络上的计算机可以装载这个文件系统.