73  
NFS网络文件共享服务
作者: wyasw 于 2020年03月29日 发布在分类 / linux / 系统相关 下,并于 2020年03月29日 编辑
nfs

  NFS网络文件共享服务

1.1  NFS介绍

1) 什么是NFS

NFSNetwork File System的缩写,中文意思是网络文件系统。它的主要功能是通过网络(一般是区域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器映射,这也和linux系统里的samba服务类似。只不过一般情况下,Windows网络共享服务Samba服务用于办公区域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享。

1.2  NFS服务端部署环境准备

角色

主机名

eth0 (外网)

eth1 (内网)

C1-NFS 服务器端

Web01

10.0.0.11

192.168.1.11

C2-NFS 客户端

Web02

10.0.0.12

192.168.1.12

1.3  NFS server端的设置

1.3.1  NFS软件列表

要部署NFS服务,需要安装下面的软件包:

nfs-utils:

NFS服务的主程序,包括rpc.nfsd,rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。

rpcbind

CentOS7下面RPC的主程序。NFS可以视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。

1.3.2 查看NFS软件包

可使用如下命令查看默认情况下CentOS7.xNFS软件的安装情况。

[root@web01 ~]# rpm -qa nfs-utils rpcbind

rpcbind-0.2.0-32.el7.x86_64

nfs-utils-1.3.0-0.21.el7.x86_64

##安装更新

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

1.3.2.1 启动rpcbind

因为NFS及其辅助程序都是基于RPCremote Procedure Call)协议的(使用的端口111),所以首先要确保系统中运行了rpcbind服务。启动的实际操作如下:

#检查rpcbind服务状态

[root@web01 ~]# systemctl status rpcbind

#启动rpcbind服务

[root@web01 ~]# systemctl start rpcbind

#查看NFS服务向rpc服务注册的端口信息,因为NFS还没有启动,因此,没有太多注册的端口影射信息。

#查看NFS服务向rpc服务注册的端口信息,因为NFS还没有启动,因此,没有太多注册的端口影射信息。

[root@web01 ~]# 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

#提示:111端口为rpcbind服务对外提供服务的主端口

注意:如果开启防火墙,需要添加 rpcinfo -p localhost 的所有端口

1.3.2.2 启动NFS服务

[root@web01 ~]# systemctl start nfs

提示:如果不启动rpcbind服务直接启动nfs服务会启动时失败

1.3.2.3 配置NFS服务端服务开机自启动

[root@web01 ~]# echo "#start rpcbind and nfs 20180508">>/etc/rc.local

[root@web01 ~]# echo "systemctl start rpcbind.service">>/etc/rc.local

[root@web01 ~]# echo "systemctl start nfs.service">>/etc/rc.local

[root@web01 ~]# tail -3 /etc/rc.local

#start rpcbind and nfs 20180508

systemctl start rpcbind.service

systemctl start nfs.service

1.4 配置NFS服务端-web01

1.4.1  NFS服务端配置文件路径

NFS服务的默认配置文件路径为:/etc/exports,并且默认是空的。

[root@web01 ~]# ls -l /etc/exports

-rw-r--r--. 1 root root 0 6 7 2013 /etc/exports

[root@web01 ~]# cat /etc/exports

NFS默认配置文件/etc/exports没有内容,需要用户自行配置。

1.4.2  /etc/exports文件配置格式为:

NFS共享的目录 NFS客户端地址1(参1,参2...) 客户端地址2(参1,参2...

查看expoets语法文件格式帮助的方法为:

执行man exports命令,然后切换到文件结尾,可以快速看如下样例格式;

[root@web01 ~]# cat /etc/exports

/data 192.168.1.0/24(rw,sync,all_squash)

##命令说明:

/data    #nfs的共享目录路径

192.168.1.0/24  #允许挂载我的共享目录的IP地址段

rw  #可读可写

sync  #实施同步

all_squash)   #将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份

修改配置文件以后,必须重启NFS服务

[root@web01 ~]# systemctl reload nfs.service

[root@web01 ~]# showmount -e

Export list for web01:

/data 192.168.1.0/24

注意:

如果出现如下:

[root@web01 ~]# showmount -e

clnt_create: RPC: Unknown host

[root@web01 ~]# vim /etc/hosts ##加入

192.168.1.11 web01

