搭建NFS存储服务器--基于CentOS7系统 - jianmuzi - 博客园
在CentOS中搭建NFS - 陌上荼靡 - 博客园
NFS简介
NFS 是 Network FileSystem
的缩写,顾名思义就是网络文件存储系统,它最早是由 Sun 公司发展出来的,也是 FreeBSD 支持的文件系统中的一个,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机、不同的操作系统可以共享存储的服务。NFS在文件传送或信息传送过程中依赖于RPC协议。RPC (Remote Procedure Call) ——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。可以这么理解,NFS是一个文件存储系统,而RPC负责信息的传输。
环境准备
为了搭建并且检验NFS服务的配置,我们需要准备两台安装Linux系统(这里以Centos7为例)的服务器,一台充当NFS服务端,开放共享目录,提供NFS存储服务;一台充当NFS客户端,挂载服务端共享目录到本地,使用NFS存储服务。
表1 服务端和客户端IP配置
C/S类型 | eth0 ip |
服务端 | 192.168.203.10 |
客户端 | 192.168.203.20 |
环境搭建
(一)NFS服务端配置
安装软件
NFS服务端
默认使用的端口:111
、2049
、20048
# nfs-utils依赖rpcbind, 因此, 执行 yum -y install nfs-utils 也会安装rpcbind
yum -y install nfs-utils rpcbind
# ps: 常用目录
/etc/exports NFS服务的主要配置文件
/usr/sbin/exportfs NFS服务的管理命令
/usr/sbin/showmount 客户端的查看命令
/var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab 记录曾经登录过的客户端信息
创建需要共享的NFS目录,并赋予相关权限
mkdir /home/nfs
chmod 777 /home/nfs
# use
mkdir /data/nfs
chmod 755 /data/nfs
配置
编辑nfs的配置文件,默认为空。
vi /etc/exports
在exports
文件里面填入内容(网段根据实际情况填写,地址与括号之间不能有空格,括号里面为权限属性)
/mnt/nfs_file 192.168.203.0/24(rw,no_root_squash,no_all_squash,async,anonuid=501,anongid=501)
# 示例: 挂载NFS指定为可读写的目录,并且进行同步读写,将所有root用户都映射为匿名用户
/home/nfs 192.168.203.0/24(rw,sync,root_squash)
# use
# /data/nfs 192.168.1.0/24(rw,sync,root_squash)
/data/nfs 192.168.1.0/24(rw,sync,all_squash,anonuid=0,anongid=0)
# =================== 其它参考配置 =================== #
# 如果只允许一个客户端访问,可以只写一个客户端的IP地址
/mnt/ShareFolder 192.168.43.131(rw,sync,no_subtree_check)
# 如果只允许多个客户端访问,可以向如下一样写
/mnt/ShareFolder 192.168.43.131(rw,sync,no_subtree_check)
/mnt/ShareFolder 192.168.43.171(rw,sync,no_subtree_check)
/mnt/ShareFolder 192.168.43.137(rw,sync,no_subtree_check)
# 所有用户均以匿名方式访问, 但指定以root用户和root用户组写入
/data/nfs 192.168.1.0/24(rw,sync,all_squash,anonuid=0,anongid=0)
# 如果运行一个网段的客户端访问,可以这样写:
/mnt/ShareFolder 192.168.43.*(rw,sync,no_subtree_check)
或者
/mnt/ShareFolder 192.168.43.0/24(rw,sync,no_subtree_check)
查看完整的配置参数介绍:
man exports
配置参数说明:
NFS服务端将/mnt/nfs_file
目录共享出来,给192.168.203.0
网段的客户端使用
权限属性说明:
rw
, 读写ro
, 只读no_root_squash
, 不将root用户转换为匿名,当NFS客户端以root访问时,则映射为NFS服务器的root管理员; 登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。root_squash
, 将root用户转换为匿名,当NFS客户端以root访问时,则映射为NFS服务器对应的匿名用户。no_all_squash
, 所有用户都不转换为匿名用户,无论NFS客户端使用什么账户访问,原样映射为对应用户身份。all_squash
, 所有用户都转换为匿名用户,无论NFS客户端使用什么用户访问,均映射为NFS服务器的匿名用户。不管登陆NFS主机的用户是什么都会被重新设定为nobody。sync
, 同步模式,将数据写入内存并同步写入磁盘;async
, 异步即不同步写入磁盘, 先将数据写入内存,然后再定期写入磁盘;anonuid=xxx
, 指定 nfs 服务器/etc/passwd
文件中匿名用户的 UID,要和root_squash
以及all_squash
一同使用并生效anongid=xxx
, 指定 nfs 服务器/etc/passwd
文件中匿名用户的 GID,要和root_squash
以及all_squash
一同使用并生效
tip:
如果有多个共享目录配置,则使用多行,一行一个配置。
编译配置
exportfs -r
# or
exportfs -arv
# ===================== 命令说明 ===================== #
$. 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
(1)顺序启动
systemctl start rpcbind
systemctl status rpcbind
systemctl start nfs
systemctl status nfs
# or,两者等价
systemctl start nfs-server
NFS启动后状态:
(2)加入开机自启
systemctl enable rpcbind
systemctl enable nfs
校验配置
$. showmount -e localhost
# 输出
Export list forlocalhost:
/mnt/nfs_file 192.168.203.0/24
# use
# 检查是否存在共享目录
showmount -e
showmount -e localhost
showmount -e 172.17.0.15
指定NFS通信端口(选做)
# 由于nfs服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务
# 1. 修改 /etc/sysconfig/nfs 配置
$. vi /etc/sysconfig/nfs
# 在文末加入
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
STATD_OUTGOING_PORT=30005
# 2. 修改 /etc/modprobe.d/lockd.conf 配置
$. vi /etc/modprobe.d/lockd.conf
# 在/etc/modprobe.d/lockd.conf中添加以下设置:
options lockd nlm_tcpport=30002
options lockd nlm_udpport=30002
# 3. 重新加载NFS配置和服务:
systemctl restart rpcbind
systemctl restart nfs
systemctl restart nfs-config
systemctl restart nfs-idmap
systemctl restart nfs-lock
# 4.
rpcinfo -p
指定NFS相关服务的端口,便于Firewall防火墙开放端口。
注:其实,这里也可以不用配置,即不指定端口,那么配置Firewalld防火墙时,需要放过特定IP。
重启服务
systemctl restart rpcbind
systemctl restart nfs
systemctl restart nfslock
# 查看状态
systemctl status rpcbind
systemctl status nfs
systemctl status nfslock
使用rpcinfo -p查看并验证
rpcinfo -p
rpcinfo -p 192.168.1.161
会出现
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 30003 mountd
100005 1 tcp 30003 mountd
100005 2 udp 30003 mountd
100005 2 tcp 30003 mountd
100005 3 udp 30003 mountd
100005 3 tcp 30003 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 30002 nlockmgr
100021 3 udp 30002 nlockmgr
100021 4 udp 30002 nlockmgr
100021 1 tcp 30002 nlockmgr
100021 3 tcp 30002 nlockmgr
100021 4 tcp 30002 nlockmgr
100024 1 udp 30004 status
100024 1 tcp 30004 status
防火墙开放端口或IP
如果firewall防火墙开着,需要把111,2049,30001到30005的端口都开放出来
firewall-cmd --add-port={111,2049,30001,30002,30003,30004,30005}/tcp --permanent
firewall-cmd --add-port={111,2049,30001,30002,30003,30004,30005}/udp --permanent
firewall-cmd --reload
注:如果未指定NFS
端口,那么应配置firewall
防火墙,放过192.168.203.0/24
段的ip
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.203.0/24" accept"
firewall-cmd --reload
其它防护墙配置示例参考:
如果执行上述的mount
命令一直处于等待状态,可能是服务器上启用了防火墙或者是云服务器本身的防火墙限制了端口的访问,需要在NFS服务端
开放以下端口号的访问权限:111
、2049
、20048
。如果是云服务器可以到各自的网站后台去配置防火墙策略,如果是本地的机器可以使用以下命令开放指定的端口。
firewall-cmd --zone=public --add-port=111/tcp --permanent
firewall-cmd --zone=public --add-port=111/udp --permanent
firewall-cmd --zone=public --add-port=2049/tcp --permanent
firewall-cmd --zone=public --add-port=20048/tcp --permanent
firewall-cmd --zone=public --add-port=20048/udp --permanent
firewall-cmd --reload
上述端口信息都可以在以下文件中查找到
/usr/lib/firewalld/services/nfs.xml
/usr/lib/firewalld/services/rpc-bind.xml
/usr/lib/firewalld/services/mountd.xml
如果你不关心具体的端口号,也可以直接使用以下命令,直接根据配置文件放行相应的端口
firewall-cmd --zone=public --add-service=nfs --permanent
firewall-cmd --zone=public --add-service=rpc-bind --permanent
firewall-cmd --zone=public --add-service=mountd --permanent
firewall-cmd --reload
(二)NFS客户端配置
- 重要说明:
通过容器部署的nfs服务, 其它同一宿主机的nfs客户端容器挂载该nfs服务时, 只能通过nfs服务所在的
容器的ip地址
挂载,若是其它主机或者其他宿主机上的容器, 则均可以通过nfs服务容器所在的宿主机的ip地址挂载。
# 这里使用docker创建的centos容器环境, 已有自己的环境可忽略本内容。
docker run -d \
--privileged \
--name nfs_client \
centos:centos7.9.2009 /usr/sbin/init
docker exec -it nfs_client bash
1. 安装nfs
云平台管理服务器也需要安nfs
但无需启动
yum -y install nfs-utils rpcbind
2. 查看服务端挂载的目录
showmount -e 192.168.203.10
# 可以看到
Export list for192.168.203.10:
/mnt/nfs_file 192.168.203.0/24
# use
showmount -e
showmount -e 192.168.1.161
showmount -e 172.17.0.15
# ----------
showmount -e 172.17.0.2
showmount -e 192.168.31.133
3. 挂载共享目录
mkdir /mnt/file_nfc
chmod 777 /mnt/file_nfc
mount -t nfs 192.168.203.10:/mnt/nfs_file /mnt/file_nfc -o proto=tcp -o nolock
# or
mount -t nfs 192.168.203.10:/mnt/nfs_file /mnt/file_nfc
# 如若不再需要可以使用以下命令卸载NFS目录
umount /mnt/file_nfc
# use
mkdir /data -p
chmod 777 /data
mount -t nfs 172.17.0.15:/data/nfs /data -o proto=tcp -o nolock
mount -t nfs 192.168.1.161:/data/nfs /data -o proto=tcp -o nolock
# -----------
mount -t nfs 172.17.0.2:/data/nfs /data -o proto=tcp -o nolock
mount -t nfs 192.168.31.133:/data/nfs /data -o proto=tcp -o nolock
umount /data
同时把这一行加到/etc/rc.local
文件的最后,即加入开机启动
- 或者
修改开机自动挂载文件/etc/fatsb,末行填入如下内容:
192.168.203.10:/mnt/nfs_file /mnt/file_nfc nfs defaults,tcp,nolock 0 0
4.查看挂载盘
# 最后一行显示192.168.203.10:/mnt/nfs_file /mnt/file_nfc,说明挂载成功了
$. df –h
# 输出
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 1.4M 7.8G 1% /run
/dev/vda1 197G 53G 134G 29% /
192.168.203.10:/mnt/nfs_file 197G 66G 122G 35% /mnt/file_nfc
5. 验证
在客户端本地/mnt/file_nfc
目录中放入一个文件(如a.txt),然后去服务端的/mnt/nfs_file
目录中查看,若存在a.txt
,则说明配置成功
其他命令
# 在服务端执行,查看nfs状态信息
nfsstat -s
# 在客户端执行,查看nfs挂载信息
nfsstat -m
# 查看服务端的远程共享信息,此命令会调用服务端的20048端口
showmount -e 192.168.202.151
# 查看rpcbind注册的所有端口号
rpcinfo -p
rpcinfo -p 192.168.1.161
# 在服务端执行,重新挂载/etc/exports中配置
exportfs -r
问题
5.1 跨网段执行showmount不通的解决办法
# server端执行
# 1. 修改mountd端口号
$. vi /etc/sysconfig/nfs
# 添加
MOUNTD_PORT=40048
# 2. 重启并查看是否生效
$. systemctl restart rpcbind
$. systemctl restart nfs
$. rpcinfo -p