nfs服务器
文件传输工具
ftp:vsftpd工具
Samba:Linux和Windows之间进行文件共享
NFS:专用于linux和Linux之间的专门的文件共享服务(NFS服务),network filesystem网络文件系统。NFS服务可以把远程linux机器上面的文件目录数据,通过挂载的形式,映射在用户本地机器(Linux用户在自己本地有一个文件夹,通过NFS服务,把本地的这个文件夹远程挂载到网络中一台机器的文件夹)
NFS特点
NFS很像windows的网络共享,samba服务
samba服务主要用于办公室的局域网共享服务
NFS发展有30年,代表了一个稳定的网络文件共享系统,中小型企业最佳的文件共享选择
企业为何需要共享存储
共享存储的形成
分为软件、硬件共享存储的形式
(1)软件共享存储 ---NFS服务搭建
(2)硬件共享服务
中小型企业一般不会购买硬件存储设备,因为成本太高,大公司业务发展特快,需要购买硬件设备分散网站的压力。如果网站的压力持续增长,硬件存储设备就得继续扩展,成本过高,因此主流的企业都会选择开源的软件替代硬件设备,比如NFS集群服务的搭建
- 未配置共享存储
当用户A上传一张图片到服务器A时,用户B需要查看该图片但是访问到服务器B,无法找到该图片
- 配置共享存储
当用户A上传一张图片到服务器A是,服务器A又传到NFS服务器,NFS服务器将图片同步到服务器B和服务器C,当用户需要查看该图片时,不管是访问到ABC哪台服务器,都能找到该图片
NFS工作原理
如图是企业中NFS服务器和客户端的挂载结构
- 在NFS服务端设置一个共享的目录/video,其他有权限访问NFS服务器的客户端都可以把该目录/video挂载到本地客户端的某个挂载点(挂载点就是一个目录,可以自由定义路径)
- 客户端正确挂载完毕后,进入NFS客户端的挂载点,也就能够看到NFS服务端的/video共享目录下的数据,在客户端查看时,NFS服务端/video的目录数据就相当于本地一个目录而已,根本察觉不到任何区别。
NFS和RPC的概念
NFS通过port传输数据,NFS服务在传输数据的时候,端口是随机选择的(可以自己重启NFS服务,查看端口是否在变化),因此NFS需要通过RPC服务,进行一个端口注册,实现告知用户NFS的工作端口是哪一个
什么是RPC
RPC是远程过程调用
Linux上使用NFS服务,必须启动2个服务
- NFS服务
NFS服务通过RPC注册自己的端口功能 - RPC服务
RPC服务功能就是记录每个NFS功能对应的一个端口号,并且RPC保证了NFS客户端发出请求的时候,把该功能对应的端口信息告知NFS客户端,保证客户端能够正确连接到NFS服务端的端口,达到数据传输的目的
RPC好比是一个中介,处于客户端和服务器之间
问题:RPC服务如何知道NFS服务端的端口信息呢?
答案:NFS服务器启动的时候,会随机采用若干个窗口,并且主动在RPC服务中进行注册。如此一来,RPC服务就正确知道所有NFS服务端的端口功能了,RPC服务默认使用liunx的111端口和NFS客户端进行一个交流,并且通过111端口将正确的NFS服务端的端口信息,告知给NFS客户端。因此NFS客户端就能够正确找到NFS服务端的端口信息了。
NFS配置文件详解
NFS服务的配置,必须先运行好RPCBIND服务才行,如果RPCBIND服务重启了,原本注册的NFS服务端的信息也就失效了,你还得再重启NFS服务器,重新注册信息才行。如果你仅仅修改了NFS的配置文件,不需要重启NFS服务端,因为重启之后,端口的信息就更新了,还得重新注册,只需要执行如下的命令,重新读取NFS配置文件即可。
exports -rv
systemctl reload nfs
安装配置NFS
安装以下两个服务
sudo yum install nfs-utils rpcbind -y
- nfs-utils:NFS服务的主程序,包括了rpc.nfsd rpc.mountd这两个守护进程和相关的配置文件信息
- rpcbing:centos7的一个PRC服务进程
环境配置
NFS是C/S模式,client,server,准备一个NFS服务器,准备一个NFS客户端。
- 在NFS-server端创建一个用于共享的文件夹,且设置相应的读写权限
mkdir nfschange
chmod -Rf 777 nfschange
- 修改NFS服务的配置文件
/etc/exports
nfs配置文件需要遵守如下的规矩:
NFS服务端共享目录 NFS客户端地址(参数1,参数2....) NFS客户端地址2(参数1,参数2...)
例如:
(1)把nfs服务端的根目录共享出去,且允许两个主机名为client1,client2的机器进行读写权限
/ client1(rw) client2(rw)
(2)允许任意的客户端,都能够挂在到此NFS服务端的/public目录下
/piblic *(rw)
(3)只允许指定的IP地址的服务器,能够挂在此NFS服务端的/home/change文件夹,且是只读的
/home/change 123.266.16.61(ro)
nfs语法参数解释
- nfs共享目录:是nfs服务器需要共享出去的实际目录,文件夹,必须写绝对路径,且注意目录的读写本地权限,如果你允许客户端读写操作,other有一个读写的权限(user,group,other 三个身份)
- NFS客户端地址:也就是NFS服务器授权可以访问共享目录的地址,可以写主机名、写通配符、IP地址
- 权限参数:对NFS授权的客户端,进行权限控制的参数
nfs客户端地址形式
- 单一客户端:192.168.178.113 #用的少
- 允许整个网段访问:192.168.178.0/24 #指定局域网网段,用的较多
- 授权整个域名客户端 nfs.xdn.com #用的很少
- 授权子域名客户端:*.xdn.com #用的很少
nfs客户端的权限参数
ro 只读
rw 读写
root_squash 当nfs客户端以root账号访问NFS服务端共享目录数据的时候,把该root映射为NFS服务端的一个匿名用户,该用户的UID、GID会变成nfsnobody的信息
no_root_squash 几乎和上面一样,root账户会被映射为root账户,非常不安全,禁用
all_squash 所有nfs客户端的用户都映射为匿名供用户,很安全、生产环境常用
sync 数据同步写入到内存和磁盘,优点是保证内存数据安全,但是效率太低
async 数据先写入到内存,再持久化到磁盘,效率非常高,但是可能会有数据丢失的隐患
启动NFS服务端的文件目录共享
NFS服务都是基于RPC的111通信端口,必须确保先启动了RPC服务,如果RPCBIND服务停止了,111端口也不会挂掉,因为centos7还提供了一个rpcbind.socket服务运行着
- 保证rpcbind服务正确运行
[ops@nfs-server ~]$ systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-09-07 16:01:10 CST; 3min 14s ago
Process: 521 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 525 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─525 /sbin/rpcbind -w
nfs服务端部署
- 确保rpcbind服务正确启动
- 创建nfs服务端共享的目录,且进行权限修改
mkdir -p nfschange
chmod -Rf 777 nfschange
sudo chown -R nfsnobody.nfsnobody nfschange/
- 在nfs共享目录中,创建测试的文件
[ops@nfs-server ~]$ touch nfschange/test.txt
[ops@nfs-server ~]$ touch nfschange/test2.txt
[ops@nfs-server ~]$ ls nfschange/
test2.txt test.txt
- 修改nfs服务端的配置文件,进行客户端授权
sudo vim /etc/exports
/home/ops/nfschange *(insecure,rw,sync)
# 参数解释:insecure允许客户端从大于1024的端口发请求
- 重新加载nfs,读取配置文件
sudo systemctl restart nfs
- 检查本地的nfs服务端挂载情况
[ops@nfs-server ~]$ showmount -e 127.0.0.1
Export list for 127.0.0.1:
/home/ops/nfschange *
- 再次检查nfs服务端的共享参数
[ops@nfs-server ~]$ cat /var/lib/nfs/etab
/home/ops/nfschange *(rw,sync,wdelay,hide,nocrossmnt,insecure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,insecure,root_squash,no_all_squash)
- 此时可以把nfs服务器本地当做一个客户端,模拟挂载访问试试
[ops@nfs-server ~]$ sudo mount -t nfs 127.0.0.1:/home/ops/nfschange /mnt
[ops@nfs-server ~]$ mount -l | grep mnt
127.0.0.1:/home/ops/nfschange on /mnt type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=127.0.0.1,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=127.0.0.1)
[ops@nfs-server ~]$ ls /mnt/
test2.txt test.txt
- 如果不用nfs目录共享了,可以直接取消挂载,只需要取消本地目录的挂载即可
umount /mnt
自动挂载NFS文件系统
配置开机挂载服务,每次开机都能用nfs
把挂载命令写入到开机自动挂载文件中/etc/fstab
(客户端)
sudo vim /etc/fstab
172.139.20.210:/home/ops/nfschange /mnt nfs defaults 0 0
autofs自动挂载服务
如果开机就强制挂载很多内容,但是又不经常使用会给服务器造成很大的压力,因此一些具有动态特性的文件系统,可以选择进行动态挂载。
比如:光盘,软盘,U盘,移动硬盘,NFS,SMB等文件系统
autofs特点
autofs和mount命令的不同点在于:
autofs是一个守护进程,它会在后台检测用户是否要访问某一个还未挂载的文件系统,autofs会自动检测该文件系统是否存在,如果存在则进行挂载,如果用户过了一段时间没有使用该问价系统,autofs自动将其卸载,节省人力维护的成本,以及节省服务器资源。
缺点:
autofs缺点是当用户请求时候才挂载文件系统,如果是高并发的业务场景,大量的用户并发访问文件系统,autofs突然进行大量挂载,会给服务器造成很大的压力,因此在一些高并发场景下,宁愿保持持续挂载也不用autofs。
安装autofs工具
sudo yum install -y autofs
修改autofs配置文件
- 打开autofs配置文件,找到第7行(/misc /etc/auto.misc),添加如下代码
/- /etc/auto.home #添加这里的配置参数
- 修改自定义的自动挂载配置文件并启动autofs
[ops@nfs-client ~]$ sudo vim /etc/auto.home
/mnt -rw,soft.intr 172.139.20.201:/home/ops/nfschange
[ops@nfs-client ~]$ sudo systemctl start autofs
[ops@nfs-client ~]$ systemctl status autofs
● autofs.service - Automounts filesystems on demand
Loaded: loaded (/usr/lib/systemd/system/autofs.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2024-09-07 17:45:19 CST; 26s ago
Main PID: 2861 (automount)
CGroup: /system.slice/autofs.service
└─2861 /usr/sbin/automount --systemd-service --dont-check-daemon
- 检查本地文件系统情况
只要autofs检测到用户,对挂载点,进行读写,比如ls、cd的操作,autofs就会自动进行挂载,当一段时间不操作之后,autofs会自动卸载该设备