NFS服务

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

NFS简介

NFS特点

  • NFS(Network File System)网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

  • NFS适用于Linux与unix之间实现文件共享,不能实现Linux与Windows之间的文件共享

  • NFS运行在应用层的协议上,其监听于2049/tcp和2049/udp套接字上

注意:NFS服务只能基于IP进行认证

使用NFS的好处

  • 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
  • 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
  • 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

NFS的体系组成

NFS体系至少有两个主要部分:

img

一台NFS服务器和若干台客户机,如上图所示。

客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据。

在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数。

NFS的应用场景

  1. 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。

  2. 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。

  3. 不同客户端可在NFS上观看影视文件,节省本地空间。

  4. 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下。

  • NFS是运行在应用层的协议。随着NFS多年的发展和改进,NFS既可以用于局域网也可以用于广域网,且与操作系统和硬件无关,可以在不同的计算机或系统上运行。

NFS挂载原理

  • ​ 当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df –h。

  • 既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!

NFS的工作机制

NFS是基于rpc来实现网络文件系统共享的。

RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC工作原理

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

img

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

NIS

NIS(Network Information Service)—–网络信息服务,是诺顿网络安全特警简称,同时NIS是Sun Microsystem于1985年发布的一项目录服务技术(Diretory Service),用来集中控制几个系统管理数据库的网络用品。简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。

NFS的工作机制

NFS服务器端运行着四个进程:

  • nfsd nfs的守护进程,监听在2049/tcp和2049/udp端口上;不负责文件的存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的RPC请求,并将其转交给本地内核,然后存储在指定的文件系统上
  • mountd 用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,如果在的话就允许访问(发放一个指令,携带指令去寻找nfsd); mountd的服务端口是随机的,由rpc服务提供随机的端口号
  • idmapd 实现用户账号的集中映射,把所有的账号都映射为nfsnobody,但是在访问时却能以本地用户的身份去访问
  • portmapper NFS服务器的RPC服务,其监听于111/tcp和111/UDP套接字上,用于管理远程过程中调用RPC

exports文件的格式

nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。

exports文件中每一行提供了一个共享目录的设置,其命令格式为:

1
<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]

其中,除输出目录是必选参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格。

客户端是指网络中可以访问这个NFS共享目录的计算机。客户端的指定非常灵活,可为单个主机的IP或域名,亦可为某个子网或域中的主机等。

客户端地址的设置主要有以下几种方式:

  • 可以使用完整的IP或者是网络号,例如192.168.107.140 或 192.168.107.0/24
  • 可以使用主机名,但这个主机名必须要在/etc/hosts内,或可以使用DNS找到该名称才行,反正重点是可找到IP就行,如果是主机名的话,还可以支持通配符,例如‘*’或‘?’均可接受。

选项用来设置共享目录的访问权限、用户映射等。exports文件中的选项比较多,一般可分为三类:

  • 访问权限选项(用于控制共享目录的访问权限)
  • 用户映射选项
    • 默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器会将其映射成一个本地的匿名用户(该用户为nfsnobody),并将其所属的用户组也映射成匿名用户组(该用户组也为nfsnobody),如此有助于提高系统的安全性。
  • 其他选项

访问权限选项:

访问权限选项 说明
ro 设置输出目录只读
rw 设置输出目录可读写

用户映射选项:

用户映射选项 说明
all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
no_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端口连接NFS服务器
sync 将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性
async 将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置)
no_wdelay 若有写操作则立即执行,应与sync配置使用
subtree_check 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)
no_subtree_check 即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率
nohide 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项

NFS管理

  • 安装NFS
1
2
3
4
5
6
7
# 安装
yum -y install nfs*
# 启动
systemctl restart nfs-server rpcbind
或者 systemctl start nfs-server rpcbind
#查看启动状态
systemctl status nfs
  • 使用showmount命令测试NFS服务器的输出目录状态
1
2
3
4
5
6
7
8
9
10
11
12
13
语法:showmount [选项] [NFS服务器名称或地址]
常用的选项:
-a 显示指定NFS服务器的所有客户端主机及其所连接的目录
-d 显示指定的NFS服务器中已被客户端连接的所有输出目录
-e 显示指定的NFS服务器上所有输出的共享目录

[root@client ~]# showmount -a 192.168.176.222
All mount points on 192.168.176.222:
[root@client ~]# showmount -d 192.168.176.222
Directories on 192.168.176.222:
[root@client ~]# showmount -e 192.168.176.222
Export list for 192.168.176.222:
/123 192.168.176.111
  • 在客户端挂载NFS文件系统
