Linux 环境下搭建NFS服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 环境下搭建NFS服务相关的知识,希望对你有一定的参考价值。

参考技术A NFS(Network File System),网络文件存储系统,它最早是由 Sun 公司开发的,也是 FreeBSD 支持的文件系统中的一个,它允许网络中的计算机之间通过TCP/IP 网络共享资源。通过 NFS 协议,我们本地 NFS 的客户端应用可以透明的读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机,不同的操作系统可以共享存储的服务。
NFS 在文件传送或信息传送过程中依赖 RPC(Remote Procedure Call)协议,即远程过程调用,NFS的各项功能都必须向 RPC 来注册,如此一来 RPC 才能了解 NFS 这服务的各项功能 Port,PID,NFS 在服务器所监听的 IP 等,而客户端才能透过 RPC 的询问找到正确对应的端口,所以 NFS 必须要有 RPC 存在是才能成功的提供服务,简单的理解二者关系:NFS 是一个文件存储系统,而 RPC 是负责信息的传输。

通过上面的简介,我们知道 NFS 服务需要依赖 RPC 服务,所以这里 NFS 服务端需要安装 rpcbind 和 nfs-utils ,客户端只需要安装 nfs-utils 即可,由于我们选用 CentOS 系统,所以可以使用 yum 快速的安装。

然后安装 NFS 服务

另:Ubuntu 16.04 安装命令

我们在服务端创建一个共享目录 /data/share ,作为客户端挂载在远端入口,然后设置权限

然后,修改 NFS 配置文件 /etx/exports

说明一下,这里配置后边有很多参数,每个参数有不同的含义,具体可以参考下边。此处,我配置了将 /data/share 文件目录设置为允许IP为 192.168.0.0/24 区间的客户端挂载。然后,如果客户端IP不在该区间也想要挂载的话,可以设置IP区间更大或者设置为 * 即允许所有客户端挂载,例如: /home *(ro, sync,insecure,no_root_squash) 设置 /home 目录允许所有客户端只读挂载。

接下来,我们先启动 RPC 服务

我们发现,启动了 NFS 服务后,RPC 注册的端口列表明显增多。现在服务端都启动起来了,在服务端看下是否正确加载了设置的 /etc/exports 配置

最后,在另一台Linux虚拟机上测试一下,是否能够正确挂载。首先,我们可以在客户端查看下NFS服务端设置可共享的目录信息

然后,在客户端创建挂载目录/share

最后,挂载远端目录到本地 /share 目录

可以看到,可以正确将远端 NFS 目录挂载到本地。注意:挂载点 /share 目录必须已经存在,而且目录中没有文件或子目录
最后,我们在 NFS 服务端 /data/share 目录下创建一个文件,看下客户端能否正确读取并修改

都可以了,这里因为上面设置了 NFS 远端目录权限为 rw 拥有读写权限,如果设置为 ro ,那么客户端只能读取,不能写入。根据实际应用场景合理配置。
NFS 默认使用 UDP协议进行挂载,为了提供 NFS 的稳定性,可以使用 TCP 协议挂载,那么客户端挂载命令如下:

最后,卸载命令

SLES Suse Linux 11 SP4环境下NFS的搭建

系统环境:

SLES 11 SP4

NFS Server IP:192.168.74.141
NFS Client IP: 192.168.74.142

SLES环境下NFS套件是缺省安装的,可以使用zypper se nfs来确认一下.

#service nfsserver start                #启动NFS服务器服务
#vi /etc/exports                        #添加以下内容
/tmp 192.168.74.142(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501)
#exportfs -rv                           #导出NFS
#showmount -e                           #服务器上确认导出NFS状态正常

接下来配置NFS Server上的防火墙(这部分是重点)

## rpcinfo -p
   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
    100005    1   udp  53075  mountd
    100005    1   tcp  42607  mountd
    100005    2   udp  49948  mountd
    100005    2   tcp  48332  mountd
    100005    3   udp  53662  mountd
    100005    3   tcp  60244  mountd
    100024    1   udp  57614  status
    100024    1   tcp  45583  status
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  43109  nlockmgr
    100021    3   udp  43109  nlockmgr
    100021    4   udp  43109  nlockmgr
    100021    1   tcp  53998  nlockmgr
    100021    3   tcp  53998  nlockmgr
    100021    4   tcp  53998  nlockmgr

看到NFS服务端主要由portmapper(port 111),nfs(port 2049),mountd(port随机),nlockmgr(port随机)四个服务组成.portmapper和nfs的端口是固定的,而mountd,nlockmgr的端口不固定,这样就不能直接在防火墙上配置.
先自定义mountd的TCP/UDP port=20048, nlockmgr的TCP/UDP port=51000,打开/etc/sysconfig/nfs文件

#vi /etc/sysconfig/nfs
MOUNTD_PORT="20048"
LOCKD_TCPPORT="51000"
LOCKD_UDPPORT="51000"

改变这三行就把mountd,nlockmgr的端口固定下来了,重启一下NFS服务让改变的配置文件生效

#service nfsserver restart
# rpcinfo -p
   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
    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
    100024    1   udp  33747  status
    100024    1   tcp  43717  status
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  51000  nlockmgr
    100021    3   udp  51000  nlockmgr
    100021    4   udp  51000  nlockmgr
    100021    1   tcp  51000  nlockmgr
    100021    3   tcp  51000  nlockmgr
    100021    4   tcp  51000  nlockmgr

接下来将nfs,111,20048,51000四个端口加入防火墙配置文件

#vi /etc/sysconfig/SuSEfirewall2
FW_SERVICES_EXT_TCP="ssh ftp 30000:30100 nfs 111 20048 51000"
FW_SERVICES_EXT_UDP="nfs 111 20048 51000"

重启防火墙服务让配置文件生效

#/sbin/rcSuSEfirewall2 restart

由于SLES环境下NFS套件是缺省安装的,客户端不需要安装其它软件了

#showmount -e 192.168.74.141
#mount -t nfs 192.168.74.141:/tmp /mnt

最后测试文件在NFS上的读写情况即可.

 



以上是关于Linux 环境下搭建NFS服务的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式linux开发环境搭建——NFS服务器的搭建

SLES Suse Linux 11 SP4环境下NFS的搭建

Linux下NFS服务器的搭建与配置

Linux实用工具-nfs

Linux 环境搭建ubuntu下nfs安装与配置

NFS服务搭建及数据无缝迁移