【Linux笔记】-----NFS文件服务器原理、配置及案例

【Linux笔记】-----NFS文件服务器原理、配置及案例_第1张图片
先借鉴各位博主以及百科,介绍一下理论概念

1. NFS服务介绍

1.1什么是NFS服务

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。

1.2 NFS服务的优缺点

1.2.1优点

  a.节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
  b.简单容易上手
  c.方便部署非常快速,维护十分简单

1.2.2缺点

   a.局限性容易发生单点故障,及server机宕机了所有客户端都不能访问
   b.在高并发下NFS效率/性能有限
   c.客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)
   d.NFS的数据是明文的,对数据完整性不做验证
   e.多台机器挂载NFS服务器时,连接管理维护麻烦

2.1 NFS原理简单介绍

NFS Server服务器上设定/data目录被分享,而客户端可以通过internet将/data目录挂载到本地的挂载点(常用mnt)后,客户端就可以进入挂载点目录进行文件的读写

举个例子解释

比如我想在服务器端给公司的桌面PC(客户端)做一个共享的资料目录/data,大家可以任意查阅里面的所有资料信息,获取公司的内部重要信息。那么服务器端会将/data这个目录的整个磁盘区的信息共享到公司局域网当中。局域网中的桌面PC安装完NFS服务后,就可以在局域网中看到服务器端/data这个磁盘区被共享出来,桌面PC可以将这个局域网中的/data挂在到自己本地指定挂在点。然后通过局域网网络实时地同步信息。

那么首先要说明一下这个工作过程的原理。

step1.注册端口–达成协议–建立连接:
【Linux笔记】-----NFS文件服务器原理、配置及案例_第2张图片
step2.直接建立联系:
【Linux笔记】-----NFS文件服务器原理、配置及案例_第3张图片
1)客户端向服务器端的RPC(port 111)发出NFS文件访问功能的查询要求。
2)服务器端找到对应的已注册的NFS daemon端口后,会通知给客户端。
3)客户端了解到正确的端口后,就可以直接与NFS daemon连接。

什么是RPC

当服务器在启动NFS时会随机取用数个port端口,并且主动的向RPC注册,因此RPC可以知道每
个NFS的port对应的NFS功能,后,直接通过这个端口向客户端发送数据。
RPC需要借助一个叫portmap端口映射的进程服务将自己的程序号转化为端口号。
说白了主要的功能就是指定每个NFS功能所对应的port number,并且通知给客户端,让客户端可以连接到正确的端口上。(这些端口都是经过上面注册过的)另外RPC是通过固定的111 port监听客户端请求并向客户端响应正确的端口,这样可以使得NFS启动得更快捷。

NFS需要部署的进程

rpc.nfsd    NFS守护进程
rpc.mountd  管理文件系统和权限
portmap 端口映射

[ 案例 ]

架设一台NFS服务器,并按照以下要求配置
1、开放/nfs/shared目录,供所有用户查询资料
2、开放/nfs/upload目录作为192.168.171.0/24网段的数据上传目录,
并将所有用户及所属的用户组映射为nfs-upload,其UID和GID均为210
3、将/home/tom目录仅共享给192.168.171.144这台主机,并只有用户tom可以完全访问该目录
[root@localhost ~]# cat /etc/exports     //服务端
/nfs/shared     *(ro) // *所有主机 (ro)只读 (rw)为读写 
/nfs/upload     192.168.171.0/24(rw,all_squash,anonuid=210,anongid=210)
/home/tom       192.168.171.144(rw) 
用户映射选项:
no_all_squash   对普通用户不映射(默认设置)
all_squash      将所有普通用户和组映射为匿名用户和组
root_squash     将root用户和组映射为匿名用户和组(默认设置)
no_root_squash  对root用户和组不映射
anonuid=xxx     将用户映射为服务器上的指定UID
anongid=xxx     将用户组映射为服务器上的指定GID

其他选项:
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
[root@localhost ~]# mkdir /nfs/upload -p   //服务器端
[root@localhost ~]# mkdir /nfs/shared
[root@localhost ~]# chmod 777 /nfs/upload
[root@localhost ~]# mkdir /home/tom
[root@localhost ~]# systemctl restart nfs //服务正常启动
[root@localhost ~]# systemctl stop firewalld ///***
[root@localhost ~]# id tom             //当客户端的uid和gid一致时我才认为两个tom是一样的
uid=1003(tom) gid=1003(tom) 组=1003(tom) //这样就可获得同等的权限(主要重点)
[root@localhost ~]# mkdir /nfsshared       //客户端
[root@localhost ~]# mount 192.168.11.128:/nfs/shared /nfsshared //挂载目录
[root@localhost ~]# mkdir /nfsupload
[root@localhost ~]# mount 192.168.11.128:/nfs/upload /nfsupload
[root@localhost nfsshared]# df -h     //查看一下是否挂载成功
文件系统                    容量  已用  可用 已用% 挂载点
/dev/sda2                    20G  3.6G   16G   19% /
devtmpfs                    899M     0  899M    0% /dev
tmpfs                       913M  100K  913M    1% /dev/shm
tmpfs                       913M  9.0M  904M    1% /run
tmpfs                       913M     0  913M    0% /sys/fs/cgroup
/dev/sda1                   197M  139M   59M   71% /boot
tmpfs                       183M  4.0K  183M    1% /run/user/42
tmpfs                       183M   16K  183M    1% /run/user/1000
/dev/sr0                    3.8G  3.8G     0  100% /run/media/redhat/RHEL-7.2 Server.x86_64
tmpfs                       183M     0  183M    0% /run/user/0
192.168.11.128:/nfs/shared   20G  3.8G   16G   20% /nfsshared
192.168.11.128:/nfs/upload   20G  3.8G   16G   20% /nfsupload
[root@localhost ~]# cd /nfsshared/     //检验shared文件是否满足(ro)只读权限
[root@localhost nfsshared]# touch aayayaya
touch: 无法创建"aayayaya": 只读文件系统
[root@localhost nfsshared]# cd /nfsupload/     //检验upload的权限可以读写编辑
[root@localhost nfsupload]# touch aa
[root@localhost nfsupload]# ll
总用量 0
-rw-r--r--. 1 210 210 0 812 09:52 aa
[root@localhost nfsupload]# su redhat
[redhat@localhost nfsupload]$ touch bbb   //切换本地用户再次检验权限
[redhat@localhost nfsupload]$ ll
总用量 4
-rw-r--r--. 1 210 210 7 812 09:54 aa
-rw-rw-r--. 1 210 210 0 812 09:57 bbb
[root@localhost ~]# useradd -u 1003 tom  //客户端tom的uid与gid跟服务端一致,避免权限问题
[root@localhost nfsupload]# id tom
uid=1003(tom) gid=1003(tom) 组=1003(tom)
[root@localhost ~]# mkdir /nfstom
[root@localhost ~]# mount 192.168.11.128:/home/tom /nfstom

你可能感兴趣的:(个人笔记)