CentOS系统部署NFS共享存储

Linux IT敢客 12个月前 (12-27) 8767次浏览 已收录 2个评论 扫描二维码

一、NFS 服务简介

  NFS 是 Network File System 的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由 Sun 公司开发,于 1984 年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类 Unix 系统间实现磁盘文件共享的一种方法。

  NFS 的基本原则是“容许不同的客户端及服务端通过一组 RPC 分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

  NFS 在文件传送或信息传送过程中依赖于 RPC 协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS 本身是没有提供信息传输的协议和功能的,但 NFS 却能让我们通过网络进行资料的分享,这是因为 NFS 使用了一些其它的传输协议。而这些传输协议用到这个 RPC 功能的。可以说 NFS 本身就是使用 RPC 的一个程序。或者说 NFS 也是一个 RPC SERVER。所以只要用到 NFS 的地方都要启动 RPC 服务,不论是 NFS SERVER 或者 NFS CLIENT。这样 SERVER 和 CLIENT 才能通过 RPC 来实现 PROGRAM PORT 的对应。可以这么理解 RPC 和 NFS 的关系:NFS 是一个文件系统,而 RPC 是负责负责信息的传输。

二、系统环境

系统平台:CentOS release 5.6 (Final)

NFS Server IP:192.168.1.108

防火墙已关闭/iptables: Firewall is not running.

SELINUX=disabled

三、安装 NFS 服务

NFS 的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的。

  • nfs-utils-* :包括基本的 NFS 命令与监控程序 

  • portmap-* :支持安全 NFS RPC 服务的连接

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

CentOS 系统部署 NFS 共享存储

系统默认已安装了 nfs-utils portmap 两个软件包。

2、如果当前系统中没有安装 NFS 所需的软件包,需要手工进行安装。nfs-utils 和 portmap 两个包的安装文件在系统光盘中都会有。

# mount /dev/cdrom /mnt/cdrom/
# cd /mnt/cdrom/CentOS/
# rpm -ivh portmap-4.0-65.2.2.1.i386.rpm 
# rpm -ivh nfs-utils-1.0.9-50.el5.i386.rpm
# rpm -q nfs-utils portmap

CentOS 系统部署 NFS 共享存储

四、NFS 系统守护进程

  • nfsd:它是基本的 NFS 守护进程,主要功能是管理客户端是否能够登录服务器;

  • mountd:它是 RPC 安装守护进程,主要功能是管理 NFS 的文件系统。当客户端顺利通过 nfsd 登录 NFS 服务器后,在使用 NFS 服务所提供的文件前,还必须通过文件使用权限的验证。它会读取 NFS 的配置文件/etc/exports 来对比客户端权限。

  • portmap:主要功能是进行端口映射工作。当客户端尝试连接并使用 RPC 服务器提供的服务(如 NFS 服务)时,portmap 会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。

五、NFS 服务器的配置

NFS 服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动 NFS 服务器即可。

NFS 的常用目录

/etc/exports                           NFS 服务的主要配置文件
/usr/sbin/exportfs                   NFS 服务的管理命令
/usr/sbin/showmount              客户端的查看命令
/var/lib/nfs/etab                      记录 NFS 分享出来的目录的完整权限设定值
/var/lib/nfs/xtab                      记录曾经登录过的客户端信息

NFS 服务的配置文件为 /etc/exports,这个文件是 NFS 的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用 vim 手动建立,然后在文件里面写入配置内容。

/etc/exports 文件内容格式:

<输出目录> [客户端 1 选项(访问权限,用户映射,其他)] [客户端 2 选项(访问权限,用户映射,其他)]

a. 输出目录:

输出目录是指 NFS 系统中需要共享给客户机使用的目录;

b. 客户端:

客户端是指网络中可以访问这个 NFS 输出目录的计算机

客户端常用的指定方式

  • 指定 ip 地址的主机:192.168.0.200

  • 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0

  • 指定域名的主机:david.bsmart.cn

  • 指定域中的所有主机:*.bsmart.cn

  • 所有主机:*

c. 选项:

