NFS(网络文件共享)
文章目录
- 一、NFS简介
- 二、工作原理
- 正确工作流程
- 三、NFS的使用
- 1.安装
- 2.配置文件
- 分析
- 实验1:共享文件
- 服务端配置
- 客户端配置
- 实验2:修改权限
- 实验三:账户映射
一、NFS简介
-
NFS允许网络中你的计算机之间通过tcp/ip网络共享资源
-
NFS服务器可以让pc将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地的系统中看来,远程主机的目录将想是自己的一个磁盘分区一样
-
由于NFS支持的功能比较多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口并不固定,而是随机取用一些未被使用的小于1024的端口用于传输。但如此一来就会产生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能够连接。此时就需要RPC
-
RPC(Remote Procedure Call,远程过程调用):由于服务器在启动NFS时会随机选取数个端口号,并主动向RPC注册,所以RPC知道每个NFS功能所对应的端口号,RPC将端口号通知给客户端,让客户端可以连接到正确的端口上去。RPC采用固定端口号port 111来监听客户端的需求并向客户端响应正确的端口号。
-
在启动NFS之前,要先启动RPC,否则NFS会无法向RPC注册。另外,RPC若重新启动,原来注册的数据会消失不见,因此RPC重启后,它管理的所有服务都需要重新启动以重新向RPC注册。
二、工作原理

