NFS服务搭建与配置

时间:2023-03-09 00:43:18
NFS服务搭建与配置

本文讲解在 CentOS 5.x、CentOS 6.x 和 CentOS 7.x 环境下,如何安装与部署 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 生效。

NFS 服务所需的安装包

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

 [root@backup ~]# rpm -qa nfs-utils rpcbind
[root@backup ~]# yum install nfs-utils rpcbind -y #nfs需要的安装包
[root@backup ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.2.-.el6.x86_64
rpcbind-0.2.-.el6_7.x86_64

查看用户信息

 [root@nfs01 ~]# tail /etc/passwd
haldaemon:x:::HAL daemon:/:/sbin/nologin
ntp:x::::/etc/ntp:/sbin/nologin
saslauth:x:::Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x::::/var/spool/postfix:/sbin/nologin
sshd:x:::Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x::::/:/sbin/nologin
oldboy:x::::/home/oldboy:/bin/bash
rpc:x:::Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin #yum安装rpc服务时创建的
rpcuser:x:::RPC Service User:/var/lib/nfs:/sbin/nologin #yum安装rpc服务时创建的
nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin #yum安装nfs服务时创建的

NFS 版本查看

服务端版本查看

nfsstat -s

客户端版本查看

nfsstat  -c

NFS服务端搭建

配置exports

 [root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x. root root Apr : /data/
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data/
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x. nfsnobody nfsnobody Apr : /data/
[root@nfs01 ~]# cat /etc/exports
# share /data for web created by zhangliang at --
/data 172.16.1.0/(rw,sync)
#172.16.1.0/(rw,sync) 没有空格
#/data 172.16.1.0/(rw,sync,root_squash,all_squash,anonuid=XXXX,anongid=XXXX) # 推荐配置

其他配置示例:

 # 指定 IP 配置
/opt 192.168.0.1(ro) 192.168.0.2(rw)
# 指定 网段
/data 172.16.1.0/(rw,sync)

启动rpcbind服务

CentOS 5.x 和 CentOS 6.x 启动方式

 [root@nfs01 ~]# /etc/init.d/rpcbind start
[root@nfs01 ~]# netstat -anp | grep 'rpc'
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpcbind
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpc.statd
tcp ::: :::* LISTEN /rpc.statd
tcp ::: :::* LISTEN /rpcbind
udp 0.0.0.0: 0.0.0.0:* /rpcbind
udp 127.0.0.1: 0.0.0.0:* /rpc.statd
udp 0.0.0.0: 0.0.0.0:* /rpc.statd
udp 0.0.0.0: 0.0.0.0:* /rpcbind
udp ::: :::* /rpcbind
udp ::: :::* /rpc.statd
udp ::: :::* /rpcbind
unix [ ACC ] STREAM LISTENING /rpcbind /var/run/rpcbind.sock
unix [ ] DGRAM /rpc.statd
[root@nfs01 ~]# rpcinfo -p localhost
program vers proto port service
tcp portmapper
tcp portmapper
tcp portmapper
udp portmapper
udp portmapper
udp portmapper
udp status
tcp status
#### 由上可知,暂时只有自己的端口服务,没有其他的

CentOS 7.x 启动方式

 [root@nginx_cdn ~]# systemctl start rpcbind.service
[root@nginx_cdn ~]# netstat -anp | grep 'rpc'
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpcbind
tcp6 ::: :::* LISTEN /rpcbind
udp 0.0.0.0: 0.0.0.0:* /rpcbind
udp 0.0.0.0: 0.0.0.0:* /rpcbind
udp6 ::: :::* /rpcbind
udp6 ::: :::* /rpcbind
unix [ ACC ] STREAM LISTENING /systemd /var/run/rpcbind.sock
[root@nginx_cdn ~]# rpcinfo -p localhost
program vers proto port service
tcp portmapper
tcp portmapper
tcp portmapper
udp portmapper
udp portmapper
udp portmapper

启动 NFS

CentOS 5.x 和 CentOS 6.x 启动方式

 [root@nfs01 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
正在启动 RPC idmapd: [确定]
[root@nfs01 ~]# rpcinfo -p localhost
program vers proto port service
tcp portmapper
tcp portmapper
tcp portmapper
udp portmapper
udp portmapper
udp portmapper
udp status
tcp status
udp rquotad
udp rquotad
tcp rquotad
tcp rquotad
udp mountd
tcp mountd
udp mountd
tcp mountd
udp mountd
tcp mountd
tcp nfs
tcp nfs
tcp nfs
tcp nfs_acl
tcp nfs_acl
udp nfs
udp nfs
udp nfs
udp nfs_acl
udp nfs_acl
udp nlockmgr
udp nlockmgr
udp nlockmgr
tcp nlockmgr
tcp nlockmgr
tcp nlockmgr

CentOS 7.x 启动方式

 [root@nginx_cdn ~]# systemctl start nfs.service
[root@nginx_cdn ~]# rpcinfo -p localhost
program vers proto port service
tcp portmapper
tcp portmapper
tcp portmapper
udp portmapper
udp portmapper
udp portmapper
udp status
tcp status
udp mountd
tcp mountd
udp mountd
tcp mountd
udp mountd
tcp mountd
tcp nfs
tcp nfs
tcp nfs_acl
udp nfs
udp nfs
udp nfs_acl
udp nlockmgr
udp nlockmgr
udp nlockmgr
tcp nlockmgr
tcp nlockmgr
tcp nlockmgr

加入开始自启动

CentOS 5.x 和 CentOS 6.x 环境

使用 /etc/rc.local

 [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

使用chkconfig

 [root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# ls /etc/rc.d/rc3.d/* | grep -E 'rpc|nfs'
/etc/rc.d/rc3.d/K61nfs-rdma
/etc/rc.d/rc3.d/K69rpcsvcgssd
/etc/rc.d/rc3.d/S13rpcbind
/etc/rc.d/rc3.d/S14nfslock
/etc/rc.d/rc3.d/S19rpcgssd
/etc/rc.d/rc3.d/S30nfs

查看rpc服务和NFS服务的开机启动顺序

 [root@nfs01 ~]# head /etc/init.d/rpcbind
#! /bin/sh
#
# rpcbind Start/Stop RPCbind
#
# chkconfig: #运行级别 开机顺序 关机顺序【其中 指的是 运行级别】
# description: The rpcbind utility is a server that converts RPC program \
# numbers into universal addresses. It must be running on the \
# host to be able to make RPC calls on a server on that machine.
#
# processname: rpcbind
[root@nfs01 ~]# head /etc/init.d/nfs
#!/bin/sh
#
# nfs This shell script takes care of starting and stopping
# the NFS services.
#
# chkconfig: -
# description: NFS is a popular protocol for file sharing across networks.
# This service provides NFS server functionality, which is \
# configured via the /etc/exports file.
# probe: true

CentOS 7.x 环境

 [root@nginx_cdn ~]# systemctl enable rpcbind.service
[root@nginx_cdn ~]# systemctl enable nfs.service

查看具体状态情况

 [root@nginx_cdn ~]# systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
………………
[root@nginx_cdn ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
………………

查看有哪些参数生效

 [root@nfs01 ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=,anongid=,sec=sys,rw,root_squash,no_all_squash)

参数说明:
ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
rw:读写设置,NFS 客户端可读写;
sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率高;
root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置」
no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置);
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);

检查是否成功

 [root@nfs01 ~]# showmount -e 172.16.1.31  # 其中 172.16.1.31 为 NFS 服务端IP
Export list for 172.16.1.31:
/data 172.16.1.0/

NFS客户端配置

启动rpcbind服务

CentOS 5.x 和 CentOS 6.x 环境

 [root@web01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]

CentOS 7.x 环境

 [root@nginx_proxy01 ~]# systemctl start rpcbind.service

检查共享信息

 [root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/

NFS挂载

2台机器都挂载 NFS,好用于后面的测试。

 [root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt

查看挂载信息

查询方式1

 [root@web01 ~]# df -h        #有时可能会被卡主
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 .8G .5G .9G % /
tmpfs 495M 495M % /dev/shm
/dev/sda1 190M 40M 141M % /boot
172.16.1.31:/data .8G .5G .9G % /mnt

查询方式2

 [root@web01 ~]# cat /proc/mounts                     # 优先使用,监控时使用该命令
rootfs / rootfs rw
proc /proc proc rw,relatime
sysfs /sys sysfs rw,relatime
devtmpfs /dev devtmpfs rw,relatime,size=490920k,nr_inodes=,mode=
devpts /dev/pts devpts rw,relatime,gid=,mode=,ptmxmode=
tmpfs /dev/shm tmpfs rw,relatime
/dev/sda3 / ext4 rw,relatime,barrier=,data=ordered
/proc/bus/usb /proc/bus/usb usbfs rw,relatime
/dev/sda1 /boot ext4 rw,relatime,barrier=,data=ordered
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime
172.16.1.31:/data/ /mnt nfs4 rw,relatime,vers=,rsize=,wsize=,namlen=,hard,proto=tcp,port=,timeo=,retrans=,sec=sys,clientaddr=172.16.1.8,minorversion=,local_lock=none,addr=172.16.1.31

测试

在客户端和服务端之间测试
「2个客户端,1个服务端」

1、任意客户端创建文件夹或创建文件并且输入数据,在服务端是否可以查看;

2、服务端创建文件夹或创建文件并且输入数据,在任意客户端是否可以查看;

3、在客户端A 删除客户端B 创建的文件

4、在客户端B 删除客户端A 创建的文件

加入开机自启动

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

开机自启动方式1

 [root@web01 mnt]$ ll /etc/rc.local
lrwxrwxrwx. root root Nov /etc/rc.local -> rc.d/rc.local
[root@web01 mnt]# tail - /etc/rc.local # mount nfs
mount -t nfs 172.16.1.31:/data /mnt

开机自启动方式2

 [root@web01 mnt]$ cat /etc/fstab
# 添加如下信息
172.16.1.31:/data /mnt nfs defaults

存在问题

加入了开机自启动,当重启 NFS 客户端机器时,如果此时 NFS 服务端机器已关机,或者网络存在问题等等。使 NFS 客户端连接 NFS 服务端失败,那么此时会造成 NFS 客户端机器起不来的情况。

因此为了避免该情况发生,不建议机器开机自启动就挂载 NFS。

如果一台机器必须挂载 NFS,那么我们就做好监控。当该机器未挂载 NFS 时就告警给我们,然后我们去手动挂载。

当然如果实际环境中你们的 NFS 服务极其稳定,且几乎不再改变 NFS 服务端地址,那么此时你也可以加入开机自启动。

这些都是根据实际具体情况具体分析的。


如果觉得不错就点个赞呗 (-^O^-) !

———END———-

NFS服务搭建与配置