linux 文件共享盘以及备份机制

发布时间 2023-11-28 11:41:48作者: jasenin

NFS minio  glusterFile 

1.NFS

NFS服务器搭建

 

 

 

NFS服务器

1、NFS简介

  • NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源
  • 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样
  • nfs适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能
  • nfs是运行在应用层的协议,其监听于2049/tcp和2049/udp套接字上
  • nfs服务只能基于IP进行认证

2、NFS工作机制

nfs是基于rpc来实现网络文件系统共享的。所以我们先来说说rpc。

2.1.RPC

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

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

rpc工作机制如上图所示,下面来描述一下它:

  • 客户端程序发起一个RPC系统调用基于TCP协议发送给另一台主机(服务端)
  • 服务端监听在某个套接字上,当收到客户端的系统调用请求以后,将收到的请求和其所传递的参数通过本地的系统调用执行一遍,并将结果返回给本地的服务进程
  • 服务端的服务进程收到返回的执行结果后将其封装成响应报文,再通过rpc协议返回给客户端
  • 客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

2.2.nfs工作机制

下面通过一个例子来说明NFS的简单工作流程:

需求:查看file文件的信息,此file存储在远程NFS服务端主机上(挂载在本地目录/shared/nfs中)
  • 客户端发起查看file信息的指令(ls file)给内核,内核通过NFS模块得知此文件并不是本地文件系统中的文件,而是在远程NFS主机上的一个文件
  • 客户端主机的内核通过RPC协议把查看file信息的指令(系统调用)封装成rpc请求通过TCP的111端口发送给NFS服务端主机的portmapper
  • NFS服务端主机的portmapper(RPC服务进程)告诉客户端说NFS服务端的mountd服务在某某端口上,你去找它验证

因为mountd在提供服务时必须要向portmapper注册一个端口号,所以portmapper是知道其工作于哪个端口的

  • 客户端得知服务端的mountd进程端口号后,通过已知的服务端mountd端口号请求验证
  • mountd收到验证请求后验证发起请求的客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问
  • 验证通过后客户端持mountd发放的令牌去找服务端的nfsd进程,请求查看某文件
  • 服务端的nfsd进程发起本地系统调用,向内核请求查看客户端要查看的文件的信息
  • 服务端的内核执行nfsd请求的系统调用,并将结果返回给nfsd服务
  • nfsd进程收到内核返回的结果后将其封装成rpc请求报文并通过tcp/ip协议返回给客户端

3、/etc/exports文件的格式

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

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

<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]

其中,除输出目录是必选参数外,其他参数均是可选项。

格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格。

客户端常用的指定方式:

客户端说明
172.16.12.129 指定IP地址的主机
172.16.12.0/24(或172.16.12.*) 指定子网中的所有主机
www.wangqing.com 指定域名的主机
*.wangqing.com 指定wangqing.com域中的所有主机
*(或缺省) 所有主机

选项用来设置共享目录的访问权限、用户映射等。exports文件中的选项比较多,一般可分为三类:

  • 访问权限选项(用于控制共享目录的访问权限)
  • 用户映射选项
    • 默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器会将其映射成一个本地的匿名用户(该用户为nfsnobody),并将其所属的用户组也映射成匿名用户组(该用户组也为nfsnobody),如此有助于提高系统的安全性。
  • 其他选项

访问权限选项:

访问权限选项说明
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、实操

showmount命令
用于查询nfs服务器的相关信息
-a 显示客户端信息和挂载点目录
-e (exports)显示nfs服务器的输出清单

1)手动挂载

要求:搭建nfs服务器,共享目录:/share并指定用户映射zhangsan,UID/GID为400

服务器端:

#关防火墙和selinux(也可以配规则)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

#创建用户zhangsan
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# passwd zhangsan
......
passwd: all authentication tokens updated successfully.
[root@localhost ~]# ls /home/
zhangsan

#更改用户UID GID
[root@localhost ~]# usermod -u400 zhangsan
[root@localhost ~]# groupmod -g400 zhangsan
[root@localhost ~]# id zhangsan
uid=400(zhangsan) gid=400(zhangsan) groups=400(zhangsan)

