大家好,欢迎来到IT知识分享网。
NFS服务
一、NFS简介
NFS(Network File System)即网络文件系统,它允许网络中的不同计算机相互之间共享资源。NFS客户端可以透明地读写远程NFS服务器上的文件,就像访问本地文件一样。
二、NFS服务概述
NFS是1980年由SUN发展出来在UNINX&Linux系统间实现文件共享的一种方法。它是一种文件系统协议,支持应用程序在客户端通过网络存取位于服务器磁盘中的数据。
NFS只提供网络文件共享功能,不提供数据传输的功能。因此NFS客户端和NFS服务器需要借助RPC(Remote Procedure Calls)远程过程调用协议实现数据传输。RPC定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。
NFS服务器自开启服务之后一直处于等待状态,由NFS客户端建立过程调用的请求,将调用参数发送到远程NFS服务器,并等待响应。当请求到达远程NFS服务器后,NFS服务器处理客户端的请求,调用指定的程序,并将结果返回NFS客户端。NFS服务器上的目录如果可以被过程用户访问,就称为导出(export);客户主机访问服务器导出目录的过程称为挂载(mount)或导入(import)。
三、NFS工作流程
当访问程序通过NFS客户端向NFS服务端存取文件时,其工作流程如下所述:
步骤1,首先用户访问NFS共享资源,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap 或 rpcbind 服务)就会通过网络向NFS服务端的RPC服务(即 portmap 或 rpcbind 服务)的111端口发出NFS文件存取功能的询问请求。
步骤2,NFS服务端的RPC服务(即 portmap 或 rpcbind 服务)找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务(即 portmap 或 rpcbind 服务)。
步骤3,此时NFS客户端就可以获取到正确的端口,然后就直接与NFS daemon 联机存取数据。
步骤4,NFS客户端把数据存取成功后,告诉用户存取结果。
由于NFS的各项功能都需要向RPC服务注册,所以RPC服务能获取到NFS服务的各项对应的端口号、PID、NFS在主机监听的IP等,从而NFS客户端才能够通过RPC服务询问从而找到正确的端口。也就是说,NFS需要有RPC服务,NFS服务只需在服务端后于RPC启动,客户端无需启动NFS服务。
四、NFS服务实践
案例1:
某公司新购一台服务器,服务器上已安装Linux操作系统,现要求将服务器配置成NFS服务器,实现文件共享服务,公司网络的网段为192.168.X.0/24。具体共享要求如下:
(1)在服务器端创建目录/nfs<y>1,并在其中创建文件rodir.txt,再创建目录/nfs<y>2,并在其中创建文件rwdir.txt。
(2)共享/nfs<y>1目录,允许所有的客户端访问该目录,但只具有读取权限。
(3)共享/nfs<y>2目录,只允许192.168.x.0/24网段的客户端访问,并具有读写权限。
(4)在客户端查看NFS服务器上发布的共享目录。
(5)在客户端挂载NFS服务器上发布的/nfs<y>1目录到本地的/nfslocal1目录下,并查看文件列表。
(6)在客户端挂载NFS服务器上发布的/nfs<y>2目录到本地的/nfslocal2目录下,并在其中创建文件wtest.file
1、实验环境
角色 | 主机名 | 操作系统 | 网卡 | IP地址 | 备注 |
---|---|---|---|---|---|
NFS服务器 | nfsserver.gc.com | CentOS7.4 | vmnet18 | 192.168.92.11 | 虚拟机 |
NFS客户端 | nfsclient.gc.com | CentOS7.4 | vmnet18 | 192.168.92.101 | 虚拟机 |
2、环境准备
-
NFS服务器
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.92.11
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
[root@localhost ~]# hostnamectl set-hostname nfsserver.gc.com
[root@localhost ~]# hostname
nfsserver.gc.com
[root@nfsserver ~]# systemctl stop firewalld
[root@nfsserver ~]# systemctl disable firewalld
[root@nfsserver ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@nfsserver ~]# getenforce
Disabled
[root@nfsserver ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
DVD gc enabled: 3,894
repolist: 3,894
-
NFS客户端
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.92.101
NETMASK=255.255.255.0
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
[root@localhost ~]# hostnamectl set-hostname nfsclient.gc.com
[root@localhost ~]# hostname
nfsclient.gc.com
[root@nfsclient ~]# systemctl stop firewalld
[root@nfsclient ~]# systemctl disable firewalld
[root@nfsclient ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@nfsclient ~]# getenforce
Disabled
[root@nfsclient ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
DVD gc enabled: 3,894
repolist: 3,894
3、配置文件解析
/etc/exports ###主配置文件
/usr/sbin/exports ###NFS服务自带管理命令
/usr/sbin/showmount ###客户端用来查看服务端分享的资源命令
/usr/lib/systemd/system/nfs.service ###NFS服务管理脚本
/usr/lib/systemd/system/rpcbind.service ###rpc服务管理脚本
4、配置参数解析
参数 | 内容说明 |
---|---|
rw|ro | 该目录分享的权限是可读写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。 |
sync|async | sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘! |
no_root_squash|root_squash | 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行! |
all_squash | 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 。 |
anonuid|anongid | anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 。 |
5、服务配置
(1)安装软件包
[root@nfsserver ~]# rpm -q rpcbind nfs-utils || yum install rpcbind nfs-utils -y
(2)创建共享文件
[root@nfsserver ~]# mkdir /nfsgc{1,2}
[root@nfsserver ~]# touch /nfsgc1/rodir.txt /nfsgc2/rwdir.txt
[root@nfsserver ~]# chown -R nfsnobody:nfsnobody /nfsgc{1,2}
[root@nfsserver ~]# ls -l /nfsgc1 /nfsgc2
/nfsgc1:
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 31 22:36 rodir.txt
/nfsgc2:
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 31 22:36 rwdir.txt
[root@nfsserver ~]# echo "chige ok" > /nfsgc1/rodir.txt
[root@nfsserver ~]# echo "chige no problem" > /nfsgc2/rwdir.txt
[root@nfsserver ~]# cat /nfsgc1/rodir.txt /nfsgc2/rwdir.txt
chige ok
chige no problem
(3)修改配置文件
[root@nfsserver ~]# cat /etc/exports
/nfsgc1 *(ro)
/nfsgc2 192.168.92.11/24(rw,async)
(4)启动服务并设置开机自启动
[root@nfsserver ~]# systemctl start rpcbind
[root@nfsserver ~]# systemctl enable rpcbind
[root@nfsserver ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: active (running) since Wed 2021-03-31 22:42:11 CST; 1min 32s ago
Main PID: 1268 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─1268 /sbin/rpcbind -w
[root@nfsserver ~]# systemctl start nfs
[root@nfsserver ~]# systemctl enable nfs
[root@nfsserver ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Wed 2021-03-31 22:42:11 CST; 14s ago
Main PID: 1290 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
6、客户端测试
(1)安装包客户端软件包
[root@nfsclient ~]# rpm -q rpcbind nfs-utils || yum install rpcbind nfs-utils -y
(2)访问测试
[root@nfsclient ~]# showmount -e 192.168.92.11
Export list for 192.168.92.11:
/nfsgc1 *
/nfsgc2 192.168.92.11/24
(3)挂载测试
[root@nfsclient ~]# mkdir /nfslocal{1,2}
[root@nfsclient ~]# mount -t nfs 192.168.92.11:/nfsgc1 /nfslocal1
[root@nfsclient ~]# mount -t nfs 192.168.92.11:/nfsgc2 /nfslocal2
[root@nfsclient ~]# df -Th | grep nfs
192.168.92.11:/nfsgc1 nfs4 17G 1.4G 16G 8% /nfslocal1
192.168.92.11:/nfsgc2 nfs4 17G 1.4G 16G 8% /nfslocal2
[root@nfsclient ~]# cat /nfslocal1/rodir.txt /nfslocal2/rwdir.txt
chige ok
chige no problem
[root@nfsclient ~]# touch /nfslocal1/wtest.file
touch: cannot touch ‘/nfslocal1/wtest.file’: Read-only file system
[root@nfsclient ~]# touch /nfslocal2/wtest.file
[root@nfsclient ~]# ls -l /nfslocal2
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 17 Mar 31 22:39 rwdir.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 31 22:50 wtest.file
案例2:(选做)
根据案例2进行扩展,经过一段时间的运营,公司发现,普通用户在NFS服务器上没有以匿名用户身份访问,但管理员root居然是以匿名(nfsnobody)身份访问的,因此需要做出调整。调整方案为当管理员root用户访问时,在服务器端需要映射为root用户。
1、修改服务器配置
[root@nfsserver ~]# cat /etc/exports
/nfsgc1 *(ro)
/nfsgc2 192.168.92.11/24(rw,async,no_root_squash)
2、客户端测试
[root@nfsclient ~]# touch /nfslocal2/wtest2.file
[root@nfsclient ~]# ls -l /nfslocal2
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 17 Mar 31 22:39 rwdir.txt
-rw-r--r-- 1 root root 0 Mar 31 22:52 wtest2.file
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 31 22:50 wtest.file
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22255.html