NFS就是Network File System的缩写,最大的功能就是可以通过网络让不同的机器、不同 的操作系统可以彼此共享文件(share files) 既然NFS是通过网络来进行数据传输的,那么NFS应该会使用哪些端口?NFS使用哪个端口 来进行传输呢?NFS传输数据时使用的端口是随机选择的,唯一的限制小于1024,客户端怎么 知道服务器使用的是哪个端口?此时就要远程过程调用(Remote Procedure Call,简称RPC) 协议来帮忙
#### 什么是RPC(Remote Procedure Call)
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能 就会启动一些端口来传输数据,因此,NFS的功能所对应的端口才无法固定,而是采用随机取 用一些未被使用的小于1024的端口来做为传输只用,但如此一来又造成客户端与服务器联机的 困扰,因为客户端得要知道服务器的数据传输端口才能进行联机 此时,我们就需要远程过程调用(RPC)服务,RPC最主要的功能就是指定每个NFS功能所 对应的端口号,并且传递信息给客户端,让客户端可以连接到正确的端口上去。那RPC又是如 何知道每个NFS的端口?这是因为每当服务器在启动NFS时会随机取用数个端口,并主动的向 RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC固定使用port 111来监听客户端 的需求并应答正确的端口,所以当然可以让NFS的启动更为轻松愉快 (1)客户端会向服务器端的RPC(port 111)发出NFS文件存取功能的询问请求 (2)服务器端找到对应的已注册的NFS daemon端口后,会通知客户端 (3)客户端了解正确的端口后,就可以直接与NFS daemon联机 ############### NFS的软件结构 ########### (1) /etc/exports 这个文件是NFS的主要配置文件,但系统并没有默认值,所以一开始这个文件不一定 存在,可能需要使用vi自行建立 (2)/usr/sbin/exportfs 维护NFS共享资源的命令,我们可以利用这个命令重新共享/etc/exports变更的目录 资源、将NFS Server共享的目录卸载或重新共享等,这个命令是NFS系统相当重要的一个 (3)/usr/sbin/showmount 这是另一个重要的NFS命令,exportfs用在NFS Server端,而showmount则主要用在 Client端。这个showmount可以用来察看NFS服务器共享出来的目录资源 (4)/var/lib/nfs/*tab NFS服务器的日志文件都放在/var/lib/nfs/目录里,在该目录下有两个比较重要的 日志文件,一个是etab,主要记录NFS共享出来的目录的完整权限设置值,另一个是xtab ,记录曾经连接到此NFS主机的相关客户端数据 (5)/etc/exports设置文件的语法与参数 先编辑好主要配置文件/etc/exports,再启动portmap,然后启动nfs,NFS服务器就 假设成功了 主机名称的设置主要有几个方式: .. 可以使用完整的IP地址或者网段,例如192.168.1.10 或 192.168.1.0/24或 192.168.1.0/255.255.255.0都可以接受 .. 权限方面 . rw: read-write 可读写的权限 . ro: read-only 只读的权限 . sync: 数据同步写入到内存与硬盘中 . async: 数据会先暂存于内存中,而非直接写入硬盘 . no_root_squash: 登入NFS主机使用共享目录的用户,如果是root用户,那么 对于这个共享目录来说,它就具有root的权限 . root_squach: 登入NFS主机使用共享目录的用户如果是root身份,那么这个 用户的权限将被压缩成为匿名用户,通常他的UID与GID都会变成nobody(nfsnobody) 那个系统账号的身份 . all_squash: 不论登入NFS主机用户的身份为何,它的身份都会被压缩成匿名 用户,通常也就是nobody(nfsnobody) . anonuid: anon指anonymous(匿名者),前面关于*_squach提到的匿名用户的 UID设置值,通常为nobody(nfsnobody),但是我们可以自行设置这个UID 的值,这个UID必须存在于我们自己的/etc/passwd中 . anongid: 同anonuid,但是变成group ID 范例: 1、vi /etc/exports /tmp *(rw,no_root_squash) 这个表示无论来自哪里都可以使用/tmp这个目录,*(rw,no_root_squash)这个字符 串中间是没有空格的,而/tmp与*(rw,no_root_squash)则是直接用空格隔开的,要 特别注意no_root_squash的功能,如果你是客户端,而且你是以root的身份登入linux 主机,那么当你mount上这台主机的/tmp后,在该目录中将具有root的权限 2、将一个公共目录/home/public开放,但是只限定局域网内192.168.0.0/24这个 网段可以读写,其他人则只能读取 # vi /etc/exports /home/public 192.168.0.0/24(rw,no_root_squash) *(ro,no_root_squash) 3、将一个私人目录/home/test开放给192.168.0.100这个client端的机器,使其 具有读写权限 # vi /etc/exports /tmp *(rw,no_root_squash) /home/public 192.168.0.0/24(rw) *(ro) /home/test 192.168.0.100(rw) 启动NFS # /etc/init.d/portmap start # /etc/init.d/nfslock start # /etc/init.d/nfs start portmap启动的端口在 111 NFS启动的端口在2049 其他rpc.daemons启动的端口则是随机产生的,因此需要向port 111注册 NFS的联机观察 在NFS服务器设置妥当后,我们可以先自行测试一下是否可以联机, # showmount [-ae] [hostname|IP] -a:显示目前主机与客户端得NFS联机共享状态 -e:显示某台主机的/etc/exports所共享的目录数据 范例: (1)显示出刚刚所设置的exports的信息 # showmount -e localhost(IP) (2)查看日志 # tail -f /var/lib/nfs/etab (3) exportfs [-aruv] 参数: -a : 全部挂载(或卸载)/etc/exports 文件内的设置 -r : 重新挂载/etc/exports里的设置,亦同步更新/etc/exports及/var/lib/nfs/xtab内容 -u : 卸载某一目录 -v : 在exports的时候,将共享的目录显示到屏幕上 ################### NFS客户端得挂载 ####################### # mount -t nfs 192.168.0.2:/home/public /home/nfs/public#df -h 查看是否已经挂载成功
# umount /home/nfs/public 卸载挂载# 开机自动挂载NFS
# vi /etc/rc.local mount -t nfs 192.168.0.2:/home/public /home/nfs/public 或 # vi /etc/fstab