即可。

#如果出现以下,则表示启动顺序不对,把它两都停了,重新启动,注意先启动rpcbind,再启动nfs

[root@web01 scripts]# showmount -e

clnt_create: RPC: Program not registered

1.4.3 创建共享目录更改属主属组为nfsnobady

[root@web01 ~]# mkdir /data

[root@web01 ~]# grep nfs /etc/passwd

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

[root@web01 ~]# chown -R nfsnobody.nfsnobody /data

[root@web01 ~]# ll -d /data

drwxr-xr-x. 2 nfsnobody nfsnobody 4096 Mar 11 15:50 /data

提示:

如果不授权属主属组,那么共享目录挂载以后不遵循配置文件exports的设定好的读写规则。虽然也能正常挂载,但是会导致写入文件时提示没有权限。

[root@web01 ~]# touch /mnt/a

touch: 无法创建"/data/a": 权限不够

1.4.4 进行本地挂载测试

[root@web01  ~]# mount 192.168.1.11:/data /mnt

[root@web01 ~]# df -h

文件系统 容量 已用 可用 已用挂载点

/dev/mapper/centos-root   50G  3.9G   47G    8% /

devtmpfs                 978M     0  978M    0% /dev

tmpfs                    993M     0  993M    0% /dev/shm

tmpfs                    993M  8.9M  985M    1% /run

tmpfs                    993M     0  993M    0% /sys/fs/cgroup

/dev/sda1                497M  140M  357M   29% /boot

/dev/mapper/centos-home   46G   33M   46G    1% /home

tmpfs                    199M     0  199M    0% /run/user/0

192.168.1.11:/data        50G  3.9G   47G    8% /mnt

没有报错,则表示挂载成功。

1.4.5 进行文件写入测试

[root@web01 ~]# ls /data   #查看目录

dong.txt  dong.txt  test.txt

[root@ web01 ~]# ls /mnt  #查看共享目录

dong.txt  dong.txt  test.txt

[root@web01 ~]# touch /data/a   #创建文件a

[root@web01 ~]# ls /mnt       #共享目录有

a  dong.txt  dong.txt  test.txt

[root@web01 ~]# touch /mnt/b  #在共享目录创建文件b

[root@web01 ~]# ls /data      #data挂载目录有文件ab

a  b  dong.txt  dong.txt  test.txt

提示:当配置文件exports里设定了(rw,rsync)后,表示目录可读写,并且是实时同步的。也就是说,在其中一个挂载目录里改变了里面的内容信息,那么所有挂载目录包含源共享目录的内容信息同步改变。

至此NFS服务端配置完毕

1.5 配置NFS客户端配置过程-web02

1.5.1 客户端必须安装nfs-utils软件

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

[root@web02 ~]# rpm -qa nfs-utils

nfs-utils-1.2.3-75.el6.x86_64

提示:不安装则不能挂载nfs共享目录

1.5.2 检查远端showmount

[root@web02 ~]# showmount -e 192.168.1.11

Export list for 192.168.1.11:

/data 192.168.1.0/24

1.5.3 客户端挂载

[root@web02 ~]# mount -t nfs 192.168.1.11:/data /mnt

提示:-t nfs可以省略

1.5.4 进行文件读写及同步测试

[root@web02 ~]# ls /mnt

a  b  dong.txt  dong.txt  test.txt

[root@web02 ~]# df -h

Filesystem         Size  Used Avail Use% Mounted on

/dev/sda3          6.9G  1.5G  5.1G  23% /

tmpfs              238M     0  238M   0% /dev/shm

/dev/sda1          190M   33M  147M  19% /boot

192.168.1.11:/data  6.9G  1.5G  5.1G  23% /mnt

[root@web02 ~]# touch /mnt/dong

[root@web02 ~]# ls /mnt

a  b  dong  dong.txt  dong.txt  test.txt

1.5.5 配置开机自动挂载nfs共享目录(/etc/fstab

配置客户端mount挂载命令使挂载开机自动执行,这里有两种方法:

1) 将挂载命令放在/etc/rc.local

缺点:偶尔开机挂载不上,工作中除了开机启动配合,还要对是否挂载做监控

[root@web02 ~]# echo "mount -t nfs 192.168.1.11:/data /mnt"  >>/etc/rc.local

