Linux NFS服务

Strong 2020年05月07日 812次浏览

NFS服务

1、nfs服务简介

NFS(Network File System)即网络文件系统,它的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

1.1 nfs特点

  • 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
  • nfs不仅适用于Linux与Unix之间实现文件共享,也能实现Linux与Windows间的文件共享功能。
  • nfs是运行在应用层的协议,其监听于2049/tcp和2049/udp套接字上(固定端口是2049,nfs还会开启很多端口,而且这些端口不固定)。
  • 客户端认证是基于IP地址(没有用户名和密码的说法),这也是它的缺点之一。
  • NFS网络文件系统一般用来存储共享视频、图片、附件,用户家目录等资源文件。

1.2 使用nfs的好处

  • 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地机器就可以减少自身存储空间的使用。
  • 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
  • 一些存储设备,如:软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

1.3 nfs架构

nfs服务也是基于C/S架构工作的。

客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。
在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。

20200429011115606_16160.jpg

1.4 nfs的应用场景

nfs有很多实际应用场景,以下是一些常用的场景:

  • 多个机器共享一台CDROM或其他设备。这对于在多台机器中安装软件来说更加便宜与方便。
  • 在大型网络中,配置一台中心NFS服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
  • 不同客户端可在NFS上观看影视文件,节省本地空间。
  • 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下。

2、nfs工作机制

nfs服务并不是自己单独工作,他需要基于rpc服务来实现网络文件系统共享。

2.1 rpc简介

RPC(Remote Procedure Call Protocol),远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC服务采用C/S架构。客户端发送调用程序的请求;服务端负责接收客户端的请求,调用相应程序。

2.2 rpc服务作用

nfs服务是通过网络来进行服务器端和客户端之间的数据传输,这两者之间要传输数据就要有相对应的网络端口,nfs固定端口号是2049;但由于文件系统非常复杂,因此NFS还有其他的程序去启动额外的端口,这些额外用来传输数据的端口是随机选择的,客户端不知道服务端随机选择的端口是多少;而客户端要连接服务端就必须要知道服务端相关端口才能建立连接,进行数据传输;RPC就是用来统一管理nfs端口的服务,并且将端口信息通知给客户端,这时客户端就可以和nfs服务建立连接。

20200429015712302_25348.jpg

1)首先服务器端启动RPC服务,并开启111端口。

2)服务器端启动NFS服务,并向RPC注册端口信息。

3)客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口。

4)服务端的RPC服务反馈NFS端口信息给客户端。

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

3、nfs服务配置文件

nfs最主要的配置文件为:/etc/exports ;该文件是空白的,有的系统可能不存在这个文件,需要手动建立。NFS的配置一般只在这个文件中配置即可。

/etc/exports 配置文件定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。

  • exports文件中每一行提供了一个共享目录的设置,其命令格式为:

      <输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]
    
  • 常用的选项:

选项说明
ro设置输出目录只读
rw设置输出目录可读写
all_squash将远程访问的所有普通用户及所属组都映射为匿名用户和用户组(nfsnobody)
no_all_squash不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)
root_squash将root用户及所属用户组都映射为匿名用户或用户组(默认设置)
no_root_squash不将root用户及所属用户组都映射为匿名用户或用户组
anonuid=xxx将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户帐户(UID=xxx)
anongid=xxx将远程访问的所有用户组都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx)
secure限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)
insecure允许客户端从大于1024的TCP/IP端口连接NFS服务器
sync将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性
async将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置)
no_wdelay若有写操作则立即执行,应与sync配置使用
subtree_check若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)
no_subtree_check即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率
nohide若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项

4、nfs配置

4.1 服务安装

//安装rpc和nfs服务
[root@server ~]# yum -y install rpcbind nfs-utils

//启动服务,同样启动两个服务,注意启动顺序
[root@server ~]# systemctl start rpcbind nfs-server

4.2 配置nfs输出目录

//创建共享目录,/hzz目录可读可写,/zzh目录只读
[root@server ~]# mkdir /hzz
[root@server ~]# mkdir /zzh

//配置共享目录的访问权限,针对客户端访问的用户设置
[root@server ~]# chmod 777 /hzz/
[root@server ~]# chmod 755 /zzh/

//编辑配置文件,配置共享目录
[root@server ~]# vim /etc/exports
/hzz 192.168.52.157/24(rw)
/zzh 192.168.52.157/24(ro)

//服务端重启服务
[root@server ~]# systemctl restart nfs-server

//在客户端挂载共享目录,先创建挂载点
[root@client ~]# mkdir /mnt/hzz
[root@client ~]# mkdir /mnt/zzh

//客户端也要安装nfs才能挂载
[root@client ~]# yum -y install rpcbind nfs-utils

