1) 什么是NFS?
NFS是Network File System的缩写,中文意思是网络文件系统。它的主要功能是通过网络(一般是区域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器映射,这也和linux系统里的samba服务类似。只不过一般情况下,Windows网络共享服务Samba服务用于办公区域网共享,而互联网中小型网站集群架构后端常用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 |
要部署NFS服务,需要安装下面的软件包:
n nfs-utils:
NFS服务的主程序,包括rpc.nfsd,rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
n rpcbind:
CentOS7下面RPC的主程序。NFS可以视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。
可使用如下命令查看默认情况下CentOS7.x里NFS软件的安装情况。
[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
因为NFS及其辅助程序都是基于RPC(remote 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服务对外提供服务的主端口
[root@web01 ~]# systemctl start nfs
提示:如果不启动rpcbind服务直接启动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
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没有内容,需要用户自行配置。
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
[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": 权限不够
[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
没有报错,则表示挂载成功。
[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挂载目录有文件a、b
a b dong.txt dong.txt test.txt
提示:当配置文件exports里设定了(rw,rsync)后,表示目录可读写,并且是实时同步的。也就是说,在其中一个挂载目录里改变了里面的内容信息,那么所有挂载目录包含源共享目录的内容信息同步改变。
至此NFS服务端配置完毕
[root@web02 ~]# yum -y install nfs-utils
[root@web02 ~]# rpm -qa nfs-utils
nfs-utils-1.2.3-75.el6.x86_64
提示:不安装则不能挂载nfs共享目录
[root@web02 ~]# showmount -e 192.168.1.11
Export list for 192.168.1.11:
/data 192.168.1.0/24
[root@web02 ~]# mount -t nfs 192.168.1.11:/data /mnt
提示:-t nfs可以省略
[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
配置客户端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
误区:
n fstab会优先于网络被linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。而且,即使是本地的文件系统,也要注意,fstab最后两列要设置0 0,否则有可能导致无法启动服务器的问题
n 因此,nfs网络文件系统最好不要放在fstab里实现开机挂载。
至此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号:例如:(rw,squash,anonuid=12580,anongid=12580) |
anongid |
同上:gid号 |
1) (rw,sync)可读可写,同步传输
2) (ro,async):只读,异步传输
Ø 详细说明:
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虚拟账户的uid或gid
l 这两个参数主要用来修改NFS默认的虚拟账户nfsnobody。可以通过指定虚拟账户的uid和gid的方式修改默认的虚拟账户的账户名称和所属组