这里写目录标题
NFS文件服务器
一、Nfs是什么
在学习该内容之前,我们需要先了解NFS是什么?
NFS是什么?它和客户端之间的关系是?
NFS:(Network File System)网络文件系统,基于内核的文件系统。它允许网络中的计算机之间通过TCP/IP网络共享资源。它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。
NFS服务器可以设置共享目录让网络中的客户端挂载到本地目录上使用,而对于客户端来说,就相当于在该目录中添加了一个硬盘分区,所有客户端都可以在服务器允许的情况下对该目录进行操作共享的资源(其实是读写位于NFS服务器上的文件或目录)。这样本地终端可以减少自身存储空间的使用。
NFS 有很多实际应用:
- 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。
- 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
- 不同客户端可在NFS上观看影视文件,节省本地空间。
- 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下。
NFS的基层原理是什么?
其实NFS本身是没有信息传输的功能的,它的文件或信息传送过程需要通过RPC协议,所以我们在理解NFS之前,还需要理解的一个内容—RPC
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
而RPC就是用来统一管理NFS端口的 服务,并且统一对外的端口是111,RPC会记录NFS端口的信息
RPC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,使客户端可以连接到正常端口上去。
了解到RPC是什么后,再来看看NFS是怎样使用RPC和客户端建立连接的
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
接下来进一步了解NFS的工作流程
1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
二、NFS配置前
进行配置之前,我们需要了解到以下一些内容
需要的两个软件
nfs-utils(NFS服务的主程序)
包括基本的NFS命令与监控程序
rpcbind(RPC服务的主程序)
持安全NFS RPC服务的连接
这个就是 NFS 服务所需要的主要软件。
NFS的常用目录
/etc/exports
NFS服务的主要配置文件,不过系统并没有默认值,可能会没有这个文件,直接手动建立即可。
/usr/sbin/exportfs
&emspNFS服务的管理命令,可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享。
/usr/sbin/showmount
客户端使用该命令,可以用来察看 NFS 分享出来的目录资源。
/var/lib/nfs/
登录文件都放置到 目录里面
/var/lib/nfs/etab
记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab
记录曾经登录过的客户端信息
配置文件/etc/exports文件内容格式
/输出目录名 客户端1(访问权限,用户映射,其他) 客户端2(访问权限,用户映射,其他)
配置文件内容详解:
- 输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;
- 客户端:
客户端是指网络中指定网络可以访问这个NFS服务器共享目录的计算机
客户端常用的指定方式
指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主机:david.bsmart.cn
指定域中的所有主机:*.bsmart.cn
所有主机: *
- (访问权限,用户映射,其他)
访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与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端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
三、Linux中NFS搭建及应用(Centos7)
在做实验之前,我们应该先理清实验思路:
首先我们要准备三台相互能ping通的PC
将其中一台定为NFS服务器,并在NFS服务器上进行如下操作:
1.安装nfs和rpcbind服务
2.进入配置文件配置内容
3.创建共享目录
4.刷新配置文件信息,重启服务,并将该协议加入防火墙规则
5.客户端验证
NFS文件服务器
需要两个软件,rpcbind和nfs-utils
一般Linux系统默认安装,没有安装的自行安装
[root@localhost ~]# yum -y install nfs-utils rpcbind --安装这两个软件
[root@localhost ~]# rpm -qa nfs-utils rpcbind --查看是否安装这两个软件
rpcbind-0.2.0-38.el7.x86_64
nfs-utils-1.3.0-0.33.el7.x86_64
在确认安装了这两个软件之后,我们可以在/etc目录中找到有关nfs的共享配置文件,叫做/etc/exports
,对其进行配置:
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/share 192.168.1.0 (sync,rw,no_root_squash) --share目录,对所有主机共享,拥有可读可写权限,远程root映射成root用户,并将数据同步写入内存缓冲区与磁盘中。
创建该共享目录,给予文件访问权限
[root@localhost ~]# mkdir /share
[root@localhost ~]# chmod 777 /share
[root@localhost ~]# ll -d /share
drwxrwxrwt. 2 root root 6 6月 10 10:43 /share
[root@localhost ~]#
重新读取刚才设置的共享配置文件
这里使用到一个命令:exportfs
格式: exportfs [选项]
选项 | 作用 |
---|---|
-a | 全部挂载或者卸载 |
-V | 查看当前要被共享的目录属性 |
-u | 卸载某一个目录 |
-r | 重新挂载; |
[root@localhost ~]# exportfs -rv --重新读取刚才设置的共享配置文件,并查看目录属性
exportfs: No options for /share 192.168.1.0: suggest 192.168.1.0(sync) to avoid warning
exportfs: No host name given with /share (sync,rw,no_root_squash), suggest *(sync,rw,no_root_squash) to avoid warning
exporting 192.168.1.0:/share
exporting *:/share
# 停用则使用命令exportfs –auv
重启服务,并加入开机自启动
[root@localhost ~]# systemctl restart nfs
[root@localhost ~]# systemctl restart rpcbind
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl enable nfs
将三个服务加入防火墙规则
(mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。)
[root@localhost ~]# firewall-cmd --add-service=nfs --允许nfs临时通过
success
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent --允许nfs永久通过
success
[root@localhost ~]# firewall-cmd --add-service=rpc-bind --允许rpc临时通过
success
[root@localhost ~]# firewall-cmd --add-service=rpc-bind --permanent --允许rpc永久通过
success
[root@localhost ~]# firewall-cmd --add-service=mountd --允许mountd服务通过
success
[root@localhost ~]# firewall-cmd --add-service=mountd --permanent --允许mountd永久通过
success
至此服务器的配置完毕
接下来是Linux客户端的配置:
客户端先创建需要挂载共享目录的目录
这里又用到一个命令showmount
格式: showmount [选项] [指定目标主机的IP]
选项 | 作用 |
---|---|
-e | 显示NFS服务器的共享列表 |
-a | 显示本机挂载的文件资源的情况NFS资源的情况 |
-v | 显示版本号 |
-d | 仅显示已被NFS客户端加载的目录 |
[root@localhost ~]# mkdir /file
[root@localhost ~]# showmount -e 192.168.1.1
Export list for 192.168.1.1:
/share * -- 这个便是服务器的共享目录
使用命令挂载
Mount -t 指定挂载类型(这里是nfs) nfs服务器ip地址:共享目录绝对路径 挂载点目录
[root@localhost ~]# mount -t nfs 192.168.1.1:/share /file
[root@localhost ~]# df -Th /file --查看是否挂载成功
文件系统 类型 容量 已用 可用 已用% 挂载点
192.168.1.1:/share nfs4 17G 3.9G 14G 23% /file --挂载上共享目录了
但是这种挂载方式为硬挂载,如果服务端挂掉,那么就会一直请求(可以使用mount查看,如果对应挂载目录有显示hard就是硬挂载),使用以下方法进行软挂载
# 超时次数为1次
[root@localhost ~]# mount -o soft,timeo=1 192.168.1.1:/share /file
挂载好后就可以对本地挂载点操作,当然,所有共享客户端都能查看你的目录。
如果相要永久挂载,需要修改fstab文件
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Feb 24 21:03:44 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=129824f2-0720-46a5-9ca6-9eec129ab535 /boot xfs defaults 0 0
/dev/mapper/cl-swap swap swap defaults 0 0
192.168.1.1:/share /file nfs defaults 0 0
[root@localhost ~]# mount -a
四、nfs自动挂载(在客户端操作)
当然这样子有一些缺陷,在服务器启动时开机会更慢
autofs服务程序与mount命令不同之处在于它是一种守护进程,只有检测到用户试图访问一个尚未挂载
的文件系统时才自动的检测并挂载该文件系统。
autofs非常方便,主要有两点:
1、设置开机不一定要挂载的目录,当用的时候才实现自动挂载。
2、用户不使用自动挂载的目录一段的时间,会自动卸载。(默认时间为5分钟),可以在autofs.conf
4.1 安装autofs服务
# 在客户端执行以下命令:
[root@localhost ~]# yum install autofs -y
# 安装好之后会在/目录中生成两个目录,其中一个misc目录,如下操作
[root@localhost ~]# cd /misc
[root@localhost ~]# ls
[root@localhost ~]# cd /misc/cd
# 执行这一步时会触发该命令----mount /dev/cdrom /misc/cd
4.2 编辑/etc/auto.master
[root@localhost ~]# vim /etc/auto.master
# 会看到如下这行,/etc/auto.misc是来解释/misc这个目录用来干嘛的
/misc /etc/auto.misc
# 打开auto.misc目录
[root@localhost ~]# vim /etc/auto.misc
# 可以看到如下这行
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
# 该行的含义为将/dev/cdrom挂载到cd目录中
这里又有一个问题,那就是哪儿的cd目录,这就又要看了auto.master目录了,可以看到/misc引用的就是该配置文件,那么/misc就是该配置文件的主目录,所以在该配置文件中配置的所有内容,都是在/misc目录下操作的。cd的相对路径为/misc
那么如果相要自行定义挂载目录呢,如下:
# 在auto.master添加以下行:
/- /etc/nfs.misc
#- 是总的访问目录(客户端的目录),代表绝对路径 /etc/nfs.misc是对总访问目录的描述,用于子目录的编辑,用户权限分离
# 编辑nfs.misc
[root@localhost ~]# vim /etc/nfs.misc
/file -fstype=nfs,rw,sync 192.168.1.1:/share
# 重启服务
[root@localhost ~]# systemctl start autofs
windows客户端的配置
需要在win控制面板中,打开程序—启用或关闭windows功能,安装上NFS服务
打开cmd命令行输入要访问的地址即可