保定网站排名央视新闻的新闻
目标:
-
了解:NFS 工作原理
-
部署:NFS 文件共享服务
-
配置:NFS 访问控制
-
掌握:NFS 客户端访问方法
4.1 nfs 概述
NFS 是 <Network File System 网络文件系统> 的缩写,它最大的功能就是:可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。常用于挂载持久化数据使用
一般使用云上的 nas 卷代替
NFS 主要用于<UNIX/Linux服务器>之间的<共享目录访问>
当然<Windows客户端>也可以访问<NFS共享目录>。
通俗来讲就是将服务器创建一个目录,挂载到客户端那里,
相当于是共享该目录,可以在里面做操作或者传输文件
当几百台机器一起更新一个网页或者别的时候,可以放在服务端上,然后全部挂载到客户端,直接解决
nfs 是文件系统 rpc 是传输数据文件系统
nfs 优点:
-
简单容易,易于掌握
-
方便快速部署,维护简单容易
-
可靠,从软件层面上看,数据可靠性高,经久耐用
nfs 局限:
- 存在单点故障,如果<NFS服务器>宕机了,则所有<NFS客户端>都不能访问NFS共享目录
可以通过rsync来进行数据同步,或者采用<负载均衡的高可用方案>解决该问题
-
<NFS服务端>在高并发的场合下,性能有限。
一般几千万以下<pv网页浏览量>的网站不是瓶颈,除非网站架构太差
-
<NFS服务端>的<客户端认证>是基于<IP和主机名>的,安全性一般。
但用于内网则问题不大
-
<NFS数据>是明文的,不做<数据完整性>验证。
一般是存放于内网,提供内网的服务器使用,所以安全性相对不是一个问题
-
多个<NFS客户端>挂载同一个<NFS服务端>时,维护管理比较麻烦。当<NFS服务端>出问题后,所有<NFS客户端>都会挂掉。
可使用autofs自动挂载来解决,否则,需要手动重新挂载
4.2 工作原理和步骤
备注:<NFS服务>需要在<RPC服务>中注册<端口号> rpc服务相当于中介
(1) <客户端>向<NFS服务器>发送<资源请求>时,<客户端RPC服务>通过网络向<NFS服务端的RPC(111端口口)>发出<资源请求>
(2) <NFS服务端的RPC服务>获取<NFS服务端的注册端口>,然后通知<客户端RPC服务>
(3) <客户端>收取到<正确的端口>之后,直接与<NFS服务端>建立通信。
(4) <NFS服务端>接受<资源请求>之后,通过<本地响应>读取<本地磁盘中的内容>,然后返回给<客户端>,完成一次<存取操作>
客户端不需要下载 rpcbind ,只需要下载 nfs-utilf 不过两个下载都可以
工作原理图如下
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
步骤:
服务机创建 共享目录 ,给共享目录权限 ,在配置文件写入内容 允许 别人挂载
客户机 将共享目录 挂载在其新创建的目录下,一个新目录挂载一个共享目录
4.3 安装 RPC 和 NFS
1 安装
yum install rpcbind nfs-utils -yrpcbind ## 这是<RPC服务>的主体程序,它会被<nfs-utils程序>自动依赖安装。主要职能:在客户端访问<NFS共享>的时侯,客户端通过<RPC服务>来获知<NFS服务的端口号>;可以理解<rpc服务>就是一个<中介服务>,因此<RPC服务>要先于<NFS服务>启动nfs-utils ## 该<nfs-utils>为<内核中的NFS服务器>提供了一个<daemon守护进程>,它是<NFS服务>的主程序,该<nfs-utils>也包含着<NFS实用程序>、<NFS客户端>## 注意:安装后会有程序用户 nfsnobody 自动创建
2 启动服务
启动顺序的问题:
必须:先启动rpcbind服务,然后再启动nfs服务
因为:NFS服务需要在RPC服务中注册端口号
针对:CentOS 6(init机制),两个都要启动 (了解)
## 必须:先启动<rpcbind服务>,后启动<nfs服务>
chkconfig rpcbind on
chkconfig nfs on
service rpcbind start && service nfs start
## 查看:nfs和rpc的<开机自启动>设置
chkconfig --list | grep -E "(rpc|nfs)"
针对:CentOS 7(systemd机制) 启动nfs 会自动在此之前启动 RPC
安装<rpcbind程序>之后,<rpcbind.service>是默认开机自启动
## 在启动<nfs-server.service服务>的过程中,会自动为我们先启动<rpcbind.service服务>,更加智能方便
systemctl enable nfs
systemctl start nfs
systemctl status nfs
查看开机自启情况
systemctl list-unit-files ## 查看所有服务的开机自启动情况
systemctl list-unit-files | grep enabled |grep -E "(rpc|nfs)" ## 查看 rpc 和 nfs 的开机自启动情况
3 查看依赖
systemctl list-dependencies rpcbind
systemctl list-dependencies nfs-server
4 了解端口 NFS 端口
RPC的端口号:111,NFS的端口号:2049 ,可查看
netstat -4 -tunlp | grep -P "(111|2049)" | sort -k4
查看:<RPC服务>中的<端口注册信息>
rpcinfo -p localhost
5 配置 RPC 和 NFS 防火墙
firewall-cmd --permanent --zone=public --add-service=nfs --add-service=rpc-bind
firewall-cmd --reload## 我们在测试时候可以关闭防火墙
4.4 创建 NFS 共享目录(服务端)
以 ip 为 192.168.58.100 为服务机
1 本机创建共享目录
mkdir -p /{nfstest1,nfstest2} ## 根目录下创建两个目录,创几个都可以,当作共享目录chmod -R o+rwx /{nfstest1,nfstest2} ## 共享目录给 其他人 设置权限
setfacl -R -m u:nfsnobody:rwx /{nfstest1,nfstest2} ## 设置 <NFS匿名用户> 的<ACL权限>,这样客户端可以访问和操作该文件## 注意:<NFS客户端>默认采用<nfsnobody匿名用户>来访问<NFS共享目录>
2 共享导出:<共享目录>
在 CentOS 6 中:
<NFS服务端>通过</etc/exports配置文件>,来共享导出<共享目录>
在 CentOS 7 中:
<NFS服务端>通过</etc/exports配置文件>或者</etc/exports.d/xxx.exports配置文件>,来共享导出<共享目录>
测试最好是 创建 /etc/exports.d/xxx.exports 文件,在里面写入允许别人共享内容
echo "/nfstest1 192.168.58.0/24(rw)" > /etc/exports.d/dir01.exports ## 仅允许<192.168.58.0/24网络>中主机的<读写访问>
echo "/nfstest2 192.168.58.130/24(rw)" > /etc/exports.d/dir02.exports ## 仅允许<192.168.58.130/24网络>中主机的<读写访问>
echo "/nfstest3 *(rw)" > /etc/exports.d/dir03.exports ## 允许任何主机进行读写访问,任何服务器都可以将它挂载到自己主机上或者 vim /etc/exports.d/test.exports
/nfstest1 192.168.58.0/24(rw)
或者
/nfstest1 192.168.58.0/24(rw,sync)保存后
exportfs -ra # 刷新配置文件
或者
systemctl restart nfs-server # 重启服务
showmount -e # 查看验证配置文件是否写错
showmount -e 192.168.58.100 # 查看指定ip 的共享目录
服务端共享参数
参数 | 作用 |
---|---|
ro | 只读 表示文件系统是只读的,客户端不能修改数据,只能读取 |
rw | 读写 表示文件系统是读写的,客户端可以读取和写入数据。 |
sync | 同步写入,所有数据都会立即同步到磁盘,确保数据一致性,但会降低性能 |
async | 异步写入,数据会先缓存在内存中,再按一定时间间隔写入硬盘,这样可以提升性能,但可能会丢失部分数据 |
root_squash | 客户端使用root用户访问共享时,映射为普通用户(如 nfsnobody)的权限**(默认)** |
no_root_squash | 客户端使用root用户访问共享时,直接将其映射为 NFS 服务器上的root用户权限 |
all_squash | 不管客户端使用的是哪个用户,都会映射成nfsnobody用户的权限,通常用于限制客户端的访问权限 |
no_all_squash | 无论什么普通用户访问,都不会映射成nfsnobody用户的权限,保持客户端原有的 UID 和 GID**(默认)** 建议客户端和挂载的用户名称和uid一致如 www-data 33 |
anonuid | 配置all_squash使用,指定 NFS 服务器上使用的匿名用户 UID,匿名用户必须在服务器系统中存在 |
anongid | 配置all_squash使用,指定 NFS 服务器上使用的匿名用户 GID,匿名用户必须在服务器系统中存在 |
一般给权限都会给挺多的
vim /etc/exports
4.5 挂载共享目录 (客户端)
客户端 ip 为 192.168.58.132
记得安装 和 重启服务
yum install nfs-utils -y
systemctl list-unit-files| grep enable | grep -E "(rpc|nfs)"
创建新目录,将服务端的共享目录挂载到这里
mkdir -p /mnt/{test1,test2}
mount -t nfs 192.168.58.100:/nfstest1 /mnt/test1
mount -t nfs 192.168.58.100:/nfstest2 /mnt/test2
df -h ## 到此结束,已经完成将 服务端共享目录挂载到客户端
## 无论在服务端或者客户端的目录下执行操作,另外一方也会跟着改变
4.6 自动挂载
NFS共享文件夹(autofs自动挂载)
客户端进行操作
autofs自动挂载服务是一种Linux系统守护进程,当检测到用户视图访问一个尚未挂载的文件系统时,会自动挂载该文件系统。简单来说,将挂载信息写入/etc/fstab文件中,系统在每次开机时都会自动挂载,而autofs服务则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器硬件资源的开销。
简单来说就是:你用,我就挂载!!!你不用,我就卸载!!! 本人觉得没必要使用
1、配置文件详解
autofs服务要实现自动挂载涉及到两个文件,主配置文件auto.master和次配置文件auto.misc
主配置文件写挂载的 大目录路径 和 要挂载的服务端共享目录 ,次配置文件写挂载的小目录名 挂载类型和权限 还有服务端共享目录
/etc/auto.master
这个文件是统一,唯一的。系统配置文件,里面注明了自动挂载的根目录和应用的配置文件
/mnt /etc/auto.test1 --timeout 300/mnt:代表了挂载的根目录所在
auto.test1:代表所应用的配置文件
--timeout:300代表系统超时,单位s 默认就是 300秒,可不写,5分钟不用会自动取消挂载,用的时候自动挂载######################################/etc/auto.media 这个文件是自定义的,对应master中的配置文件,里面写明了实际挂载目录,挂载参数和挂载项所在位置
testdj -fstype=iso9660,loop,ro 192.168.58.100:/iso/Rhel6p4.isotestdj:代表挂载位于/mnt/testdj-fstype=iso9660:文件类型为光盘loop:将文件模拟块设备挂载在本地ro=readonly :/iso/Rhel6p4.iso:镜像所在位置为/iso挂载NFS网络文件系统
2、配置NFS自动挂载
客户端操作:
假如服务端 ip 是 192.168.58.100 ,共享目录是 /cl
将该目录挂载到客户端的 /mnt/aa 目录下
1)安装服务安装:autofs(老三样)
yum install autofs -y
systemctl enable autofs && systemctl start autofs
2)配置主配置文件
vim /etc/auto.master
添加配置内容
/mnt /etc/auto.test1
3)配置次要文件 (主配置文件定义后,然后新创建的)
vim /etc/auto.test1
aa -fstype=nfs 192.168.58.100:/cl## 另外 aa目录不能提前创建,自动挂载时系统自动创建aa目录
4)启动/重启/开机自启autofs服务:
systemctl start/restart/enable autofs
注: 只有cd /mnt/aa 进去, 触发一下,才能自动挂载。
[root@192 mnt]# ls[root@192 mnt]# cd aa
[root@192 aa]# cd -
/mnt
[root@192 mnt]# ls
aa## 什么都没有,cd进去使用的时候自动挂载
4.7 实战配置nfs服务(重要)
服务端(100)创建共享目录 /dj 挂载到 客户端(132) 的 /mnt/test 下 ,并允许共享目录被挂载到同一网段下的机器
注意:以下是已经安装 RPC 和 NFS 服务且开启服务的情况下的操作
1 服务机器
mkdir -p /dj
chmod -R o+rwx /dj
setfacl -R -m u:nfsnobody:rwx /dj
echo "/dj 192.168.58.0/24(rw)" > /etc/exports.d/test.exports
exports -ra
systemctl restart nfs
showmount -e ## 验证
## vim 写入 /dj 192.168.58.0/24(rw) 也可以
2 客户端机器 192.168.58.132
mkdir -p /mnt/test
showmount -e 192.168.58.100 ## 查看该ip的机器 是否有nfs共享目录
mount -t nfs 192.168.58.100:/dj /mnt/test ## 挂载 共享目录dj 到创建的 test 目录下
df -h ## 查看是否挂载成功,成功则完成
4.8 脚本配置nfs服务
自己做的,有点小问题 有兴趣自取然后修改一下测试看看
#!bin/bash
while true
doecho "---------------------"echo "1 您是服务端"echo "2 您是客户端"echo "3 取消返回"echo "---------------------"read -ep "请输入您的选择:" acase $a in1) echo "正在为您安装服务和启动服务,请稍后"yum -y install rpcbind nfs-utils &>/dev/nullsystemctl start nfs &>/dev/nullsystemctl enable nfs &>/dev/nullecho "安装成功,服务已启动!!"echo "您可以一次创建一个或多个共享目录,用空格隔开"read -ep "创建的共享目录名是(如test1):" -a gxfor b in ${gx[*]}domkdir -p /$bdoneecho "创建成功,共享目录已经创建在根目录下"for((i=0;i<${#gx[*]};i++))doecho "/${gx[i]} *(rw)" > /etc/exports.d/test${i}.exportsdoneexportfs -ar &>/dev/bullsystemctl restart nfs &>/dev/null;;2)echo "正在为您安装服务和启动服务,请稍后"yum -y install rpcbind nfs-utils &>/dev/nullsystemctl start nfs &>/dev/nullsystemctl enable nfs &>/dev/null echo "安装成功,服务已启动!!"read -ep "请创建要挂载到的目标目录(如dj1):" -a gzfor((c=0;c<${#gz[*]};c++))domkdir /mnt/${gz[c]} &>/dev/nulldoneecho "创建目录成功"##注意:这里和上面创建的目录其实方法是一样的,可以互通read -ep "请输入服务端的ip地址(如 192.168.58.100):" becho "您可以一次挂载一个或多个共享目录,用空格隔开"read -ep "输入你想挂载的共享目录(如test1):" -a gxread -ep "输入你想挂载到的目录(如dj1):" -a xgzfor((i=0;i<${#gx[*]};i++))domount -t nfs $b:/${gx[i]} /mnt/${xgz[i]} &>/dev/nulldoneecho "挂载成功";;3)break;;*)echo ""echo "输入错误,请按照格式输入谢谢!!" ;;esacdone
4.9 exportfs 和 showmount 命令
1 exportfs
exportfs -ar ## 重新共享导出:所有的<共享目录>## 注意清空<内核>中<老数据>,重新建立<新数据>
exportfs -s 或 exportfs -v ## 查看<NFS服务端>共享导出的<共享目录>和<导出参数>
exportfs -u 192.168.58.0/24:/dir01 ## 禁止共享导出:指定的<共享目录>
exportfs -a ## 共享导出所有的<共享目录>
**2 shoumount ** 当服务端 ip 是192.168.58.100 时候
showmount -e 或者 showmount -exports ## 查看本机器可共享导出的共享目录 ## 在服务端操作则是查看NFS服务端共享导出的共享目录
showmount -e 192.168.58.100 ## 查看指定机器可共享导出的共享目录 ## 在客户端操作则是查看NFS服务端共享导出的共享目录