相关概念:
一、什么是NFS(Network File System)即网络文件系统。NFS 使用内核功能,所以内核需要支持NFS。
主要功能:通过网络,让不同的机器、不同的OS 可以共享彼此的文件。
协议详解请参考百度百科链接:http://baike.baidu.com/view/44349.htm
二、什么是RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
协议详解请参考百度百科链接:http://baike.baidu.com/view/7287257.htm?fromId=32726&redirected=seachword
主要功能:指定每个NFS对应的 port number,并通知客户端,让客户端可以连接到正确的端口上。
因为NFS服务必须使用RFC服务,所以称之为RPC Server的一种,另外NIS也属于RPC Server。
Server/client都要开启RFC 服务。启动NFS之前,RPC要先启动,否则NFS会无法向RPC注册。
客户端有NFS文件访问需求时,向服务器的请求数据的流程:
1、客户端向服务器端的RPC(Port 111) 发出NFS文件访问功能。
2、服务器端找到对应的已注册的 NFS daemon 端口后,会通知客户端。
3、客户端找到正确端口后,可以直接与NFS daemon。
三、NFS Server 端的配置
1、所需要软件
RPC主程序: rpcbind
NFS主程序: nfs-utils
[root@jone ~]# yum -y install rpcbind nfs-utils
2、NFS的软件结构
主配置文件:/etc/exports
NFS文件系统维护命令:/usr/sbin/exportfs 共享 /etc/exports 更新的目录资源、将NFS 共享的目录卸载以及重新共享。
共享资源的日志文件:/var/lib/nfs/*tab etab:记录NFS共享目录的完整权限设置值;另一个xtab,记录到连接到此NFS服务器的客户端信息。
客户端查询服务器共享资源的命令:/usr/sbin/showmount
3、/etc/exports配置文件
[root@centos ~]# vi /etc/exports
/tmp 192.168.11.0/24(ro) *(rw)
*.ev.ncku.edu.tw(ro,sync)
[分享目录] [第一部主机(权限)] [可用主机名] [可用通配符]
每一行最前面是要分享出来的目录。是以目录为单位啊! 然后这个目录可以依照不同的权限分享给不同的主机,像鸟哥上面的 例子说明是: 要将 /tmp 分别分享给三个不同的主机或网域的意思。记得主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号 (,) 分开。且主机名与小括号是连在一起的!在这个档案内也可以利用 # 来批注呢。
至于主机名的设定主要有几个方式:
1、可以使用完整的 IP 或者是网域,例如 192.168.100.10 或192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以接受! 不可以使用 192.168.100.* 。
2、也可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS找到该名称才行!反正重点是可找到 IP 就是了。如果是主机名的话,那么可以支持通配符,例如 * 或 ? 均可接受。
Exports文件中的权限参数
选项 说明
Ro 该主机对该共享目录有只读权限
Rw 该主机对该共享目录有读写权限
Root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
No_root_squash 客户机用root访问该共享文件夹时,不映射root用户
All_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
Anonuid 将客户机上的用户映射成指定的本地用户ID的用户
Anongid 将客户机上的用户映射成属于指定的本地用户组ID
Sync 资料同步写入到内存与硬盘中
Async 资料会先暂存于内存中,而非直接写入硬盘
Insecure 允许从这台机器过来的非授权访问
例题一:
让 root 保留 root权限
答:[root@centos ~]# vi /etc/exports
/tmp *(rw,no_root_squash) 任何人都可以使用 /tmp,主机名可以使用通配符处理,重点是no_root_squash。
例题二:同一目录针对不同范围开放不同权限
我要将一个公共的目录 /home/public 公开出去,但是只有限定我的局域网络192.168.11.0/24 这个网域且加入 vbirdgroup 的用户才能够读写,其他来源则只能读取。
答:
[root@centos ~]# mkdir /home/public
[root@centos ~]# groupadd vbirdgroup
[root@centos ~]# setfacl -m g:vbirdgroup:rwx /home/public
[root@centos ~]# vim /etc/exports
/tmp *(rw,no_root_squash)
/home/public 192.168.11.0/24(rw) *(ro)
# 继续累加在后面,注意,我有将主机与网域分为两段 (用空白隔开) !
例题三:仅给某个单一主机使用的目录设定
我要将一个私人的目录 /home/test 开放给 192.168.100.10 这个 Client 端的机器来使用时,该如何设定?假设使用者的身份是 dmtsai 才具有完整的权限时。
答:
[root@centos ~]# mkdir /home/test
[root@centos~]# setfacl -m u:dmtsai:rwx /home/test
[root@centos ~]# vim /etc/exports /tmp *(rw,no_root_squash)
/home/public 192.168.11.0/24(rw) *(ro)
/home/test 192.168.11.173(rw)
# 只要设定 IP 正确即可!
这样就设定完成了!而且,只有 192.168.11.173这部机器才能对 /home/test 这个目录进行存取喔!
例题四:开放匿名登录的情况
我要让 *.centos.vbird 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存数据的时候,我希望他们的 UID 与 GID 都变成 45 这个身份的使用者,假设我 NFS 服务器上的 UID 45 与 GID 45 的用户/组名为 nfsanon。
答:
[root@centos~]# groupadd -g 45 nfsanon
[root@centos ~]# useradd -u 45 -g nfsanon nfsanon
[root@centos ~]# mkdir /home/linux
[root@centos ~]# setfacl -m u:nfsanon:rwx /home/linux
[root@centos ~]# vim /etc/exports
/tmp *(rw,no_root_squash) /home/public 192.168.11.0/24(rw) *(ro)
/home/test 192.168.11.173(rw)
/home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
# 如果要开放匿名,那么重点是 all_squash,并且要配合 anonuid 喔!
特别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,当clientlinux.centos.vbird 登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成 /etc/passwd 里面对应的 UID 为 45 的那个身份的使用者了!
3、启动NFS
/etc/init.d/rpcbind start
/etc/init.d/nfs start
/etc/init.d/nfslock start
查看NFS 开启的端口
[root@centos ~]# netstat -tunlp | grep -E "(rpc|nfs)"
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1345/rpcbind
tcp 0 0 0.0.0.0:54000 0.0.0.0:* LISTEN 3034/rpc.mountd
tcp 0 0 0.0.0.0:60724 0.0.0.0:* LISTEN 1425/rpc.statd
tcp 0 0 0.0.0.0:58105 0.0.0.0:* LISTEN 3034/rpc.mountd
tcp 0 0 0.0.0.0:49257 0.0.0.0:* LISTEN 3034/rpc.mountd
tcp 0 0 :::111 :::* LISTEN 1345/rpcbind
tcp 0 0 :::57367 :::* LISTEN 1425/rpc.statd
tcp 0 0 :::59611 :::* LISTEN 3034/rpc.mountd
tcp 0 0 :::44958 :::* LISTEN 3034/rpc.mountd
tcp 0 0 :::55489 :::* LISTEN 3034/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1345/rpcbind
udp 0 0 0.0.0.0:753 0.0.0.0:* 1425/rpc.statd
udp 0 0 0.0.0.0:49675 0.0.0.0:* 3034/rpc.mountd
udp 0 0 0.0.0.0:39183 0.0.0.0:* 3034/rpc.mountd
udp 0 0 0.0.0.0:672 0.0.0.0:* 1345/rpcbind
udp 0 0 0.0.0.0:60470 0.0.0.0:* 1425/rpc.statd
udp 0 0 0.0.0.0:36158 0.0.0.0:* 3034/rpc.mountd
udp 0 0 :::49007 :::* 1425/rpc.statd
udp 0 0 :::111 :::* 1345/rpcbind
udp 0 0 :::672 :::* 1345/rpcbind
udp 0 0 :::34479 :::* 3034/rpc.mountd
udp 0 0 :::39476 :::* 3034/rpc.mountd
udp 0 0 :::40297 :::* 3034/rpc.mountd
主要的端口是:
rpcbind 启动的 port 在 111 ,同时启动在 UDP 与 TCP;
nfs 本身的服务启动在 port 2049 上头!
其他 rpc.* 服务启动的 port 则是随机产生的,因此需向 port 111 注册。
启动nfs后又修改了/etc/exports,不用重启该服务,使用exports命令即可:
Exports [-aruv]
-a 全部mount或umount文件/etc/exports中的内容
-r 重新mount文件/etc/exports中的共享内容
-u umount目录
-v 在export的时候,将详细的信息输出到屏幕上
例:
[root@localhost ~]# exportfs –rv 全部重新export一次
[root@localhost ~]# exportfs –au 全部卸载
四、NFS 客户端的设置
1、客户端先rpcbind服务。
[root@jone ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
2、扫描NFS服务器目录有那些,以及是否可用。
showmount –e 192.168.90.254 (服务器端IP)
3、客户端建立挂载点目录。
[root@jone ~]# mkdir -p /home/nfs/public/
4、使用mount 将服务器直接挂载到相关目录。
mount -t nfs 192.168.90.254 :/home/public /home/nfs/public
5、查看是否挂载成功。
[root@jone ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
8.5G 1.7G 6.4G 21% /
tmpfs 246M 0 246M 0% /dev/shm
/dev/sda1 485M 32M 429M 7% /boot
192.168.90.254:/home/public
28G 790M 26G 3% /home/nfs/public
6、使用完毕之后可以使用umount卸载
umount /home/nfs/pulic
PS:
1、用户账号。客户端和服务器端的账号不一致导致文件系统使用上的混乱,NFS比较大弊端。
2、NFS 服务器开放写入权限(/etc/exports 设置有关)
3、文件权限具有可写入(W)的权限。
常与NIS搭配使用。
自动挂载服务:autofs
建立主配置文件 /etc/auto.master
建立数据对应文件内(/etc/auto.nfs)的挂载信息与服务器对应的资源。
没有测试成功,继续测试。
鸟哥总结的重点,最好记住。
Network FileSystem (NFS) 可以让主机之间透过网络分享彼此的档案与目录;
NFS 主要是透过 RPC 来进行 file share 的目的,所以 Server 与 Client的 RPC 一定要启动才行!
NFS 的配置文件就是 /etc/exports 这个档案;
NFS 的权限可以观察 /var/lib/nfs/etab,至于的重要登录档可以参考 /var/lib/nfs/xtab 这个档案,还包含相当多有用的信息在其中!
NFS 服务器与客户端的使用者账号名称、UID 最好要一致,可以避免权限错乱:
NFS 服务器预设对客户端的 root 进行权限压缩,通常压缩其成为nfsnobody 或 nobody。
NFS 服务器在更动 /etc/exports 这个档案之后,可以透过 exportfs 这个 指令来重新挂载分享的目录! 可以使用 rpcinfo 来观察 RPC program 之间的关系!!!
NFS 服务器在设定之初,就必须要考虑到 client 端登入的权限问题,很多时候无法写入或者无法进行分享,主要是 Linux 实体档案的权限设定问题所致!
NFS 客户端可以透过使用 showmount, mount 与 umount 来使用 NFS 主机提供的分享的目录!
NFS 亦可以使用挂载参数,如 bg, soft, rsize, wsize, nosuid, noexec, nodev 等参数, 来达到保护自己文件系统的目标!