#下载nfs-utils rpcbind
[root@localhost ~]# yum -y install nfs-utils rpcbind
Loaded plugins: fastestmirror
......
Complete!
#启动服务
[root@localhost ~]# systemctl start nfs-server
[root@localhost ~]# systemctl start rpcbind

#创建共享目录
[root@localhost ~]# mkdir /share
[root@localhost ~]# ll -d /share/
drwxr-xr-x. 2 root root 6 Mar 26 20:46 /share/

#更改主配置文件/etc/exports
[root@localhost ~]# vi /etc/exports
/share  192.168.130.0/24(rw,anonuid=400,anongid=400)

#重启服务器
[root@localhost ~]# systemctl restart nfs-server
[root@localhost ~]# systemctl restart rpcbind

#设置用户访问控制列表
[root@localhost ~]# getfacl /share/
getfacl: Removing leading '/' from absolute path names
# file: share/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@localhost ~]# setfacl -m u:zhangsan:rwx /share/
[root@localhost ~]# getfacl /share/                  
getfacl: Removing leading '/' from absolute path names
# file: share/
# owner: root
# group: root
user::rwx
user:zhangsan:rwx
group::r-x
mask::rwx
other::r-x

客户端:

#下载showmount
[root@master ~]# yum -y install showmount
.....
Complete!

#使用showmount查看nfs信息
[root@master ~]# showmount -e 192.168.130.10
Export list for 192.168.130.10:
/share 192.168.130.0/24

#df
[root@master ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
......
/dev/sda1                 1038336  132368    905968  13% /boot
tmpfs                      402844       0    402844   0% /run/user/0

#创建挂载点/share-nfs
[root@master ~]# mkdir /share-nfs
[root@master ~]# ll -d /share-nfs/
drwxr-xr-x 2 root root 6 Mar 26 21:12 /share-nfs/

#更改自动挂载配置文件(注意:defaults,_netdev )
vi /etc/fstab
.....
192.168.130.10:/share /share-nfs nfs defaults,_netdev 0 0
#df
[root@master ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
........
192.168.130.10:/share    16250880 1216256  15034624   8% /share-nfs
#在/share-nfs下创建文件zs.txt
[root@master share-nfs]# touch zs.txt
#在客户端ll查看zs.txt
[root@master share-nfs]# ll
total 0
-rw-r--r-- 1 400 400 0 Mar 26 21:17 zs.txt
#在服务器端ll zs.txt
[root@localhost share]# ll
total 0
-rw-r--r--. 1 zhangsan zhangsan 0 Mar 26 21:17 zs.txt

手动挂载:mount

mount 被挂载目录 挂载点

mount 192.168.130.10:/share /share-nfs

2)自动挂载autofs

要求:客户端自动挂载共享目录

autofs服务程序是一种Linux系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。将信息填入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs服务程序则是在用户需要使用该文件系统时才会动态挂载,从而节约了网络资源和服务器硬件资源的开销。

客户端:

挂载点/share/nfs

二级挂载目录

主配置文件

子配置文件

#下载autofs
[root@master ~]# yum -y install autofs
......
Complete!

#创建挂载点
[root@master ~]# mkdir /share

#编辑/etc/auto.master(主配置文件!只写到挂载目录上一级)
如果把挂载信息都写入到autofs服务的主配置文件中,会使主配置文件臃肿不堪,不利于管理和维护。因此在autofs的主配置文件中按照"挂载目录的上层目录子配置文件"的格式填写,具体的挂载信息写入到子配置文件中,方便日后管理和维护。
vi /etc/auto.master
......
/share       /etc/auto.nfs     #子配置文件名字,后面在编写

#编辑子配置文件(只需要写子目录)auto为固定名称!!!
[root@master ~]# vi /etc/auto.nfs
nfs -fstype=nfs,rw,sync 192.168.130.10:/share
(nfs:子挂载目录会自动创建)
(rw、sync是挂载使用的权限,192.168.130.10:/share是远程NFS挂载目录。)

#启动服务autofs
[root@master ~]# systemctl start autofs

#df
[root@master nfs]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
.......
192.168.130.10:/share    16250880 1216256  15034624   8% /share/nfs
BASH 复制 全屏

注意:

如果启动autofs直接df可能查看不到挂载点

#进一级目录查看,然后手动cd进入二级目录,然后df查看
[root@master ~]# cd /share/
[root@master share]# cd nfs