NFS网络文件系统详解
第1章 NFS基本概述
1.1 什么是nfs
NFS是Network File System的缩写及网络文件系统。
主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS
1.2 为什么要使用NFS服务进行数据存储
1.实现多台服务器之间数据共享
2.实现多台服务器之间数据的一致
1.3 本地文件操作方式
当用户执行mkdir命令, 该命令会通过shell解释器翻译给内核,由内核解析完成后驱动硬件,完成相应的操作。
1.4 NFS实现原理(需要先了解[程序|进程|线程])
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
rpc是一个远程过程调用,那么使用nfs必须有rpc服务
1.5 NFS存储优点
1.NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
2.NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
1.6 NFS存储局限
1.存在单点故障, 如果构建高可用维护麻烦。(web-》nfs()-》backup)
2.NFS数据明文, 并不对数据做任何校验。
3.客户端挂载无需账户密码, 安全性一般(内网使用)
1.7 生产应用建议
1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力
2.必须将存储里的静态资源通过CDN缓存(jpg\png\mp4\avi\css\js)
3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
第2章 NFS基本使用
2.1 环境准备
|
服务器系统 |
角色 |
外网IP |
内网IP |
主机名 |
|
CentOS 7.5 |
NFS服务端 |
eth0:10.0.0.31 |
eth1:172.16.1.31 |
nfs |
|
CentOS 7.5 |
NFS客户端 |
eth0:10.0.0.7 |
eth1:172.16.1.7 |
web01 |
2.2 关闭防火墙及selinux(客户端,服务端都要关闭)
2.2.1 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2.2.2 关闭selinux
sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config setenforce 0
2.3 服务端安装nfs
[root@nfs ~]# yum -y install nfs-utils
2.3.1 配置nfs
我们可以按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式,定义要共享的目录与相应的权限。
[root@nfs ~]# echo '/data 172.16.1.0/24(rw,sync,all_squash)' > /etc/exports [root@nfs ~]# cat /etc/exports /data 172.16.1.0/24(rw,sync,all_squash)
如果想要把/data目录共享给172.16.1.0/24网段内的所有主机
1.主机都拥有读写权限
2.在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失
3.将所有用户映射为本地的匿名用户(nfsnobody)
2.3.2 创建对应的目录
[root@nfs ~]# mkdir /data
2.3.3 启动服务,并将服务加入开机自启动
[root@nfs ~]# systemctl enable rpcbind nfs-server [root@nfs ~]# systemctl start rpcbind nfs-server
2.3.4 检查端口
[root@nfs ~]# netstat -lntp Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 653/rpcbind
2.3.5 检查共享的内容
[root@nfs ~]# cat /var/lib/nfs/etab /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)
2.3.6 检查匿名用户对应的真实账户,并授权共享目录为nfsnobody
[root@nfs ~]# grep "65534" /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@nfs ~]# chown -R nfsnobody.nfsnobody /data
2.4 客户端安装nfs
[root@web01 ~]# yum install nfs-utils -y
2.4.1 启动rpcbind服务
[root@web01 ~]# systemctl enable rpcbind [root@web01 ~]# systemctl start rpcbind
2.4.2 使用showmount -e查看远程服务器rpc提供的可挂载nfs信息
[root@web01 ~]# showmount -e 172.16.1.31 Export list for 172.16.1.31: /data 172.16.1.0/24
2.4.3 创建挂载点目录,执行挂载命令
mount命令并结合-t参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的IP地址, 以及服务器上的共享目录, 最后需要写上要挂载到本地系统(客户端)的目录
[root@web01 ~]# mkdir /data [root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/ [root@web01 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载
172.16.1.31:/data 50G 2.6G 48G 6% /data
2.4.4 挂载成功后可以进行增删改操作,测试客户端是否拥有写的权限
[root@web01 ~]# echo "123" > /data/test [root@web01 ~]# ll /data/ 总用量 4 -rw-r--r-- 1 nfsnobody nfsnobody 4 9月 6 03:41 test
2.4.5 检查nfs服务端是否存在数据
[root@nfs ~]# ll /data/ 总用量 4 -rw-r--r-- 1 nfsnobody nfsnobody 4 9月 6 03:41 test
2.4.6 如果希望NFS文件共享服务能一直有效则永久挂载
(防止服务器重启挂载失效->服务器不会重启)
[root@web01 ~]# echo '172.16.1.31:/data /data nfs defaults 0 0' >> /etc/fstab [root@web01 ~]# tail -1 /etc/fstab 172.16.1.31:/data /data nfs defaults 0 0
验证fstab是否ok,前提要先卸载挂载
[root@web01 ~]# umount /data/
df -h 发现挂载没有了
[root@web01 ~]# mount -a
fstab如果ok,df -h查看会看到已经自动挂载了
2.4.7 如果不希望使用NFS共享, 可进行卸载
[root@web01 ~]# umount /data/
卸载的时候如果提示”umount.nfs: /data: device is busy”
1.切换至其他目录, 然后在进行卸载。
2.NFS宕机, 强制卸载umount -lf /data
2.5 配置多台客户端服务器的配置方法何上面客户端方法一致
注意:客户端的必须是服务端配置允许访问的NFS客户端网段内的所有主机
第3章 NFS配置参数及验证
3.1 nfs共享参数及作用
执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:
|
共享参数 |
参数作用 |
|
rw* |
读写权限 |
|
ro |
只读权限 |
|
root_squash |
当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用) |
|
no_root_squash |
当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用) |
|
all_squash |
无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用) |
|
no_all_squash |
无论NFS客户端使用什么账户访问,都不进行压缩 |
|
sync* |
同时将数据写入到内存与硬盘中,保证不丢失数据 |
|
async |
优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 |
|
anonuid* |
配置all_squash使用,指定NFS的用户UID,必须存在系统 |
|
anongid* |
配置all_squash使用,指定NFS的用户UID,必须存在系统 |
3.2 验证ro权限
[root@nfs ~]# echo '/data 172.16.1.0/24(ro,sync,all_squash)' > /etc/export [root@nfs ~]#cat /etc/exports /data 172.16.1.0/24(ro,sync,all_squash)
3.2.1 重载nfs(exportfs)
[root@nfs ~]# systemctl restart nfs-server
3.2.2 先卸载客户端已挂载好的共享
[root@web01 ~]# umount /data/
3.2.3 重新进行挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/
3.2.4 测试是否能写数据
[root@web01 ~]# cd /data/ [root@web01 data]# touch file-test 不允许写入数据 touch: cannot touch 'file-test': Read-only file system
3.3 验证all_squash,anonuid,anongid权限
[root@nfs ~]# echo '/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)' > /etc/exports [root@nfs ~]# cat /etc/exports /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
3.3.1 需要添加一个uid是666,gid是666的用户
[root@nfs ~]# groupadd -g 666 www [root@nfs ~]# useradd -u666 -g666 www [root@nfs ~]# id www uid=666(www) gid=666(www) 组=666(www)
3.3.2 必须重新授权为www用户,否则无法写入文件
[root@nfs ~]# chown -R www.www /data/
3.3.3 重启服务
[root@nfs ~]# systemctl restart nfs-server
3.3.4 客户端重新挂载
[root@web01 /]# umount /data/ [root@web01 /]# mount -t nfs 172.16.1.31:/data /data/ [root@web01 data]# ll total 4 -rw-r--r-- 1 666 666 4 Sep 6 03:41 test
3.3.5 测试是否能写入数据
[root@web01 data]# touch tes1 [root@web01 data]# ll total 4 -rw-r--r-- 1 666 666 0 Sep 7 10:38 tes1 -rw-r--r-- 1 666 666 4 Sep 6 03:41 test
3.3.6 为了防止权限不一致导致权限不足,建议在客户端创建一模一样的用户
[root@web01 ~]# groupadd -g 666 www [root@web01 ~]# useradd -u666 -g666 www [root@web01 ~]# id www uid=666(www) gid=666(www) groups=666(www)
3.3.7 在此检查文件身份
[root@web01 ~]# ll /data/ total 4 -rw-r--r-- 1 www www 0 Sep 7 10:38 tes1 -rw-r--r-- 1 www www 4 Sep 6 03:41 test
NFS网络文件系统详解的更多相关文章
- [转帖]Linux文件系统详解
Linux文件系统详解 https://www.cnblogs.com/alantu2018/p/8461749.html 贼复杂.. 从操作系统的角度详解Linux文件系统层次.文件系统分类.文件系 ...
- Docker:网络模式详解
Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...
- Docker网络模式详解
一.Docker四种工作模式 安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .hosthost:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用 ...
- docker 网络概述及网络模式详解
docker 网络概述及网络模式详解 1.网络概述 2.网络模式详解 1.网络概述: Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0) ...
- Linux系统NFS网络文件系统
Linux系统NFS网络文件系统 NFS(network file system)网络文件系统,就是通过网络让不同的主机系统之间可以共享文件或目录,此种方法NFS客户端使用挂载的方式让共享文件或目录到 ...
- NFS 网络文件系统挂载在A8板子上
我承认自己是菜鸟,没什么网络知识就来搞挂载nfs网络文件系统,花费了5天的时间才把nfs网络文件系统成功挂载在A8板子上,实现了A8板子和虚拟机的文件共享.分享一下个人经验: 以下是基于nfs已经完成 ...
- [学习嵌入式开发板]iTOP-4412实现NFS网络文件系统
本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统. 我们使用的软硬件环境是 ...
- NFS(网络文件系统的搭建)
关于NFS的原理,我在这就不概诉了,其实非常简答的理解就是一个网络磁盘,你需要把它挂载到你的磁盘上使用而已.那接下来谈谈如和搭建NFS网络文件系统. 需要使用2台机器作此实验,我分别配置IP为192. ...
- 用netstat查看网络状态详解
--用netstat查看网络状态详解 -----------------------------2014/06/11 一.Linux服务器上11种网络连接状态: ...
随机推荐
- 阿里云服务器Linux常用命令
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent
1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...
- H5分享到微信好友朋友圈QQ好友QQ空间微博二维码
这是分享按钮: <button onclick="call()">通用分享</button> <button onclick="call(' ...
- 今日头条极速版邀请码以及其它APP邀请码大全
现在大多手机新闻APP都需要输入码,在网上找了很久,最终找到一个比较全的文章,本人试过,都是可以使用的! 第1个比较好,可边看新闻,边收益!嘻嘻!平时写代码累了,休息刷一下!或者在睡觉前刷新一下,每天 ...
- 【Linux】unix/Linux常用命令英文全称
英文全称解释更容易理解 知其然,更要知其所以然 man: Manual 意思是手册,可以用这个命令查询其他命令的用法. pwd:Print working directory 显示当前工作路径. su ...
- Windows7建立无线热点
很实用的技巧,加以记录. 最初我是想使用connectify的,不过安装这个软件之后,发现有线账号登不上了,所以就选择使用Windows7自带的工具了. 首先以管理员身份运行cmd. 进入之后cd到c ...
- React学习笔记 - 组件&Props
React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
本篇文章主要介绍了在spring中通过配置init-method和destroy-method方法来实现Bean的初始化和销毁时附加的操作. 在java中,我们并不需要去管理内存或者变量,而在C或C+ ...
- SVN:验证位置时发生错误解决方案
1. 2. 3.preferencens > svn >svn接口-选择SVNKit(Pure Java)设置后,再引用svn路径后,直接弹出输入用户名和密码就对了. 4.
- pl/sql 存储过程执行execute immediate 卡住
在存储过程中,执行了create table.update table.insert into table 但是在使用pl/sql的存储过程调试的时候,一有问题就直接卡住(标识:执行中.....) 后 ...