选项用来设置输出目录的访问权限、用户映射等。

NFS 主要有 3 类选项:

访问权限选项

  • 设置输出目录只读:ro

  • 设置输出目录读写:rw

用户映射选项

  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);

  • no_all_squash:与 all_squash 取反(默认设置);

  • root_squash:将 root 用户及所属组都映射为匿名用户或用户组(默认设置);

  • no_root_squash:与 rootsquash 取反;

  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);

  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);

其它选项

  • secure:限制客户端只能从小于 1024 的 tcp/ip 端口连接 nfs 服务器(默认设置);

  • insecure:允许客户端从大于 1024 的 tcp/ip 端口连接服务器;

  • sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;

  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘;

  • wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);

  • no_wdelay:若有写操作则立即执行,应与 sync 配合使用;

  • subtree:若输出目录是一个子目录,则 nfs 服务器将检查其父目录的权限(默认设置);

  • no_subtree:即使输出目录是一个子目录,nfs 服务器也不检查其父目录的权限,这样可以提高效率;

六、NFS 服务器的启动与停止

在对 exports 文件进行了正确的配置后,就可以启动 NFS 服务器了。

1、启动 NFS 服务器

为了使 NFS 服务器能正常工作,需要启动 portmap 和 nfs 两个服务,并且 portmap 一定要先于 nfs 启动。

# service portmap start
# service nfs start

CentOS 系统部署 NFS 共享存储

2、查询 NFS 服务器状态

# service portmap status
# service nfs status

CentOS 系统部署 NFS 共享存储

3、停止 NFS 服务器

要停止 NFS 运行时,需要先停止 nfs 服务再停止 portmap 服务,对于系统中有其他服务(如 NIS)需要使用时,不需要停止 portmap 服务

# service nfs stop
# service portmap stop

4、设置 NFS 服务器的自动启动状态

对于实际的应用系统,每次启动 LINUX 系统后都手工启动 nfs 服务器是不现实的,需要设置系统在指定的运行级别自动启动 portmap 和 nfs 服务。

# chkconfig --list portmap
# chkconfig --list nfs

CentOS 系统部署 NFS 共享存储

设置 portmap 和 nfs 服务在系统运行级别 3 和 5 自动启动。

# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on

CentOS 系统部署 NFS 共享存储

七、实例

1、将 NFS Server 的/home/david/ 共享给 192.168.1.0/24 网段,权限读写。

服务器端文件详细如下:

CentOS 系统部署 NFS 共享存储

# vi /etc/exports

/home/david 192.168.1.0/24(rw)

2、重启 portmap 和 nfs 服务

# service portmap restart
# service nfs restart
# exportfs

CentOS 系统部署 NFS 共享存储

3、服务器端使用 showmount 命令查询 NFS 的共享状态

# showmount -e    //默认查看自己共享的服务,前提是要 DNS 能解析自己,不然容易报错

CentOS 系统部署 NFS 共享存储

# showmount -a    //显示已经与客户端连接上的目录信息

CentOS 系统部署 NFS 共享存储

4、客户端使用 showmount 命令查询 NFS 的共享状态

# showmount -e NFS 服务器 IP

CentOS 系统部署 NFS 共享存储

5、客户端挂载 NFS 服务器中的共享目录

命令格式

# mount NFS 服务器 IP:共享目录 本地挂载点目录
# mount 192.168.1.108:/home/david/ /tmp/david/
# mount |grep nfs

CentOS 系统部署 NFS 共享存储

挂载成功。

查看文件是否和服务器端一致。

CentOS 系统部署 NFS 共享存储

6、NFS 的共享权限和访问控制

现在我们在/tmp/david/ 里面建立一个文件,看看权限是什么

# touch 20130103

CentOS 系统部署 NFS 共享存储

这里出现 Permission denied,是因为 NFS 服务器端共享的目录本身的写权限没有开放给其他用户,在服务器端打开该权限。

# chmod 777 -R /home/david/

CentOS 系统部署 NFS 共享存储

再次在客户端/tmp/david/ 里面建立一个文件

