一、NFS 工作原理简介(NFS是Net File System的简写,即网络文件系统)二、NFS 服务所需的安装包及常用命令三、NFS服务端搭建

一、NFS 工作原理简介

注意:一台机器不要同时做 NFS 的服务端和 NFS 的客户端。如果同时作了 NFS 的服务端和客户端,那么在关机的时候,会一直夯住,可能十分钟之后甚至更久才能关闭成功。

nfs搭建高可用 nfs如何搭建_运维


        启动 NFS SERVER 之前,首先要启动 RPC 服务(CentOS 5.x 下为 portmap 服务,CentOS 6.x 和 CentOS 7.x 下为 rpcbind 服务,下同),否则 NFS SERVER 就无法向 RPC 服务注册了。

        另外,如果 RPC 服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时 RPC 服务管理的NFS程序也需要重新启动以重新向RPC注册。

        要特别注意的是:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行 /etc/init.d/nfs reload 「针对CentOS 5.x 或 CentOS 6.x」 或 systemctl reload nfs.service 「针对CentOS 7.x」 或 exportfs -rv 即可使修改的 /etc/exports 生效。

exportfs

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

  # exportfs [-aruv]

  -a 全部挂载或卸载 /etc/exports中的内容 
  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
  -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
  -v 在export的时候,将详细的信息输出到屏幕上。

具体例子: 
   exportfs -au 卸载所有共享目录
     exportfs -rv 重新共享所有目录并输出详细信息

NFS系统守护进程

  • nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;
  • mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
  • portmap:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。

NFS的常用目录

/etc/exports                           NFS服务的主要配置文件

/usr/sbin/exportfs                   NFS服务的管理命令

/usr/sbin/showmount              客户端的查看命令

/var/lib/nfs/etab                      记录NFS分享出来的目录的完整权限设定值

/var/lib/nfs/xtab                      记录曾经登录过的客户端信息

        NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。

/etc/exports文件内容格式

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)


a. 输出目录:


输出目录是指NFS系统中需要共享给客户机使用的目录;


b. 客户端:


客户端是指网络中可以访问这个NFS输出目录的计算机


客户端常用的指定方式


指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主机:david.bsmart.cn
指定域中的所有主机:*.bsmart.cn
所有主机:*
c. 选项:


选项用来设置输出目录的访问权限、用户映射等。


NFS主要有3类选项:


访问权限选项


设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项


all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项


secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

二、NFS 服务所需的安装包和常用命令

1、安装 NFS 和 RPC 「服务端、客户端都安装」

nfs搭建高可用 nfs如何搭建_java_02

rpm -qa nfs-utils rpcbind # 查询是否有,没有用yum安装
yum install nfs-utils rpcbind -y    #nfs需要的安装包
rpm -qa nfs-utils rpcbind
# nfs-utils-1.3.0-0.66.el7.x86_64
# rpcbind-0.2.0-49.el7.x86_64


查看是否安装


rpm -qa |grep nfs


rpm -qa |grep rpcbind


# 关闭防火墙,selinux
systemctl stop firewalld.service
systemctl disable firewalld.service  # 禁止防火墙开机自启动
setenforce 0

nfs搭建高可用 nfs如何搭建_nfs搭建高可用_03

2、查看用户信息

nfs搭建高可用 nfs如何搭建_centos_04

[root@lhrdocker ~]# tail /etc/passwd | egrep -i "rpc|nfs"
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin   #yum安装rpc服务时创建的
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin  #yum安装nfs服务时创建的

3、NFS 版本和状态查看

服务端版本查看
nfsstat -s
客户端版本查看
nfsstat  -c
加入开始自启动
[root@nfs01 ~]# tail /etc/rc.local
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.


touch /var/lock/subsys/local


# start rpc and nfs server
/etc/init.d/rpcbind start
/etc/init.d/nfs start




1.启动nfs服务
systemctl start nfs-server.service


2.设置开机自启动
systemctl enable nfs-server.service


3.停止开机自启动
systemctl disable nfs-server.service
4.查看服务当前状态
systemctl status nfs-server.service


5.重新启动某服务
systemctl restart nfs-server.service


6、rpcbind.service
systemctl status/start/restart rpcbind.service