//使用mount命令挂载
[root@client ~]# mount -t nfs 192.168.52.156:/hzz /mnt/hzz/
[root@client ~]# mount -t nfs 192.168.52.156:/zzh /mnt/zzh/

//永久挂载
[root@client ~]# vim /etc/fstab
192.168.52.156:/hzz /mnt/hzz nfs defaults,_netdev 0 0
192.168.52.156:/zzh /mnt/zzh nfs defaults,_netdev 0 0

//查看挂载情况
[root@client ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   17G  1.1G   16G    7% /
devtmpfs               901M     0  901M    0% /dev
tmpfs                  912M     0  912M    0% /dev/shm
tmpfs                  912M  8.7M  903M    1% /run
tmpfs                  912M     0  912M    0% /sys/fs/cgroup
/dev/sda1             1014M  143M  872M   15% /boot
tmpfs                  183M     0  183M    0% /run/user/0
192.168.52.156:/hzz     17G  1.1G   16G    7% /mnt/hzz
192.168.52.156:/zzh     17G  1.1G   16G    7% /mnt/zzh

注意:记得关闭防火墙或者放行nfs和rpc-bind。

4.3 showmount命令

showmount 命令可以查看NFS服务器的输出目录状态。

//语法:showmount [选项] [NFS服务器地址]
//常用的选项有:
    -e  //显示指定的NFS服务器上所有输出的共享目录
  • 查看nfs服务器共享了哪些目录。
[root@client ~]# showmount -e 192.168.52.156
Export list for 192.168.52.156:
/zzh 192.168.52.157/24
/hzz 192.168.52.157/24

4.4 exportfs命令

exportfs 命令主要用于管理当前NFS服务器的文件系统。

exportfs 是在服务端上使用的命令,主要用来操作挂载的目录,比如我们修改了NFS配置文件,需要重启NFS服务,如果客户端正在读写,那么重启NFS服务对客户端是有影响的,因此 exportfs 命令的其中一个功能就是不重启就能重新加载NFS配置文件。

exportfs [选项] [参数]
    -r      //重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务
    -u      //取消一个或者多个NFS共享文件系统的共享
    -a      //exports配置文件中所有的共享目录
    -v      //显示执行过程

exportfs -r 和 systemctl reload nfs-server 配合可以实现不重启服务,重新加载

5、nfs应用实例

5.1 同步用户家目录

//在服务器端创建用户
[root@server ~]# useradd hzz
[root@server ~]# useradd zzh

//编辑配置文件,共享用户家目录
[root@server ~]# vim /etc/exports
/home/hzz 192.168.52.157/24(rw)
/home/zzh 192.168.52.157/24(rw)

//查看目录权限,用户本身对家目录就有权限所以一般不用修改
[root@server ~]# ll /home/
总用量 0
drwx------. 2 hzz hzz 115 4月  29 12:07 hzz
drwx------. 2 zzh zzh  62 4月  29 12:03 zzh

//重新加载服务
[root@server ~]# exportfs -r
[root@server ~]# systemctl reload nfs-server

//在客户端先创建用户,保证客户端用户和服务端用户uid,gid一致
[root@client ~]# useradd hzz
[root@client ~]# useradd zzh

//在客户端将服务端用户家目录,挂载至本地用户家目录,然后查看
[root@client ~]# vim /etc/fstab
192.168.52.156:/home/hzz /home/hzz nfs defaults,_netdev 0 0
192.168.52.156:/home/zzh /home/zzh nfs defaults,_netdev 0 0
[root@client ~]# mount -a
[root@client ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   17G  1.1G   16G    7% /
devtmpfs               901M     0  901M    0% /dev
tmpfs                  912M     0  912M    0% /dev/shm
tmpfs                  912M  8.7M  904M    1% /run
tmpfs                  912M     0  912M    0% /sys/fs/cgroup
/dev/sda1             1014M  143M  872M   15% /boot
tmpfs                  183M     0  183M    0% /run/user/0
192.168.52.156:/home/hzz   17G  1.1G   16G    7% /home/hzz
192.168.52.156:/home/zzh   17G  1.1G   16G    7% /home/zzh

//在客户端切换hzz用户,然后在家目录创建文件
[hzz@client ~]$ touch hzz
[hzz@client ~]$ ll
总用量 0
-rw-rw----. 1 hzz hzz 0 4月  29 04:31 hzz

//在服务端切换hzz用户查看有hzz文件,用户家目录同步成功
[root@server ~]# su - hzz
上一次登录:三 4月 29 04:07:46 CST 2020pts/0 上
[hzz@hzz ~]$ ll
总用量 0
-rw-rw----+ 1 hzz hzz 0 4月  29 04:31 hzz