Linux系统管理-NFS共享存储服务

引言

本文详细讲解了NFS实验的几个步骤。

一、NFS概述

  • NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 sun 公司开发。通过使用 NFS协议,客户机可以像访问本地目录一样访问远程 NFS 服务器中的共享资源。
  • NFS 也是 NAS存储设备必然支持的一种协议,但是因为没有用户认证机制,而且数据在网络上明文传输,安全性很差,所以一般只能在局域网中使用。

二、安装 nfs-utils、rpcbind 软件包

     NFS 服务的实现依赖于 RPC (Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。在Centos 7系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持。手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。

  • nfs端口号2049
  • RPC端口号111

rpm -q rpcbind nfs-utils     #查询是否安装
yum install -y nfs-utils rpcbind   #安装nfs和rpc的软件包

systemctl start nfs      #开启nfs服务
systemctl start rpcbind   #开启rpcbind服务
systemctl enable nfs     #开机自启nfs服务
systemctl enable rpcbind   #开机自启rpcbind服务

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(参数1,参数2,...)] [客户端2(参数1,参数2,...)]

  2. 配置示例:

  3. /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
  1. Export list for 192.168.52.156:

  2. /zzh 192.168.52.157/24

  3. /hzz 192.168.52.157/24

客户端挂载NFS共享目录:

  1. //客户端需要安装nfs才能挂载

  2. [root@client ~]# yum -y install rpcbind nfs-utils

  3. //在客户端挂载共享目录,先创建挂载点

  4. [root@client ~]# mkdir /mnt/hzz

  5. [root@client ~]# mkdir /mnt/zzh

  6. //使用mount命令临时挂载

  7. [root@client ~]# mount -t nfs 192.168.52.156:/hzz /mnt/hzz/

  8. [root@client ~]# mount -t nfs 192.168.52.156:/zzh /mnt/zzh/

  9. //永久挂载

  10. [root@client ~]# vim /etc/fstab

  11. 192.168.52.156:/hzz /mnt/hzz nfs defaults,_netdev 0 0

  12. 192.168.52.156:/zzh /mnt/zzh nfs defaults,_netdev 0 0

  13. [root@client ~]# mount -a

  14. //查看挂载情况

  15. [root@client ~]# df -h

  16. 文件系统 容量 已用 可用 已用% 挂载点

  17. /dev/mapper/rhel-root 17G 1.1G 16G 7% /

  18. devtmpfs 901M 0 901M 0% /dev

  19. tmpfs 912M 0 912M 0% /dev/shm

  20. tmpfs 912M 8.7M 903M 1% /run

  21. tmpfs 912M 0 912M 0% /sys/fs/cgroup

  22. /dev/sda1 1014M 143M 872M 15% /boot

  23. tmpfs 183M 0 183M 0% /run/user/0

  24. 192.168.52.156:/hzz 17G 1.1G 16G 7% /mnt/hzz

  25. 192.168.52.156:/zzh 17G 1.1G 16G 7% /mnt/zzh

4.4 NFS服务端口固定

 
  1. rpcinfo -p //可以查看rpc服务注册的端口

  2. //nfs服务开启端口:

  3. portmapper 端口: 111 tcp/udp;

  4. nfs/nfs_acl 端口: 2049 tcp/udp;

  5. mountd 端口: 32768--65535 udp/tcp;

  6. nlockmgr 端口: 32768--65535 udp/tcp;

  7. RPC服务在nfs服务启动时默认会给mountd和nlockmgr动态选取一个随机端口来进行通讯。

  8. //将nfs服务随机的端口固定:

  9. [root@nfs-31 ~]# vim /etc/sysconfig/nfs

  10. MOUNTD_PORT=4001  

  11. STATD_PORT=4002

  12. LOCKD_TCPPORT=4003

  13. LOCKD_UDPPORT=4003

  14. RQUOTAD_PORT=4004

  15. //重启服务

  16. [root@server ~]$ systemctl restart rpcbind nfs-server

4.5 exportfs命令

exportfs 命令主要用于管理当前NFS服务器的文件系统。

exportfs 是在服务端上使用的命令,主要用来操作挂载的目录,比如我们修改了NFS配置文件,需要重启NFS服务,如果客户端正在读写,那么重启NFS服务对客户端是有影响的,因此 exportfs 命令的其中一个功能就是不重启就能重新加载NFS配置文件。

  1. exportfs [选项] [参数]

  2. -r //重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务

  3. -u //取消一个或者多个NFS共享文件系统的共享

  4. -a //exports配置文件中所有的共享目录

  5. -v //显示执行过程

  6. exportfs -r 或 systemctl reload nfs-server 可以实现不重启服务,重新加载服务配置

5、nfs应用实例

5.1 同步用户家目录

 
  1. //在服务器端创建用户

  2. [root@server ~]# useradd hzz

  3. [root@server ~]# useradd zzh

  4. //编辑配置文件,共享用户家目录

  5. [root@server ~]# vim /etc/exports

  6. /home/hzz 192.168.52.157/24(rw)

  7. /home/zzh 192.168.52.157/24(rw)

  8. //查看目录权限,用户本身对家目录就有权限所以一般不用修改

  9. [root@server ~]# ll /home/

  10. 总用量 0

  11. drwx------. 2 hzz hzz 115 4月 29 12:07 hzz

  12. drwx------. 2 zzh zzh 62 4月 29 12:03 zzh

  13. //重新加载服务

  14. [root@server ~]# exportfs -r

  15. //在客户端先创建用户,保证客户端用户和服务端用户uid,gid一致

  16. [root@client ~]# useradd hzz

  17. [root@client ~]# useradd zzh

  18. //在客户端将服务端用户家目录,挂载至本地用户家目录,然后查看

  19. [root@client ~]# vim /etc/fstab

  20. 192.168.52.156:/home/hzz /home/hzz nfs defaults,_netdev 0 0

  21. 192.168.52.156:/home/zzh /home/zzh nfs defaults,_netdev 0 0

  22. [root@client ~]# mount -a

  23. [root@client ~]# df -h

  24. 文件系统 容量 已用 可用 已用% 挂载点

  25. /dev/mapper/rhel-root 17G 1.1G 16G 7% /

  26. devtmpfs 901M 0 901M 0% /dev

  27. tmpfs 912M 0 912M 0% /dev/shm

  28. tmpfs 912M 8.7M 904M 1% /run

  29. tmpfs 912M 0 912M 0% /sys/fs/cgroup

  30. /dev/sda1 1014M 143M 872M 15% /boot

  31. tmpfs 183M 0 183M 0% /run/user/0

  32. 192.168.52.156:/home/hzz 17G 1.1G 16G 7% /home/hzz

  33. 192.168.52.156:/home/zzh 17G 1.1G 16G 7% /home/zzh

  34. //在客户端切换hzz用户,然后在家目录创建文件

  35. [hzz@client ~]$ touch hzz

  36. [hzz@client ~]$ ll

  37. 总用量 0

  38. -rw-rw----. 1 hzz hzz 0 4月 29 04:31 hzz

  39. //在服务端切换hzz用户查看有hzz文件,用户家目录同步成功

  40. [root@server ~]# su - hzz

  41. 上一次登录:三 4月 29 04:07:46 CST 2020pts/0 上

  42. [hzz@hzz ~]$ ll

  43. 总用量 0

  44. -rw-rw----+ 1 hzz hzz 0 4月 29 04:31 hzz

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值