7、查看有哪些参数生效
cat /var/lib/nfs/etab 


8、检查共享信息
showmount -e 172.16.1.31
  -a 显示已经于客户端连接上的目录信息
  -e IP或者hostname 显示此IP地址分享出来的目录
  -d 显示指定的nfs服务器中已被客户端连接的所有输出目录;
9、查看挂载信息
df -h        #有时可能会被卡主
cat /proc/mounts                     # 优先使用,监控时使用该命令

nfs搭建高可用 nfs如何搭建_linux_05

相关配置文件及命令的使用
/etc/exports
/path/to/somedir CLIENT_LIST
多个客户之间使用空白字符分隔
每个客户端后面必须跟一个小括号,里面定义了此客户访问特性,如访问权限等


172.16.0.0/16(ro,async) 192.16.0.0/24(rw,sync) *(ro)


权限属性:
    ro:只读
    rw:读写
    sync:同步,数据同步写到内存与硬盘中
    async:异步,数据先暂存内存
    root_squash: 将root用户映射为来宾账号
    no_root_squash: 有root的权限,不建议使用
    all_squash: 全部映射为来宾账号
    anonuid, anongid: 指定映射的来宾账号的UID和GID 


exportfs命令:
    -a:跟-r或-u选项同时使用,表示重新挂载所有文件系统或取消导出所有文件系统;
    -r: 重新导出
    -u: 取消导出
    -v: 显示详细信息


showmount命令:
showmount -e NFS_SERVER: 查看NFS服务器"导出"的各文件系统
showmount -a NFS_SERVER: 查看NFS服务器所有被挂载的文件系统及其挂载的客户端对应关系列表
showmount -d NFS_SERVER: 显示NFS服务器所有导出的文件系统中被客户端挂载了文件系统列表


rpcinfo
-p hostname(orIP)
-p :显示所有的 port 与 program 的信息!


如果要让mountd和quotad等进程监听在固定端口,
编辑配置文件/etc/sysconfig/nfs


客户端使用mount命令挂载
mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT /PATH/TO/SOMEWHRERE

三、NFS服务端搭建

NFS服务端所需的软件列表

nfs-utils: 这个是NFS服务主程序(包含rpc.nfsd、rpc.mountd、daemons)

rpcbind: 这个是CentOS6.X的RPC主程序(CentOS5.X的为portmap)

lsof -i :111  #查询rpcbind监听状态 (111是rpcbind的主端口)
netstat -lntup |grep rpcbind #查询rpcbind服务启动状态 (同lsof查询端口效果一样)
chkconfig --list rpcbind #检查rpcbind自启动情况
1、服务端
[root@xiaomaili ~]# mkdir /data
[root@xiaomaili ~]# ll -d /data/
drwxr-xr-x. 3 root root 4096 Apr 11 09:49 /data/
[root@xiaomaili ~]# chown -R nfsnobody.nfsnobody /data/
[root@xiaomaili ~]# ll -d /data/
drwxr-xr-x. 3 nfsnobody nfsnobody 4096 Apr 11 09:49 /data/
[root@xiaomaili ~]# cat /etc/exports
# share /data for web created by xiaomaili at 2021-05-21
/data   172.16.1.0/24(rw,sync)
#172.16.1.0/24(rw,sync) 没有空格
#/data  172.16.1.0/24(rw,sync,root_squash,all_squash,anonuid=XXXX,anongid=XXXX) # 推荐配置


2、 客户端
mount -t nfs 192.xx.xx.xx:/home/nfstestdir(服务端被挂载的目录) /mnt(客户端要挂载的目录)

加入开机自启动

如果是 CentOS 7 环境,那么必须保证 /etc/rc.d/rc.local 文件具有可执行权限,否则该脚本不会执行也不会生效。

# 开机自启动方式1
[root@xiaomaili mnt]$ ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Nov 14  2018 /etc/rc.local -> rc.d/rc.local
[root@xiaomaili mnt]# tail -3 /etc/rc.local


# mount nfs
mount -t nfs 172.16.1.31:/data /mnt


# 开机自启动方式2
[root@web01 xiaomaili]$ cat /etc/fstab 
# 添加如下信息
172.16.1.31:/data                        /mnt   nfs   defaults   0 0