在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过 NFS,实现服务器之间共享某一块磁盘,通过网络传输将分散的文件集中存储在一块指定的共享磁盘,实现基本的文件共享。实现这种方案,分服务端和客户端,将服务端的磁盘 mount 到客户端指定目录下,在客户端操作就像操作本地磁盘一样,nfs 基本的安装如下:
模拟环境:
服务端/客户端 | 服务器 IP |
---|---|
服务端 | 192.168.3.10 |
客户端 | 192.168.3.9 |
环境要求:
- 需要安装
nfs
和rpcbind
1. 服务端安装 NFS
1.1 检查 nfs
和 rpcbind
是否安装
$ rpm -qa |grep nfs
$ rpm -qa |grep rpcbind
1.2 创建一个共享目录,并配置共享信息
# 创建共享目录,这里假设共享目录为/data01/nfs
$ mkdir -p /data01/nfs
# 配置共享信息
#在/etc/exports添加以下内容
$ echo '/data01/nfs 192.168.3.9(rw,no_root_squash,no_all_squash,sync)' > /etc/exports
权限说明:
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
1.3 启动 nfs
和 rpcbind
$ systemctl enable rpcbind
$ systemctl start rpcbind
$ systemctl enable nfs
$ systemctl start nfs
1.4 查看是否共享成功
$ showmount -e localhost
2. 客户端安装并挂载
2.1 检查 nfs
和 rpcbind
是否安装
$ rpm -qa |grep nfs
$ rpm -qa |grep rpcbind
2.2 启动 nfs
和 rpcbind
$ systemctl enable rpcbind
$ systemctl start rpcbind
$ systemctl enable nfs
$ systemctl start nfs
2.3 创建挂载目录
$ mkdir -p /data01/share
2.4 检测远程共享服务器是否共享成功
$ showmount -e 192.168.3.11
2.5 挂载
# mount -t nfs -o nolock 服务端IP:共享目录绝对路径 本地挂载目录
$ mount -t nfs -o nolock 192.168.3.11:/data01/nfs /data01/share
2.6 查看挂载结果
$ df -Th
如果显示了远程磁盘的挂载信息,则挂载成功
2.7 测试
- 在/data01/share 下新增一个文件,并写入相关内容,然后到服务器端查看
2.8 卸载
卸载直接在客户端服务器上执行如下操作即可:umount 192.168.3.11:/data01/nfs
2.9 防火墙规则设置
可以通过 rpcinfo -p
查看具体用到的端口。
NFS 启动时会随机启动多个端口并向 RPC 注册,为了设置安全组以及 iptables 规则,需要设置 NFS 固定端口。
NFS 服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad 这 5 个服务,其中 nfs、portmapper 的端口是固定的,另外三个服务的端口是随机分配的,所以需要给 mountd,nlockmgr,rquotad 设置固定的端口。
-
其中,给 mountd、rquotad 设置端口的方式很简单,在
/etc/sysconfig/nfs
中添加一下设置即可:RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30002 MOUNTD_PORT=30003 STATD_PORT=30004
添加完后重启 rpc、nfs 的配置与服务
$ systemctl restart rpcbind $ systemctl restart nfs
-
还需在
/etc/modprobe.d/lockd.conf
中添加以下设置:options lockd nlm_tcpport=30002 options lockd nlm_udpport=30002
添加完后重新加载 NFS 配置和服务
$ systemctl restart nfs-config $ systemctl restart nfs-idmap $ systemctl restart nfs-lock $ systemctl restart nfs-server
-
修改完后查看端口
端口 | proto | 作用 |
---|---|---|
111 | tcp | portmapper 进程使用,负责分配 rpc server 的端口,并在 client 端请求时,负责响应目的 rpc server 端口返回给 client 端。 |
111 | udp | |
30002 | udp | NFS lock manager 进程使用,它允许 NFS 客户端在服务器上对文件加锁。 |
30002 | tcp | |
2049 | tcp | nfs 的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户。 |
2049 | udp | |
30003 | udp | 是 nfs 服务的认证服务的守护进程,client 在收到返回的真正端口时,就会去连接 mountd,认证取得令牌。 |
30004 | tcp | |
30004 | udp | rpc.statd 进程,这个进程实现了网络状态监控(NSM)RPC 协议,通知 NFS 客户端什么时候一个 NFS 服务器非正常重启动。 |
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于