BenjaminYang In solitude, where we are least alone

centos7搭建nfs服务器

一.NFS简介

NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!

NFS服务端、RPC协议、客户端三者可以理解为房源、中介、租客之间的关系:

 

二、所需要的软件及软件结构

要设定好 NFS 服务器我们必须要有两个软件才行,分别是:

    • RPC 主程序:rpcbind

      就如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC 服务,而要启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行! (在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的!)

    • NFS 主程序:nfs-utils

      就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件啦!一定要有喔!
    • 主要配置文件:/etc/exports
      这个档案就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个档案『 不一定会存在』,你可能必须要使用 vim 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已吶!

    • NFS 文件系统维护指令:/usr/sbin/exportfs
      这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法我们在底下会介绍。

    • 分享资源的登录档:/var/lib/nfs/*tab
      在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。

    • 客户端查询服务器分享资源的指令:/usr/sbin/showmount
      这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!

三、环境准备

[root@server ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)
[root@server ~]# uname -r
3.10.0-693.el7.x86_64
[root@server ~]# hostname -I
10.0.0.10 

四、安装NFS服务和RPC-bind服务

1、查看系统是否已安装NFS

[root@bogon ~]# rpm -qa | grep nfs
[root@bogon ~]# rpm -qa | grep rpcbind

2、安装NFS

[root@server ~]# yum -y install nfs-utils rpcbind

五、服务端配置

在NFS服务端上创建共享目录/data/nfsdir并设置权限

[root@server ~]# mkdir -p /data/nfsdir

  [root@server ~]# chmod 666 /data/nfsdir/
  [root@server ~]# ll /data/
   total 0
   drw-rw-rw- 2 root root 6 Apr 16 08:52 nfsdir

编辑export文件

[root@server ~]# vi /etc/exports
/data/nfsdir 10.0.0.0/24(rw,no_root_squash,no_all_squash,sync)
常见的参数则有:

参数值    内容说明
rw  ro    该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

sync  async    sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!

no_root_squash  root_squash    客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!

all_squash    不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!

anonuid  anongid    anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。

配置生效

[root@server ~]# exportfs -r

启动rpc和nfs(注意顺序)

[root@server ~]# systemctl start rpcbind
[root@server ~]# systemctl start nfs

查看RPC服务的注册情况

[root@server ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54506  status
    100024    1   tcp  34836  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  44948  nlockmgr
    100021    3   udp  44948  nlockmgr
    100021    4   udp  44948  nlockmgr
    100021    1   tcp  41426  nlockmgr
    100021    3   tcp  41426  nlockmgr
    100021    4   tcp  41426  nlockmgr
选项与参数:
-p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某支程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;

利用showmount命令检查服务端连机情况

[root@server ~]# showmount -e localhost
Export list for localhost:
/data/nfsdir 10.0.0.0/24
选项与参数:
-a :显示目前主机与客户端的 NFS 联机分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录数据。

六、客户端配置

创建需要挂载的目录

[root@client01 ~]# mkdir /nfsdir

查看服务端的共享目录信息

[root@client01 ~]# showmount -e 10.0.0.10
Export list for 10.0.0.10:
/data/nfsdir 10.0.0.0/24

为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议

mount -t nfs 192.168.2.203:/data/lys /lys -o proto=tcp -o nolock

七.测试

查看挂载情况

[root@client01 ~]# df -h|grep nfsdir
10.0.0.10:/data/nfsdir    17G  1.3G   16G   8% /nfsdir

服务端在共享目录下生成一个测试文件

[root@server ~]# echo "hello nfs" > /data/nfsdir/test.txt

客户端查看

[root@client01 ~]# ll /nfsdir/
total 4
-rw-r--r-- 1 root root 10 Apr 16 09:19 test.txt

  [root@client01 ~]# cat /nfsdir/test.txt
  hello nfs

客户端生成文件内容

[root@client01 ~]# echo "client also write message" >> /nfsdir/test.txt 
[root@client01 ~]# cat /nfsdir/test.txt                                 
hello nfs
client also write message

服务端查看文件内容

[root@server ~]# cat /data/nfsdir/test.txt 
hello nfs
client also write message

卸载已挂载的NFS

[root@client01 ~]# umount /nfsdir/
[root@client01 ~]# df -h|grep nfsdir
[root@client01 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  1.2G   16G   7% /
devtmpfs                 220M     0  220M   0% /dev
tmpfs                    231M     0  231M   0% /dev/shm
tmpfs                    231M  4.6M  226M   2% /run
tmpfs                    231M     0  231M   0% /sys/fs/cgroup
/dev/sda1               1014M  125M  890M  13% /boot
tmpfs                     47M     0   47M   0% /run/user/0

补充部分:

由于每次nfs启动向rpc注册端口都是随机生成,不是固定的,这样就给我们防火墙的设置带来不便。

[root@server ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54506  status
    100024    1   tcp  34836  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  44948  nlockmgr
    100021    3   udp  44948  nlockmgr
    100021    4   udp  44948  nlockmgr
    100021    1   tcp  41426  nlockmgr
    100021    3   tcp  41426  nlockmgr
    100021    4   tcp  41426  nlockmg

通过修改配置文件,将注册端口固定。

[root@server ~]# echo -e "RQUOTAD_PORT=30001\nLOCKD_TCPPORT=30002\nLOCKD_UDPPORT=30002\nMOUNTD_PORT=30003\nSTATD_PORT=30004" >>/etc/sysconfig/nfs 
[root@server ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004

重启nfs,并查看注册端口

[root@server ~]# systemctl restart nfs
[root@server ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54506  status
    100024    1   tcp  34836  status
    100005    1   udp  30003  mountd
    100005    1   tcp  30003  mountd
    100005    2   udp  30003  mountd
    100005    2   tcp  30003  mountd
    100005    3   udp  30003  mountd
    100005    3   tcp  30003  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  38083  nlockmgr
    100021    3   udp  38083  nlockmgr
    100021    4   udp  38083  nlockmgr
    100021    1   tcp  46265  nlockmgr
    100021    3   tcp  46265  nlockmgr
    100021    4   tcp  46265  nlockmgr

这下防火墙只需要开发这些相应的端口就可以了。

 

over...

posted @ 2018-04-16 09:50  benjamin杨  阅读(981)  评论(0编辑  收藏  举报