原理类似于一租客要去租房,但不知道哪里有房可以租,于是就去找中介,中介提供房源(房东早就在中介哪里登记了房子信息),租客就去找房主商量
房东就像NFS服务器,向中介RPC注册启动端口,当客户端请求NFS服务时,就去找RPC,RPC中返回端口号给客户端,然后客户端拿着地址端口请求传输。
正确工作流程
-
首先服务器端启动RPC服务,并开启111端口
-
服务器端启动NFS服务,并向RPC注册端口信息
-
客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
-
服务端的RPC(portmap)服务反馈NFS端口信息给客户端。(服务器搭建成功后可以使用下列命令查看,一般都是2049)
查看NFS的信息
[root@server ~]# cat /etc/services | grep nfs nfs 2049/tcp nfsd shilp # Network File System
nfs 2049/udp nfsd shilp # Network File System
nfs 2049/sctp nfsd shilp # Network File System
netconfsoaphttp 832/tcp # NETCONF for SOAP over HTTPS
netconfsoaphttp 832/udp # NETCONF for SOAP over HTTPS
netconfsoapbeep 833/tcp # NETCONF for SOAP over BEEP
netconfsoapbeep 833/udp # NETCONF for SOAP over BEEP
nfsd-keepalive 1110/udp # Client status info
picknfs 1598/tcp # picknfs
picknfs 1598/udp # picknfs
shiva_confsrvr 1651/tcp shiva-confsrvr # shiva_confsrvr
shiva_confsrvr 1651/udp shiva-confsrvr # shiva_confsrvr
3d-nfsd 2323/tcp # 3d-nfsd
3d-nfsd 2323/udp # 3d-nfsd
mediacntrlnfsd 2363/tcp # Media Central NFSD
mediacntrlnfsd 2363/udp # Media Central NFSD
winfs 5009/tcp # Microsoft Windows Filesystem
winfs 5009/udp # Microsoft Windows Filesystem
enfs 5233/tcp # Etinnae Network File Service
nfsrdma 20049/tcp # Network File System (NFS) over RDMA
nfsrdma 20049/udp # Network File System (NFS) over RDMA
nfsrdma 20049/sctp # Network File System (NFS) over RDMA
[root@server ~]#
三、NFS的使用
1.安装
[root@server ~]# yum install nfs-utils -y [root@server ~]# yum install rpcbind -y # 默认已安装
#在v4版本中,安装nfs-utils软件包时也安装了rpcbind
2.配置文件
- 主配置文件:/etc/exports , 文件不一定存在
- /usr/sbin/exportfs : 该文件是维护NFS共享目录资源的命令文件,可以使用命令重新共享/etc/exports的目录资源、卸载共享目录
- 日志目录:/var/lib/nfs
- 权限设置文件:/var/lib/nfs/etab
分析
- /etc/exports文件默认为空文件,需要输入nfs共享命令
格式为:共享文件路径 允许访问的客户端的IP地址 (共享权限)- 允许访问的客户端可以写完整的IP地址或者网段
*表示所有主机都可以访问 - 权限参数必须写在括号里,且括号要挨着主机名,多个参数之间要用逗号隔开
| 权限参数 | 作用 |
|---|---|
| ro | 只读 |
| rw | 读写(最终还是看rwx权限) |
| root_squash | 当客户端以root账户访问时,映射为服务端的匿名账户nobody |
| no_root_squash | 当客户端以root账户访问时,映射为root账户(不安全,不推荐) |
| all_squash | 无论客户端使用你什么账户访问,均映射为服务器的匿名账户nobody |
| no_all_squash | 客户端普通账户访问服务器的数据时,实际的信息原样显示 |
| anonuid= anongid= | 将文件的用户和工作组映射为指定UID和GID,若不指定则默认为65534(nobody) |
| sync | 同时将数据写入内存与硬盘中,保证数据不会丢失 |
| async | 优先将数据保存到内存,然后在写入硬盘,效率高,但可能会数据丢失 |
示例:
- /home/public *(rw,sync,all_squash) 意义:服务器共享/home/public目录中的数据,所有人都可访问,可读可写,同步传输,账户映射为nobody
- /home/public 192.168.48.131/24(ro,root_squash,sync) 意义:服务器共享/home/public目录中的数据,只允许192.168.48.131主机访问,方式为只读,客户端root账户映射为服务端的nobody,同步读写
- /home/public 192.168.48.0/24(rw,all_squash,anonuid=2000,anongid=2000) 意义:服务器共享/home/public目录中的数据,允许192.168.48.0网段所有主机访问,方式为可读可写,账户映射为nobody,uid为2000,gid为2000
实验1:共享文件
服务端配置
1.关闭防火墙和selinux然后安装服务
setenforce 0
systemctl stop firewalld
yum install nfs-utils -y 服务端和客户端均安装
2.服务端建立共享文件目录,并设置权限
[root@server ~] mkdir /nfsfile
[root@server ~] echo "hello hahaha" > /nfsfile/readme
[root@server ~]# chmod -Rf 777 /nfsfile
[root@server ~] ll /nfsfile/readme
-rw-r--r-- 1 root root 13 Oct 30 19:50 /nfsfile/readme
3.服务端编辑配置文件,要共享的目录
[root@server ~] vim /etc/exports
#添加以下内容
/nfsfile *(rw,sync,all_squash)#服务端共享/nfsfile目录中的数据,所有主机均可访问,同步传输,所有账户均映射为nobody
4.服务端先启动rpc,再启动nfs
[root@server ~] systemctl start rpcbind
[root@server ~] systemctl start nfs-server
[root@server ~]
# 注意:若systemctl start rpcbind后报错,显示启动失败,应先停止服务,在重启服务
[root@server ~] systemctl stop rpcbind
[root@server ~] systemctl start rpcbind
客户端配置
先安装nfs-utils
1.先查询有哪些远程共享目录可用
-e标识显示服务器共享信息列表
[root@node1 ~] showmount -e 192.168.65.128
Export list for 192.168.65.128:
/nfsfile *
2.新建本地挂载目录,远程挂载
[root@node1 ~] mkdir /nfs1 #新建本地挂载目录
[root@node1 ~] mount -t nfs 192.168.65.128:/nfsfile /nfs1 #使用mount远程挂载服务器的目录到本地目录,-t nfs表示使用的文件系统类型
[root@node1 ~] cd /nfs1
[root@node1 nfs1] ls
readme
[root@node1 nfs1] cat redme
cat: redme: No such file or directory
[root@node1 nfs1] cat readme
hello hahaha客户端新建一个文件test1,ll查看,可见账户映射为了nobody
[root@node1 nfs1] touch test1.txt
[root@node1 nfs1] ll
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:12 test1.txt#服务端查看
[root@server ~]ll /nfsfile
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:12 test1.txt
[root@server ~]#
实验2:修改权限
基于实验1,修改服务端nfsfile目录的权限,客户端是否可以访问成功,是否可以修改数据
#未修改权限为777
[root@server ~]# ll /nfsfile
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:12 test1.txt
修改权限为444
[root@server ~] chmod -Rf 444 /nfsfile
[root@server ~] ll /nfsfile
total 4
-r--r--r-- 1 root root 13 Oct 30 19:50 readme
-r--r--r-- 1 nobody nobody 0 Oct 30 20:12 test1.txt客户端测试
d ~
[root@node1 ~# cd /nfs1
-bash: cd: /nfs1: Permission denied
从实验2可见,即使服务端exports配置文件中有rw权限,最后还是以文件系统权限为准
实验三:账户映射
修改配置文件,账户映射为root_squash,root用户映射为nobody
#服务端
[root@server ~] chmod -Rf 777 /nfsfile
[root@server ~] vim /etc/exports
[root@server ~] systemctl restart rpcbind
[root@server ~] systemctl restart nfs-server#客户端[root@node1 ~] cd /nfs1
[root@node1 nfs1] touch test2
[root@node1 nfs1] ll #root映射为nobody
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rwxrwxrwx 1 nobody nobody 0 Oct 30 20:12 test1.txt
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:54 test2#切换一个普通用户fox,在共享的文件里面创建test3.txt后,用户fox,未被映射,原因是服务端编辑了配置文件为root_squash[root@node1 nfs1] su fox
[fox@node1 nfs1]$ touch test3.txt
[
[fox@node1 nfs1]$ ll
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rwxrwxrwx 1 nobody nobody 0 Oct 30 20:12 test1.txt
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:54 test2
-rw-r--r-- 1 fox fox 0 Oct 30 21:02 test3.txt
[root@server ~] vim /etc/exports
/nfsfile 192.168.65.128/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
修改配置文件,all_squash,anonuid=2000,anongid=2000
修改为所有用户都映射为uid为2000的用户,gid为2000的组,如果没有就显示2000。
#现在是root用户
[root@node1 nfs1] who
root pts/0 2025-11-01 20:14 (192.168.65.1)
#root用户创建一个文件test4
[root@node1 nfs1] touch test4.txt
[root@node1 nfs1]
[root@node1 nfs1] ll
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rwxrwxrwx 1 nobody nobody 0 Oct 30 20:12 test1.txt
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:54 test2
-rw-r--r-- 1 fox fox 0 Oct 30 21:02 test3.txt
-rw-r--r-- 1 fox fox 0 Nov 1 20:28 test4.txt
#可见root用户创建一个test4后,root映射为了fox, id fox查看[root@node1 nfs1]id fox
uid=2000(fox) gid=2000(fox) groups=2000(fox)#fox的uid为2000,组gid为2000,所以root映射为了fox查看server端,[root@server nfsfile]# ll
total 4
-rwxrwxrwx 1 root root 13 Oct 30 19:50 readme
-rwxrwxrwx 1 nobody nobody 0 Oct 30 20:12 test1.txt
-rw-r--r-- 1 nobody nobody 0 Oct 30 20:54 test2
-rw-r--r-- 1 2000 2000 0 Oct 30 21:02 test3.txt
-rw-r--r-- 1 2000 2000 0 Nov 1 20:28 test4.txt