1
2
3
mount -t nfs 服务器的IP地址:服务端的地址目录 本地挂载地址目录

[root@client ~]# mount -t nfs 192.168.176.222:/123 /nfs
  • 在客户端设置开机自动挂在NFS

首先编辑/etc/fstab

添加内容如下

1
2
3
服务器的IP地址:服务端的地址目录 本地挂载地址目录 nfs defaults,_netdev 0 0

192.168.176.222:/123 /nfs nfs defaults,_netdev 0 0
  • 客户端挂载时可以使用的特殊选项:
    • rsize:其值是从服务器读取的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
    • wsize:其值是写入到服务器的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
1
2
3
4
5
exportfs	维护exports文件导出的文件系统表的专用工具
-a 输出在/etc/exports文件中所设置的所有目录
-r 重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务
-u 停止输出某一目录
-v 在输出目录时将目录显示到屏幕上

检查输出目录所使的选项:

​ 在配置文件/etc/exports中,即使在命令行中只设置了一两个选项,但在真正输出目录时,实际上还带有很多默认的选项。通过查看/var/lib/nfs/etab文件,可以看到具体使用了何选项

NFS配置演示

服务端地址为:192.168.176.222

客服端地址为:192.168.176.111

服务端:

1
2
3
4
5
6
7
8
9
10
[root@server ~]# yum install nfs* rpcbind -y
[root@server ~]# systemctl restart nfs rpcbind
[root@server ~]# mkdir /123
[root@server ~]# vim /etc/exports
[root@server ~]# cat /etc/exports
/123 192.168.176.111(rw)
[root@server ~]# systemctl restart nfs rpcbind
#服务端已经配置完成,转到客户端之前请确认服务端以及客户端SELinux以及防火墙关闭
[root@server ~]# systemctl stop firewalld
[root@server ~]# setenforce 0

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0
[root@client ~]# showmount -e 192.168.176.222
Export list for 192.168.176.222:
/123 192.168.176.111
[root@client ~]# mkdir /nfs
[root@client ~]# mount -t nfs 192.168.176.222:/123 /nfs
[root@client ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 17G 1.1G 16G 6% /
devtmpfs devtmpfs 982M 0 982M 0% /dev
tmpfs tmpfs 993M 0 993M 0% /dev/shm
tmpfs tmpfs 993M 8.7M 984M 1% /run
tmpfs tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt
/dev/sda1 xfs 1014M 125M 890M 13% /boot
tmpfs tmpfs 199M 0 199M 0% /run/user/0
192.168.176.222:/123 nfs4 17G 1.3G 16G 8% /nfs
[root@client /]# cd /nfs
[root@client nfs]# ls
[root@client nfs]# mkdir abc
mkdir: 无法创建目录"abc": 权限不够

# 此时我们要修改服务端的文件权限
[root@client nfs]# ssh root@192.168.176.222
Last login: Tue Jun 25 15:49:36 2019 from 192.168.176.111
[root@server ~]#
[root@server ~]# cd /
[root@server /]# ls -ld 123
drwxr-xr-x. 2 root root 6 6月 25 16:45 123
[root@server /]# chmod 777 123
[root@server /]# exit
登出
Connection to 192.168.176.222 closed.
[root@client nfs]# mkdir abc
[root@client nfs]# ls -l
drwxr-xr-x. 2 nfsnobody nfsnobody 6 6月 25 17:21 abc

## 或者我们修改服务端的文件的所属者
[root@client nfs]# ssh root@192.168.176.222
Last login: Tue Jun 25 17:25:35 2019 from 192.168.176.111
[root@server ~]# cd /
[root@server /]# ls -ld 123
drwxrwxrwx. 3 root root 17 6月 25 17:26 123
[root@server /]# chmod 755 123
[root@server /]# ls -ld 123
drwxr-xr-x. 3 root root 17 6月 25 17:26 123
[root@server /]# chown nfsnobody /123
[root@server /]# ls -ld 123
drwxr-xr-x. 3 nfsnobody root 17 6月 25 17:26 123
[root@server /]# exit
登出
Connection to 192.168.176.222 closed.
[root@client nfs]# rm -rf abc
[root@client nfs]# mkdir eerefsf
[root@client nfs]# ls
eerefsf

作业

1.手动搭建一个nfs服务器

  • 开放/nfs/shared目录,供所有用户查阅资料
1
2
[root@server /]# mkdir /nfs/shared
[root@server /]# chmod -R 777 /nfs/shared
  • 开放/nfs/upload目录为192.168.176.0/24(或者自己主机网段)网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300

2.通过脚本搭建nfs并在客户端上挂载

打赏
  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信