NFS服务
1、nfs服务简介
NFS(Network File System)即网络文件系统,它的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
1.1 nfs服务特点
优点:
- nfs服务配置简单,部署方便,数据可靠,服务稳定,满足中小企业需求。
- nfs客户端可以透明地读写位于远端nfs服务器上的文件,就像访问本地文件一样。
- nfs不仅适用于Linux与Unix之间实现文件共享,也能实现Linux与Windows间的文件共享功能。
缺点:
- nfs是运行在应用层的协议,其监听端口较多,而且这些端口不固定。
- nfs数据明文,并不对数据做任何校验。
- nfs存在单点故障,如果构建高可用维护较复杂。
- 客户端认证是基于IP地址(没有用户名和密码的说法),安全性不高(内网)。
1.2 nfs服务架构
nfs服务也是基于C/S架构工作的。
客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。
在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。
NFS_C/S
1.3 nfs服务应用场景
nfs有很多实际应用场景,以下是一些常用的场景:
- 多个机器共享一台CDROM或其他设备;这对于在多台机器中安装软件来说更加便宜与方便。
- 配置一台中心nfs服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
- 客户端可在nfs上观看影视文件,节省本地空间。
- 在客户端完成的工作数据,可以备份保存到nfs服务器上用户自己的路径下。
2、nfs工作机制
nfs服务并不是自己单独工作,他需要基于rpc服务来实现网络文件系统共享。
2.1 rpc简介
RPC(Remote Procedure Call Protocol),远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC服务采用C/S架构。客户端发送调用程序的请求;服务端负责接收客户端的请求,调用相应程序。
2.2 rpc服务作用
nfs服务是通过网络来进行服务器端和客户端之间的数据传输,这两者之间要传输数据就要有相应的网络端口,nfs固定端口号是2049;但由于文件系统非常复杂,因此NFS还有其他的程序去启动额外的端口,这些额外用来传输数据的端口是随机选择的,客户端不知道服务端随机选择的端口是多少;而客户端要连接服务端就必须要知道服务端相关端口才能建立连接,进行数据传输;RPC就是用来统一管理nfs端口的服务,并且将端口信息通知给客户端,这时客户端就可以和nfs服务建立连接。
NFS_Workflow
1)首先服务器端启动RPC服务,并开启111端口。
2)服务器端启动NFS服务,并向RPC注册端口信息。
3)客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口。
4)服务端的RPC服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
3、nfs服务配置文件
nfs最主要的配置文件为:/etc/exports ;该文件是空白的,有的系统可能不存在这个文件,需要手动建立。NFS的配置一般只在这个文件中配置即可。
/etc/exports 配置文件定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。
- exports文件中每一行提供了一个共享目录的设置,其命令格式为:
<输出目录> [客户端1(参数1,参数2,...)] [客户端2(参数1,参数2,...)]
配置示例:
/data 192.168.1.1/24(rw,all_squash,anonuid=1000,anongid=1000,sync)
- 常用的选项:
选项 | 说明 |
---|---|
ro | 设置输出目录只读 |
rw | 设置输出目录可读写 |
all_squash | 将远程访问的所有用户及所属组都映射为匿名用户和用户组(nfsnobody) |
no_all_squash | 不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组 |
root_squash | 将root用户及所属用户组都映射为匿名用户或用户组 |
no_root_squash | 不将root用户及所属用户组都映射为匿名用户或用户组 |
anonuid=xxx | 指定该匿名用户为本地用户帐户(UID=xxx) |
anongid=xxx | 指定该匿名用户组为本地用户组(GID=xxx) |
sync | 将数据同步写入内存和磁盘中,数据不会丢失,但效率较低 |
async | 将数据先保存在内存中,必要时才写入磁盘,效率高,但可能会丢失数据 |
secure | 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器 |
insecure | 允许客户端从大于1024的TCP/IP端口连接NFS服务器 |
wdelay | 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置) |
no_wdelay | 若有写操作则立即执行,应与sync配置使用 |
subtree_check | 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置) |
no_subtree_check | 即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率 |
nohide | 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项 |
4、nfs服务配置
4.1 服务安装
//安装rpc和nfs服务
[root@server ~]# yum -y install rpcbind nfs-utils
//设置服务开机自启
[root@server ~]# systemctl enable rpcbind nfs-server
//启动服务,同样启动两个服务,注意启动顺序
[root@server ~]# systemctl start rpcbind nfs-server
4.2 配置nfs共享目录
//创建共享目录,/hzz目录可读可写,/zzh目录只读
[root@server ~]# mkdir /hzz
[root@server ~]# mkdir /zzh
//配置共享目录的访问权限,针对客户端访问的用户设置
[root@server ~]# chmod 777 /hzz/
[root@server ~]# chmod 755 /zzh/
//编辑配置文件,配置共享目录
[root@server ~]# vim /etc/exports
/hzz *(rw)
/zzh *(ro)
//服务端重启服务
[root@server ~]# systemctl restart nfs-server
注意:记得关闭firewalld防火墙和selinux。
4.3 客户端挂载
showmount 命令可以在客户端查看NFS服务器的共享目录列表。
//语法:showmount [选项] [NFS服务器地址]
//常用的选项有:
-e //显示指定的NFS服务器上所有输出的共享目录
- 查看nfs服务器共享了哪些目录。
[root@client ~]# showmount -e 192.168.52.156
Export list for 192.168.52.156:
/zzh 192.168.52.157/24
/hzz 192.168.52.157/24
客户端挂载NFS共享目录:
//客户端需要安装nfs才能挂载
[root@client ~]# yum -y install rpcbind nfs-utils
//在客户端挂载共享目录,先创建挂载点
[root@client ~]# mkdir /mnt/hzz
[root@client ~]# mkdir /mnt/zzh
//使用mount命令临时挂载
[root@client ~]# mount -t nfs 192.168.52.156:/hzz /mnt/hzz/
[root@client ~]# mount -t nfs 192.168.52.156:/zzh /mnt/zzh/
//永久挂载
[root@client ~]# vim /etc/fstab
192.168.52.156:/hzz /mnt/hzz nfs defaults,_netdev 0 0
192.168.52.156:/zzh /mnt/zzh nfs defaults,_netdev 0 0
[root@client ~]# mount -a
//查看挂载情况
[root@client ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 17G 1.1G 16G 7% /
devtmpfs 901M 0 901M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.7M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 1014M 143M 872M 15% /boot
tmpfs 183M 0 183M 0% /run/user/0
192.168.52.156:/hzz 17G 1.1G 16G 7% /mnt/hzz
192.168.52.156:/zzh 17G 1.1G 16G 7% /mnt/zzh
4.4 NFS服务端口固定
rpcinfo -p //可以查看rpc服务注册的端口
//nfs服务开启端口:
portmapper 端口: 111 tcp/udp;
nfs/nfs_acl 端口: 2049 tcp/udp;
mountd 端口: 32768--65535 udp/tcp;
nlockmgr 端口: 32768--65535 udp/tcp;
RPC服务在nfs服务启动时默认会给mountd和nlockmgr动态选取一个随机端口来进行通讯。
//将nfs服务随机的端口固定:
[root@nfs-31 ~]# vim /etc/sysconfig/nfs
MOUNTD_PORT=4001
STATD_PORT=4002
LOCKD_TCPPORT=4003
LOCKD_UDPPORT=4003
RQUOTAD_PORT=4004
//重启服务
[root@server ~]$ systemctl restart rpcbind nfs-server
4.5 exportfs命令
exportfs 命令主要用于管理当前NFS服务器的文件系统。
exportfs 是在服务端上使用的命令,主要用来操作挂载的目录,比如我们修改了NFS配置文件,需要重启NFS服务,如果客户端正在读写,那么重启NFS服务对客户端是有影响的,因此 exportfs 命令的其中一个功能就是不重启就能重新加载NFS配置文件。
exportfs [选项] [参数]
-r //重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务
-u //取消一个或者多个NFS共享文件系统的共享
-a //exports配置文件中所有的共享目录
-v //显示执行过程
exportfs -r 或 systemctl reload nfs-server 可以实现不重启服务,重新加载服务配置
5、nfs应用实例
5.1 同步用户家目录
//在服务器端创建用户
[root@server ~]# useradd hzz
[root@server ~]# useradd zzh
//编辑配置文件,共享用户家目录
[root@server ~]# vim /etc/exports
/home/hzz 192.168.52.157/24(rw)
/home/zzh 192.168.52.157/24(rw)
//查看目录权限,用户本身对家目录就有权限所以一般不用修改
[root@server ~]# ll /home/
总用量 0
drwx------. 2 hzz hzz 115 4月 29 12:07 hzz
drwx------. 2 zzh zzh 62 4月 29 12:03 zzh
//重新加载服务
[root@server ~]# exportfs -r
//在客户端先创建用户,保证客户端用户和服务端用户uid,gid一致
[root@client ~]# useradd hzz
[root@client ~]# useradd zzh
//在客户端将服务端用户家目录,挂载至本地用户家目录,然后查看
[root@client ~]# vim /etc/fstab
192.168.52.156:/home/hzz /home/hzz nfs defaults,_netdev 0 0
192.168.52.156:/home/zzh /home/zzh nfs defaults,_netdev 0 0
[root@client ~]# mount -a
[root@client ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 17G 1.1G 16G 7% /
devtmpfs 901M 0 901M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 8.7M 904M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 1014M 143M 872M 15% /boot
tmpfs 183M 0 183M 0% /run/user/0
192.168.52.156:/home/hzz 17G 1.1G 16G 7% /home/hzz
192.168.52.156:/home/zzh 17G 1.1G 16G 7% /home/zzh
//在客户端切换hzz用户,然后在家目录创建文件
[hzz@client ~]$ touch hzz
[hzz@client ~]$ ll
总用量 0
-rw-rw----. 1 hzz hzz 0 4月 29 04:31 hzz
//在服务端切换hzz用户查看有hzz文件,用户家目录同步成功
[root@server ~]# su - hzz
上一次登录:三 4月 29 04:07:46 CST 2020pts/0 上
[hzz@hzz ~]$ ll
总用量 0
-rw-rw----+ 1 hzz hzz 0 4月 29 04:31 hzz