CentOS 系统部署 NFS 共享存储

我用 root 用户建立的文件,变成了 nfsnobody 用户。

NFS 有很多默认的参数,打开/var/lib/nfs/etab 查看分享出来的/home/david/ 完整权限设定值。

# cat /var/lib/nfs/etab

CentOS 系统部署 NFS 共享存储

默认就有 sync,wdelay,hide 等等,no_root_squash 是让 root 保持权限,root_squash 是把 root 映射成 nobody,no_all_squash 不让所有用户保持在挂载目录中的权限。所以,root 建立的文件所有者是 nfsnobody。

下面我们使用普通用户挂载、写入文件测试。

# su – david

$ cd /tmp/david/

$ touch 2013david

CentOS 系统部署 NFS 共享存储

普通用户写入文件时就是自己的名字,这也就保证了服务器的安全性。

  关于权限的分析

  1. 客户端连接时候,对普通用户的检查

    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;

    b. 如果 NFS server 上面有同名用户,那么此时客户端登录账户的身份转换为 NFS server 上面的同名用户;

    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成 nfsnobody;

  2. 客户端连接的时候,对 root 的检查

    a. 如果设置 no_root_squash,那么此时 root 用户的身份被压缩为 NFS server 上面的 root;

    b. 如果设置了 all_squash、anonuid、anongid,此时 root 身份被压缩为指定用户;

    c. 如果没有明确指定,此时 root 用户被压缩为 nfsnobody;

    d. 如果同时指定 no_root_squash 与 all_squash 用户将被压缩为 nfsnobody,如果设置了 anonuid、anongid 将被压缩到所指定的用户与组;

7、卸载已挂载的 NFS 共享目录

# umount /tmp/david/

CentOS 系统部署 NFS 共享存储

八、启动自动挂载 nfs 文件系统

格式:

<server>:</remote/export> </local/directory> nfs < options> 0 0

# vi /etc/fstab

CentOS 系统部署 NFS 共享存储

保存退出,重启系统。

查看/home/david 有没有自动挂载。

CentOS 系统部署 NFS 共享存储

自动挂载成功。

九、相关命令

1、exportfs

如果我们在启动了 NFS 之后又修改了/etc/exports,是不是还要重新启动 nfs 呢?这个时候我们就可以用 exportfs 命令来使改动立刻生效,该命令格式如下:

  # exportfs [-aruv]

  -a 全部挂载或卸载 /etc/exports 中的内容 
  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
  -u 卸载单一目录(和-a 一起使用为卸载所有/etc/exports 文件中的目录)
  -v 在 export 的时候,将详细的信息输出到屏幕上。

具体例子: 
  # exportfs -au 卸载所有共享目录
  # exportfs -rv 重新共享所有目录并输出详细信息

2、nfsstat

查看 NFS 的运行状态,对于调整 NFS 的运行有很大帮助。

3、rpcinfo

查看 rpc 执行信息,可以用于检测 rpc 运行情况的工具,利用 rpcinfo -p 可以查看出 RPC 开启的端口所提供的程序有哪些。

4、showmount

  -a 显示已经于客户端连接上的目录信息
  -e IP 或者 hostname 显示此 IP 地址分享出来的目录

5、netstat

可以查看出 nfs 服务开启的端口,其中 nfs 开启的是 2049,portmap 开启的是 111,其余则是 rpc 开启的。

最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有 root 可以去挂载,普通用户可以执行 sudo。

NFS server 关机的时候一点要确保 NFS 服务关闭,没有客户端处于连接状态!通过 showmount -a 可以查看,如果有的话用 kill killall pkill 来结束,(-9 强制结束)


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:CentOS 系统部署 NFS 共享存储
喜欢 (155)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 博客大好,让人忘不了!
    菏泽夜生活论坛2017-12-28 15:16 回复 Windows 7 | 搜狗浏览器 2.X
    • IT敢客
      多谢支持,欢迎常来!!!
      果果君2017-12-28 15:31 回复 Windows 10 | Chrome 63.0.3239.84