2) 将挂载命令放在/etc/fstab

[root@web02 ~]# tail -1  /etc/fstab

192.168.1.11:/data       /mnt                    nfs     defaults        0 0

误区:

fstab会优先于网络被linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。而且,即使是本地的文件系统,也要注意,fstab最后两列要设置0 0,否则有可能导致无法启动服务器的问题

n  因此,nfs网络文件系统最好不要放在fstab里实现开机挂载。

至此NFS客户端配置完毕

1.6  NFS配置权限设置常用参数说明

rw

Read-write, 表示可读写权限

ro

Reab-only ,表示只读权限

sync

(同步,实时)请求或吸入数据时,数据同步写入到NFS Server的硬盘后才返回

async

(异步)写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样可以提升写入速率!风险为若干服务器挂掉或不正常关机,会损失缓冲区中未写入磁盘的数据

no_root_squash

访问NFS Server共享目录的用户如果是root,它对该共享目录具有root权限

root_squash

如果访问目录是root,则它的权限都被压缩成匿名用户

all_squash

不管访问共享目录的用户身份如何,它的权限都被压缩成匿名用户

anonuid

指定共享文件夹里文件所有者的uid号:例如:(rwsquashanonuid=12580anongid=12580

anongid

同上:gid

1.7  export配置文件相关参数应用领域的详细解释(NFS重点)

1) (rw,sync)可读可写,同步传输

2) roasync):只读,异步传输

Ø  详细说明:

rw或者ro,主要控制的是所有客户端用户(包含root)的读写权限。如果设置为ro,就算root也只有读权限。它是NFS权限设置的第一道总闸阀门。

sync:同步传输,实时同步

async:异步传输;攒一会再传输

3)  root_squash:将root账户在共享目录里的身份降低为匿名者(默认nfsnobody)身份

4)  no_root_squash:不降低root账户在共享目录的身份,身份还是root

5)  all_aquash:将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份

详细说明:

Ø  匿名者身份默认情况下就是NFS服务器端的虚拟账户角色,也就是nfsnobody。这是最低的身份,所有NFS客户端共享目录的访问者都被附加了这个身份,这也就意味着,如果文件的属主属组是nfsnobody的话,所有访问者对该文件都拥有全部所有权

Ø  所谓身份并不是访问权限,而是用户在共享目录里创建的文件的属主和属组

Ø  一旦身份被降低那么在共享目录里创建的文件的属主和属组就是变成了默认情况下的nfsnobody。这也就意味着,权限系统对你所创建的文件不做任何保护(任何访问者都可以查看,修改,删除)

l  所谓的root_squash:

l  使用这个参数意味着root在共享目录里创建的任何文件都不受保护,任何人(任何用户)都可以读取,修改,删除

l  而非root用户则不降低权限,在共享目录里创建的文件的属主和属组统一为nobody(身份隐藏了),这种情况下,所有普通用户之间只能互相查看文件,并不能任意修改和删除并且你还无法知道是谁创建的文件,每个普通用户只能修改或删除自己创建的文件

l  root用户虽然被降低了身份,但是并没有降低他的管理者权限,也就是说它仍旧能对所有共享目录里的所有文件进行查看修改删除操作

l  如果这类参数默认为空的话,那么NFS僵默认使用这个参数

1)   所谓no_root_squash:

l  使用这个参数意味着不对root进行降低身份的操作,也就是说root在共享目录里创建的文件的属主属组仍旧为root(不能被普通用户修改和删除)

l  非root用户同root_squash一样,并不降低权限

2)   所谓all_squash

l  使用这个参数意味着对所有访问NFS共享目录的用户进行降低身份的操作。也就是说,所有用户只要在共享目录里创建文件,那么文件的属主属组就是默认情况下的nfsnobody

l  在这个模式下,任何nfs客户端的任何访问用户都可以对共享目录里的任何文件进行查看,修改,删除操作

Ø  anonuid和anoungid:指定nfs虚拟账户的uidgid

l  这两个参数主要用来修改NFS默认的虚拟账户nfsnobody。可以通过指定虚拟账户的uidgid的方式修改默认的虚拟账户的账户名称和所属组




 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-29 20:36:49[当前版本] wyasw 创建版本

  目录
    文艺知识分享平台 - 4.3.0 - 文艺范儿