1 什么是 NFS?
NFS是Network File System的缩写,即网络文件系统。一种用于分布式文件系统的协议,由 Sun 开发并于 1984 年发布。功能是允许不同的机器和不同的操作系统通过网络相互共享单独的数据,以便客户端可以访问位于服务器磁盘通过网络实现,是类Unix系统之间实现磁盘文件共享的一种方法。 .
NFS 与 Samba:
它的主要功能是允许不同的机器系统通过网络相互共享文件和目录。 NFS 服务器可以允许 NPS 客户端将远程 NFS 服务器上的共享目录挂载到本地 NFS 客户端。从本地 NFS 客户端机器的角度来看,NFS 服务器端的共享目录就像它自己的磁盘分区和目录一样。一般挂载到本地目录的客户端名称可以是任意的,但是为了管理方便,我们应该和服务器端一样好。
NFS 一般用于存储共享视频和图片等静态数据。对 NFS 服务器没有频繁的写操作
尽量不要存储动态数据,比如脚本、数据库文件等,变化的频率比较高,因为数据交换的频率高会降低NFS的传输效率。
2 NFS 挂载原理
NFS是服务器和客户端(C/S)之间通过网络进行的数据传输。两者之间要传输数据cs15服务器命令,必须有相应的网络端口进行传输。 NFS 服务器使用什么网络端口传输数据? NFS 服务器实际上是随机选择端口进行数据传输。 NFS 客户端如何知道 NFS 服务器使用哪个端口?其实NFS服务器是通过远程过程调用(remote procedure call,简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口。客户端和服务端通过RPC通信NFS使用哪些端口,然后使用这些端口(小于1024)进行数据传输。
即RPC管理服务器的NFS端口分配。如果客户端要传输数据,客户端的RPC会先和服务器的RPC去服务器的端口,到达端口后建立连接,然后传输数据。
NFS服务器是通过远程过程调用(remote procedure call,简称RPC)协议/服务实现的。 NFS 协议通过 RPC 协议进行通信和对话。
NFS客户端需要与服务器建立通信进程。客户端首先通过 RPC 连接到服务器。 RPC 向服务器询问 NFS 端口是什么,服务器通过 RPC 将自己的 NFS 端口号告知客户端。
NFS客户端通过NFS端口号访问NFS服务器进行通信,NFS服务器确认连接成功。为了进行NFS通信过程。
两个过程:RPC连接确认-NFS连接确认
RPC 和 NFS 如何相互通信?
首先,当 NFS 启动时,会随机使用一些端口,然后 NFS 会将这些端口注册到 RPC。 RPC 将记录这些端口。而NFS服务器RPC会打开111端口,等待客户端的RPC请求。如果客户端有请求,服务器的RPC会通知客户端记录的NFS端口信息。
RPC 和 NFS 的启动顺序是什么?
在启动NPS SERVER之前cs15服务器命令,先启动RPC服务(即portmap服务,下同),否则NFS SERVER将无法注册到RPC服务区。另外,如果重新启动RPC服务,原来注册的NFS端口数据将全部丢失。因此,此时RPC服务所管理的NFS程序也应该重启,重新向RPC注册。
特别注意:一般修改NFS配置文件后,不需要重启NFS,直接执行命令/etc/init.d/nfs reload
总结:客户端NFS和服务器NFS通信流程
1)先在服务器端启动RPC服务,打开111端口
2)启动NFS服务并用RPC注册端口信息
3)客户端启动RPC(端口映射服务),向服务器的RPC(端口映射服务)服务请求服务器的NFS端口
4)服务器的RPC(portmap)服务将NFS端口信息反馈给客户端。
5)客户端通过获取的NFS端口与服务器建立NFS连接,传输数据。
RPC的早期服务被命名为portmap [CentOS 5之前的版本],CentOS 6之后更名为RPC。本质是一个统一的服务。
3 NFS相关协议及软件安装管理
协议:
NFS协议[服务器端口号:随机]
软件:
注意:通常作为系统默认安装包安装
CentOS6.* rpcbind 之前被称为portmap
例子:
#系统默认已经开启了RPC协议
~ netstat -antlp | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1596/rpcbind
tcp 0 0 :::111 :::* LISTEN 1596/rpcbind
4 个 NFS 系统守护进程
nfs:是一个基本的NFS守护进程,主要功能是管理客户端能否登录到服务器
rpcbind:主要功能是进行端口映射。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将服务对应的托管端口提供给客户端,让客户端可以通过该端口向服务器请求服务.
5 NFS 服务器配置
NFS服务器的配置比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
NFS服务的配置文件是/etc/exports。这个文件是NFS的主要配置文件,但是系统没有默认值,所以这个文件可能不存在。可以使用vim手动创建,然后在文件中写入配置内容。
/etc/exports 文件内容格式:
共享目录客户端 1(访问权限、用户映射、其他)客户端 2(访问权限、用户映射、其他)
共享目录:共享目录是指NFS服务器共享给客户端的目录。客户端:客户端是指网络中可以访问NFS共享目录的计算机
常用的客户端指定方法:
设置输出目录的访问权限、用户映射等。
访问权限选项:
用户映射选项:
NFS客户端和NFS服务器,NFS客户端将NFS服务器的目录映射到本地后,NFS客户端使用客户端的用户创建/修改文件,文件实际存放在NFS的目录中服务器。 NFS客户端和NFS服务器的用户关系完全不同。
用户映射关系:无论客户端使用什么用户创建,服务器上显示的文件都是由指定用户创建的
其他选项:
6 NFS服务器的启动和停止
1、启动 NFS 服务器
为了使NFS服务器正常工作,需要启动rpcbind和nfs两个服务,并且rpcbind必须在nfs之前启动。
service rpcbind start
service nfs start
2、查询NFS服务器状态
service rpcbind status
service nfs status
3、停止 NFS 服务器
当要停止NFS运行时,需要先停止nfs服务,再停止rpcbind服务。当系统中有其他服务(如NIS)需要使用时,不需要停止rpcbind服务
service nfs stop
service rpcbind stop
4、设置NFS服务器的自动启动状态
将 rpcbind 和 nfs 服务设置为在系统运行级别 2345 自动启动。
# chkconfig --level 2345 rpcbind on
# chkconfig --level 2345 nfs on
或者
chkconfig rpcbind on
chkconfig nfs on
5、查看RPC服务器打开了哪些端口
rpcinfo -p localhost
例子:
~ service nfs start #RPC默认启动
~ mkdir -p /nfs && chmod o+w /nfs/ #修改权限
~ vim /etc/exports
/nfs 10.0.0.41(rw,sync)
~ service nfs reload #重新加载NFS配置文件,不需要修改端口
~ service nfs status #查看NFS服务状态
~ service nfs stop #停止NFS服务
~ chkconfig nfs on #设置NFS开机自启动
~ rpcinfo -p localhost
7 实验相关案例 共享NFS服务器的/home/zhangsan到10.0.0.0网段,rw权限
vim /etc/exports
/home/zhangsan 10.0.0.0/24(rw,insecure,sync)
重启 rpcbind 和 nfs 服务
service rpcbind restart
service nfs restart
#查看NFS的配置信息
~ exportfs
/nfs 10.0.0.41
/home/zhangsan 10.0.0.0/24
在服务器端查看nfs共享状态
showmount -e 本机ip
#查看自己共享的服务 和 exportf命令效果本质上一样
客户端查看nfs共享状态
showmount -e NFS服务器IP地址
~ showmount -e 10.0.0.40
Export list for 10.0.0.40:
/home/zhangsan 10.0.0.0/24
/nfs 10.0.0.41
客户端挂载nfs服务器的共享目录
命令格式:挂载NFS服务器IP:共享目录本地挂载点目录
mount -o vers=3 10.0.0.40:/home/zhangsan/ /mnt/zhangsan/
mount | grep nfs
#客户端操作
~ mkdir /mnt/nfs
~ mount -o vers=3 10.0.0.40:/nfs /mnt/nfs
~ echo "Hello NFS" >> /mnt/nfs/nfs.txt
#查看文件列表,默认采用root_squash
~ ls -l /mnt/nfs/
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Jun 29 04:39 nfs.txt
#服务器端操作
~ ls -l
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Jun 29 04:39 nfs.txt
mount -o vers=3shared local #指定挂载使用NFS v3版本(避免同步延迟)
验证客户端和 NFS 服务器文件是否一致:
在服务器端修改相应的权限,否则客户端将无法正常访问和使用
~ cat /var/log/message #查看NFS日志信息
nfs 共享权限和访问控制
a、客户端根用户
使用客户端的根身份在 nfs 服务器上创建一个文件。该文件的所有者和组是 nfsnobody。
b.普通客户端用户
使用客户端的普通用户身份在 nfs 服务器上创建文件。所有者和组是nobody 或普通用户。如果显式设置了普通用户的映射用户身份,则将客户端用户的身份转换为指定的映射用户;
如果NFS服务器上存在同名用户,则将客户端登录账号的身份转换为NFS服务器上的同名用户;
示例:NFS 共享权限和访问控制
###服务器端
#添加参数 no_root_squash
~ vim /etc/exports
/nfs 10.0.0.41(rw,sync,no_root_squash)
~ service nfs reload
#客户端建议需要重新挂载
#umount /mnt/nfs
#mount -o vers=3 10.0.0.40:/nfs /mnt/nfs
~ echo "Hello NFS-FS" >> /mnt/nfs/nfs.log
~ ls -l /mnt/nfs/
total 8
-rw-r--r-- 1 root root 13 Jun 29 2022 nfs.log
-rw-r--r-- 1 nfsnobody nfsnobody 10 Jun 29 04:39 nfs.txt
###服务器端
#服务器端创建用户的UID和GID尽量要大于60000。要避免其服务器端的UID和客户端的UID重复
~ groupadd -g 1000 nfstest ; useradd -c "NFS User" -u 1000 -g 1000 nfstest
~ id nfstest
uid=1000(nfstest) gid=1000(nfstest) groups=1000(nfstest)
#使用参数all_squash
#all_squash ; anonuid ; anongid
~ vim /etc/exports
/nfs 10.0.0.41(rw,sync,all_squash,anonuid=1000,anongid=1000)
~ service nfs reload
#客户端建议需要重新挂载
#umount /mnt/nfs
#mount -o vers=3 10.0.0.40:/nfs /mnt/nfs
~ echo "NFS all_squash" >> /mnt/nfs/nfs.conf
~ ls -l /mnt/nfs/
total 12
-rw-r--r-- 1 1000 1000 15 Jun 29 2022 nfs.conf
-rw-r--r-- 1 root root 13 Jun 29 05:08 nfs.log
-rw-r--r-- 1 nfsnobody nfsnobody 10 Jun 29 04:39 nfs.txt
#客户端显示的所有者和所属组为1000,服务器端显示则为nfstest用户
~ ls -l /nfs/
total 12
-rw-r--r-- 1 nfstest nfstest 15 Jun 29 05:14 nfs.conf
-rw-r--r-- 1 root root 13 Jun 29 05:08 nfs.log
-rw-r--r-- 1 nfsnobody nfsnobody 10 Jun 29 04:39 nfs.txt
卸载和自动挂载,
卸载:
1、卸载客户端的挂载目录
umount 挂载点
2、停止服务器端共享
exportfs-au
自动挂载:/etc/fstab
格式::nfs 0 0
192.168.115.10:/home/zhangsan /media/zhangsan nfs 默认 0 0
挂载一个
#NFS客户端挂载
~ vim /etc/fstab
10.0.0.40:/nfs /mnt/nfs nfs defaults,vers=3 0 0
~ mount -a
~ df -Th
8个相关命令8.1个exportfs命令
如果我们在启动NFS后修改/etc/exports,是否需要重启nfs?这时候我们可以使用exportfs命令让修改立即生效。命令格式如下:
格式:exportfs [-aruv]
具体例子:
exportfs -au 卸载所有共享目录
exportfs -ra 转发所有目录并输出详细信息
示例:exportfs 命令
~ exportfs -av
exporting 10.0.0.41:/nfs
exporting 10.0.0.0/24:/data/nfs
exporting 10.0.0.0/24:/home/zhangsan
~ exportfs -v
/nfs 10.0.0.41(rw,wdelay,root_squash,all_squash,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,root_squash,all_squash)
/home/zhangsan 10.0.0.0/24(rw,wdelay,insecure,root_squash,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
/data/nfs 10.0.0.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
8.2 rpcinfo 命令
使用rpcinfo -p查看RPC打开的端口提供了哪些程序,
nfs开启的地方是2049,portmapper(rpcbind)由111开启,其余由rpc开启:
~ rpcinfo -p
~ service rpcbind status #rpcbind不要停止,该服务需要给其他服务提供服务
8.3 showmount 命令
showmount 命令查询“mount”守护进程以显示 NFS 服务器的安装信息。
Usage: showmount [-adehv]
[--all] [--directories] [--exports]
[--no-headers] [--help] [--version] [host]
-d 只显示已经被 NFS 客户端挂载的目录
-e
显示 NFS 服务器上的所有共享目录
暂无评论内容