前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NFS网络文件系统基础配置与使用

NFS网络文件系统基础配置与使用

作者头像
全栈工程师修炼指南
发布2022-09-28 18:56:05
3.6K0
发布2022-09-28 18:56:05
举报
文章被收录于专栏:全栈工程师修炼之路

[TOC]

0x00 前言简述

描述: 先来学习三大步,任何事物皆可用;

Q: 什么是NFS?为什么要NFS?

描述:NFS(Network File System)即网络文件系统, 利用网络使得在不同的机器之间共享文件。 通过NFS可以将另一台机器的某个目录挂载到本机的某个目录下, 在使用的时候挂载过来的目录就像在本地一样, 极大的方便了多台服务器之间的文件共享。

补充:在提到NFS服务的时候都会提到RPC服务,那么什么是RPC服务,为什么需要RPC服务呢? 答:RPC是Remote Procedure Call的缩写即远程过程调用,其次关于为什么要RPC服务是因为NFS服务在启动的时候对于端口的选择是随机的,NFS在启动的时候回随机选择小于1024的端口进行数据的传输。而RPC的主要功能就是记录每个NFS服务所对应的端口号,当客户端尝试连接NFS服务时它会将其对应的端口号发送给客户端,客户端根据获得的端口号进行连接。

代码语言:javascript
复制
rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器
rpc.mount:主要功能是管理NFS的文件系统,当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的磁盘前,还必须通过目录使用权限的验证,它会读取NFS的配置文件/etc/exports(初始文件为空)来对比客户端权限
portmap:主要功能是进行端口映射工作
idmap:进程实现用户映射和压缩

Q: NFS 特点有哪里?

  • (1) 方便多台服务器之间的文件共享
  • (2) 搭建使用简单
  • (3) 可进行密码认证以及Kerberos认证

Q:NFS 应用场景

  • (1) 比如Kubernetes中多台主机共享存储资源;

NFS 版本说明

(1) NFSv2 and NFSv3

代码语言:javascript
复制
# NFSv3同时支持TCP和UDP传输层协议
# NFSv3使用大量辅助协议通过portmap/rpcbind获取rpc.mounted监听端口,再进行身份验证其次验证通过后nfs客户端才能与rpc.nfsd建立联系并访问共享
Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)

mount -t nfs 11.11.165.115:/data /tmp/data  -o proto=tcp -o nolock

(2) NFSv4:

代码语言:javascript
复制
Example for NFSv4:
# /srv/nfs4        gss/krb5(rw,sync,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
# 客户端挂载过程需要通过mount –t nfs4指定NFS版本为4,默认采用nfsv3。
mount -t nfs4 192.168.78.1:/data  /tmp/data

NFSv4和NFSv3的差别如下:

(1) NFSv4设计成了一种有状态的协议,自身实现了文件锁功能和获取文件系统根节点功能,不需要NLM和MOUNT协议协助了。

(2) NFSv4增加了安全性,支持RPCSEC-GSS身份认证。

(3) NFSv4只提供了两个请求NULL和COMPOUND,所有的操作都整合进了COMPOUND中,客户端可以根据实际请求将多个操作封装到一个COMPOUND请求中,增加了灵活性。

(4) NFSv4文件系统的命令空间发生了变化,服务器端必须设置一个根文件系统(fsid=0),其他文件系统挂载在根文件系统上导出。客户端需要使用“nfs server ip:/”挂载伪文件系统,伪文件系统一般使用RO方式共享,其他共享可以通过mount –bind选项在伪文件系统目录下挂载;

(5)NFSv4支持delegation。由于多个客户端可以挂载同一个文件系统,为了保持文件同步,NFSv3中客户端需要经常向服务器发起请求,请求文件属性信息,判断其他客户端是否修改了文件。如果文件系统是只读的,或者客户端对文件的修改不频繁,频繁向服务器请求文件属性信息会降低系统性能。NFSv4可以依靠delegation实现文件同步。当客户端A打开一个文件时,服务器会分配给客户端A一个delegation。只要客户端A具有delegation,就可以认为与服务器保持了一致。如果另外一个客户端B访问同一个文件,则服务器会暂缓客户端B的访问请求,向客户端A发送RECALL请求。当客户端A接收到RECALL请求时将本地缓存刷新到服务器中,然后将delegation返回服务器,这时服务器开始处理客户端B的请求。

(6) NFSv4修改了文件属性的表示方法。由于NFS是Sun开发的一套文件系统,设计之出NFS文件属性参考了UNIX中的文件属性,可能Windows中不具备某些属性,因此NFS对操作系统的兼容性不太好。NFSv4将文件属性划分成了三类:

代码语言:javascript
复制
* Mandatory Attributes: 这是文件的基本属性,所有的操作系统必须支持这些属性。
* Recommended Attributes: 这是NFS建议的属性,如果可能操作系统尽量实现这些属性。
* Named Attributes: 这是操作系统可以自己实现的一些文件属性。

(7)服务器端拷贝: 如果客户需要从一个NFS服务器拷贝数据到另外一个NFS服务器,nfsv4可以让两台NFS服务器之间直接拷贝数据,不需要经过客户端。

(8)资源预留和回收:NFSv4为虚拟分配提供的新特性。随着存储虚拟分配功能的普及使用,nfsv4可以为预留固定大小的存储空间;同样在文件系统上删除文件后,也能够在存储上面释放相应空间。

(9)国际化支持: NFSv4文件名、目录、链接、用户与组可以使用 UTF-8字符集,UTF-8兼容ASCII码,使得NFSv4支持更多语言。

(10)RPC合并调用:NFSv4允许将多个请求合并为一个rpc引用,在NFSv3每个请求对应一个rpc调用。WAN环境中,NFSv4合并rpc调用可以显著降低延迟。

(11)安全性:NFSv4用户验证采用“用户名+域名”的模式,与Windows AD验证方式类似,NFSv4强制使用Kerberos验证方式。(Kerberos与Windows AD都遵循相同RFC1510标准),这样方便windows和*nix环境混合部署。

(12)pNFS并行NFS文件系统,元数据服务器负责用户请求调度、数据服务器负责客户请求处理。pNFS需要NFS服务器和客户端协同支持,pNFS架构示意图如下:

WeiyiGeek.pNFS架构

NFS 服务协议 描述:#对于不同的网络情况,有针对地选择 UDP 或 TCP 传输协议。传输协议可以自动选择,也可以手动设置。

代码语言:javascript
复制
# 一般情况下,使用 TCP 的 NFS 比较稳定,使用 UDP 的 NFS 速度较快。
# 在机器较少,网络状况较好的情况下,使用 UDP 协议能带来较好的性能。
# 当机器较多,网络情况复杂时,推荐使用 TCP 协议(V2 只支持 UDP 协议)。
# 在局域网中使用 UDP 协议较好,因为局域网有比较稳定的网络保证,使用 UDP 可以带来更好的性能。
# 在广域网中推荐使用 TCP 协议,TCP 协议能让 NFS 在复杂的网络环境中保持最好的传输稳定性。

客户端连接NFS服务的过程:

1.客户端首先向NFS服务所在的服务器的RPC服务发起请求RPC服务的端口固定为 111

代码语言:javascript
复制
$rpcinfo -p 192.168.1.216
#    program vers proto   port  service
#     100000    4   tcp    111  portmapper
#     100003    3   tcp   2049  nfs
#     100003    4   tcp   2049  nfs
#     100227    3   tcp   2049  nfs_acl
#     100003    3   udp   2049  nfs
#     100227    3   udp   2049  nfs_acl
``` 
* 2.RPC服务在接收到客户端的请求之后,找到注册的NFS服务所对应的端口号,并将端口号发送给客户端例如:
```bash
tcp   0   0 192.168.1.216:2049  192.168.1.216:885    ESTABLISHED off (0.00/0/0)

3.客户端根据获取到NFS端口号进行连接;

0x01 NFS安装配置

(1) CentOS 系统

测试环境:CentOS Linux release 7.8.2003 (Core) NFS server端配置

代码语言:javascript
复制
# 1.检查服务器是否安装了nfs-util和rpcbind两个包
$rpm -qa | grep nfs
#nfs-utils:NFS服务的全程序,包括rpc.nfsd、rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
nfs-utils-1.2.3-54.el6.x86_64
nfs-utils-lib-1.1.5-9.el6.x86_64
$rpm -qa | grep rpcbind
#rpcbind:Centos.x下面RPC的主程序。NFS可视为一个rpc程序,在互动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由RPCBIND服务来完成的。因此,在提供NFS服务之前必须先启动RPCBIND服务。
rpcbind-0.2.0-11.el6.x86_64


# 2.如果没安装进行安装上述两个包即可
$yum install –y rpcbind nfs-utils
# 正在安装:
#  nfs-utils                          x86_64                  1:1.3.0-0.66.el7_8                     updates                  412 k
#  rpcbind                            x86_64                  0.2.0-49.el7                           base                      60 k
# 为依赖而安装:
#  gssproxy                           x86_64                  0.7.0-28.el7                           base                     110 k
#  keyutils                           x86_64                  1.5.8-3.el7                            base                      54 k
#  libbasicobjects                    x86_64                  0.1.1-32.el7                           base                      26 k
#  libcollection                      x86_64                  0.7.0-32.el7                           base                      42 k
#  libevent                           x86_64                  2.0.21-4.el7                           base                     214 k
#  libini_config                      x86_64                  1.3.1-32.el7                           base                      64 k
#  libnfsidmap                        x86_64                  0.25-19.el7                            base                      50 k
#  libpath_utils                      x86_64                  0.2.1-32.el7                           base                      28 k
#  libref_array                       x86_64                  0.1.5-32.el7                           base                      27 k
#  libtirpc                           x86_64                  0.2.4-0.16.el7                         base                      89 k
#  libverto-libevent                  x86_64                  0.2.5-4.el7                            base                     8.9 k
#  quota                              x86_64                  1:4.01-19.el7                          base                     179 k
#  quota-nls                          noarch                  1:4.01-19.el7                          base                      90 k
# tcp_wrappers                       x86_64                  7.6-77.el7                             base                      78 k


# 3.设置开机启动
systemctl enable rpcbind nfs
# Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
# /etc/init.d/rpcbind start # deprecated
# /etc/init.d/nfs start     # deprecated
# Starting NFS services:                                     [  OK  ]
# Starting NFS quotas:                                       [  OK  ]
# Starting NFS mountd:                                       [  OK  ]
# Starting NFS daemon:                                       [  OK  ]
# Starting RPC idmapd:                                       [  OK  ]


# 4.设置共享目录以及读写权限可以添加多台主机
# 创卷NFS共享目录
mkdir -p /nfs/{data,share,backdata,upload,demo}
# 共享目录所属者与组设置
chown -R nfsnobody.nfsnobody /nfs/share 
# 文件 exports NFS 共享目录以及访问权限设置格式。
$vi /etc/exports
/nfs/data   192.168.1.0/255.255.255.0(rw,sync,root_squash,anonuid=500,anongid=500,insecure)
/nfs/share  192.168.8.0/24(rw,sync)
/nfs/backdata  192.168.8.7(rw) 192.168.8.8(ro)
/nfs/backdata  192.168.8.*(rw) 192.168.10.*(ro)
/nfs/upload    192.168.8.0/24(rw,all_squash,anonuid=1001,anongid=1001)  
/nfs/demo      192.168.8.0/24(ro) *(ro,all_squash)


# 5.nfs server服务开启
# 开启前查看rpc信息
$rpcinfo -p
# 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
$systemctl start rpcbind
$systemctl start nfs
# 确认NFS服务器启动成功(只贴入新增部分)
$rpcinfo -p
#  100024    1   udp  39651  status
#     100024    1   tcp  40171  status
#     100005    1   udp  20048  mountd
#     100005    1   tcp  20048  mountd
#     100005    2   udp  20048  mountd
#     100005    2   tcp  20048  mountd
#     100005    3   udp  20048  mountd
#     100005    3   tcp  20048  mountd
#     100003    3   tcp   2049  nfs
#     100003    4   tcp   2049  nfs
#     100227    3   tcp   2049  nfs_acl
#     100003    3   udp   2049  nfs
#     100227    3   udp   2049  nfs_acl
#     100021    1   udp  38221  nlockmgr
#     100021    3   udp  38221  nlockmgr
#     100021    4   udp  38221  nlockmgr
#     100021    1   tcp  45789  nlockmgr
#     100021    3   tcp  45789  nlockmgr
#     100021    4   tcp  45789  nlockmgr


# 6.修改配置文件后立即生效/etc/exports
exportfs -av 


# 7.CentOS7.8防火墙相关配置(正式环境请看下面的安全配置)
测试设置如下
# firewall-cmd --permanent --zone=public --add-service=nfs
# firewall-cmd --permanent --zone=public --add-service=mountd
# firewall-cmd --permanent --zone=public --add-service=rpc-bind
# firewall-cmd --reload


# 8.查看nfs共享目录信息
$showmount -e
Export list for k8s-yum-server:
/nfs/share *

Client 端配置 描述:客户端主要针对Linux与Windows等环境下进行相应的配置;

Linux :使用linux连接到nfs服务器的共享目录

代码语言:javascript
复制
# (1) NFS客户端安装
yum install nfs-utils -y

# (2) 使用mount命令直接挂载
mkdir -p /mnt/nfs/share nfs
mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024 EXPORT_MACHINE:/EXPORTED_DIR /DIR
mount –t nfs 10.10.107.201:/data /mnt/nfs/share

# (3) 方式将挂载配置写入到/etc/fstab中(值得学习)
10.10.107.201:/nfs/share /mnt/nfs/share nfs defaults 0 0
mount -a # 重新挂载所有设备

# (4) 查看客户端挂载信息
df -h | grep "nfs"
10.10.107.201:/nfs/share   46G  6.8G   39G   16% /mnt/nfs/share

# (5) Linux/windows相同取消挂载使用
umount /mnt

Windows: 可以直接添加Window功能:

代码语言:javascript
复制
# (1) 建立一个777的共享目录(注意权限貌似windwos上必须要x权限)
$ chmod 777 /data/  #方式1
$ chmod o+w /data/  #方式2

# (2)使用windows连接linux上面的NFS服务进行共享数据:
telnet 192.168.1.169 111 
telnet 192.168.1.169 2049

# (3)windows功能中安装NFS客户户端,安装完成后会有mount命令
mount  #查看挂载情况
mount -h #挂载帮助

# (4) 查看nfs挂载的目录(windows与linux相同)
showmount -e 10.10.107.21  #显示指定NFS服务器上的共享目录列表(或者叫输出列表) 
# 导出列表在 10.10.107.221:
# /nfs/share 10.10.107.0/255.255.255.0

# (5)查看已被挂载的客户端信息
[root@Security-221 data]# showmount -a
All mount points on Security-221:
10.10.107.112:/data

# (6) 挂载nfs目录:mount \\NFS的IP地址或者主机名\nfs目录名 挂载点
mount \\10.10.107.221\data x:
x: 现已成功连接到 \\10.10.107.221\data
命令已成功完成。

# (7) 取消挂载:umount 挂载目录
umount x:
正在断开                x:      \\10.10.107.221\data
命令已成功完成。

WeiyiGeek.windows安装NFS客户端

从Windows中实现文件上传的NFS中(重点:注意事项):

方式1:就是将共享文件的权限设置为777,但是这样是极不安全的

WeiyiGeek.Windwos连接NFS客户端

方式2:修改win7对nfs分区只读属性 Win7 NFS客户端使用mount命令挂载NFS服务之后,文件系统对Win7只读,无法写入文件,无法新建文件夹,此时使用mount命令可以查看到如下状态:

代码语言:javascript
复制
本地    远程                                 属性
-------------------------------------------------------------------------------
x:       \\10.10.107.221\data                   UID=-2, GID=-2
                                                rsize=32768, wsize=32768
                                                mount=soft, timeout=1.6
                                                retry=1, locking=no
                                                fileaccess=755, lang=GB2312-80
                                                casesensitive=no
                                                sec=sys
#UID=-2由于在存储设备上共享出来的NFS文件系统归属于root权限,并且无法修改该所属用户,而Windows通过UID=-2的用户去写,肯定写不进去。
解决办法: 让Win7在挂载NFS的时候将UID和GID改成0即可
打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default
增加两项:AnonymousUid,AnonymousGid

# PowerShell
New-ItemProperty "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" -Name AnonymousUid -value 0 -propertyType dword
New-ItemProperty "HKLM:\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default" -Name AnonymousGid -value 0 -propertyType dword

WeiyiGeek.register

(2) Ubuntu 系统

测试环境:

代码语言:javascript
复制
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"

NFS Server/Client 适用系统:Debian/Ubuntu

代码语言:javascript
复制
# Step1.服务端、客户端安装
# - Install Required Packages(Server)
$apt-get update
$apt-get install nfs-kernel-server rpcbind

# - Client Side SetUp (Client端)
$apt-get install nfs-common rpcbind


# Step2.Configure NFS privilege
​# rpcbind 配置文件
$nano /etc/default/rpcbind
OPTIONS=""

# 设置允许连接的ip
nano /etc/hosts.allow
portmap: 192.168.1.0/24    #Example Allow 192.168.1.0/24 to be Accessed on Network

# Configure idmapd
$nano /etc/default/nfs-common
NEED_IDMAPD=YES  
STATDOPTS="--port 30004"

# 配置mountd服务端口为30005:
$nano /etc/default/nfs-kernel-server
RPCMOUNTDOPTS="--manage-gids --port 30005"

# 映射的用户与组
$nano /etc/idmapd.conf
[General]
Verbosity = 0
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
Domain = localdomain

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup


$nano /etc/exports
/nfs/share 192.168.1.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check)
/storage *(rw,sync,no_root_squash,no_subtree_check)

# Step3、配置共享目录
mkdir -p /nfs/share

# Step4、启动RPC服务于nfs共享服务
systemctl enable rpcbind nfs-server.service
# 启动
/etc/init.d/nfs-kernel-server start
/etc/init.d/rpcbind start
systemctl start rpcbind nfs-server.service
# 停止
/etc/init.d/nfs-kernel-server stop
/etc/init.d/rpcbind stop
systemctl stop rpcbind nfs-server.service
# 更新 (nano /etc/exports)
exportfs -a

# Step5、客户端挂载情况
# NFS默认是用UDP协议,换成TCP协议挂载即可(网络不稳定)情况下
mount -t nfs 11.11.165.115:/tmp/test0920   /data  -o proto=tcp -o nolock

$mount -l
10.10.107.201:/nfs/share on /mnt/nfs/share type nfs4 (rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.20.172.241,local_lock=none,addr=10.10.107.201)

# Step6、卸载挂载点
umount /nfs/share
# 如果卸载不掉可以强制卸载挂载点
fuser -km /nfs/share  先使用这条命令

# Step7、防火墙规则配置 (PS: 通过rpcinfo命令可以查看 NFS 相关的端口)
ufw allow 111,2049,30005/tcp
ufw reload

Tips: 在设置防火墙时需注意 2049 和 111 端口是固定端口,而 mountd 和 nlockmgr 对应的端口是随机分配的,我看可以通过上述配置将其设置为固定端口。

(3) Windows 安装

Windos Server 2008 NFS 服务安装使用参考地址: https://www.cnblogs.com/sttchengfei/p/13542132.html

下面列出Windows中mount关于nfs相关的参数:

代码语言:javascript
复制
-a:把/etc/fstab中列出的路径全部挂载。
-t:需要mount的类型,如nfs等。
-r:将mount的路径定为read only。
-v mount:过程的每一个操作都有message传回到屏幕上。
rsize=n:在NFS服务器读取文件时NFS使用的字节数,默认值是4096个字节。
wsize=n:向NFS服务器写文件时NFS使用的字节数,默认值是4096个字节。
timeo=n:从超时后到第1次重新传送占用的1/7秒的数目,默认值是7/7秒。
retry=n:在放弃后台mount操作之前可以尝试的次数,默认值是7 000次。
soft:使用软挂载的方式挂载系统,若Client的请求得不到回应,则重新请求并传回错误信息。
hard:使用硬挂载的方式挂载系统,该值是默认值,重复请求直到NFS服务器回应。
intr:允许NFS中断文件操作和向调用它的程序返回值,默认不允许文件操作被中断。
fg:一直在提示符下执行重复挂载。
bg:如果第1次挂载文件系统失败,继续在后台尝试执行挂载,默认值是失败后不在后台处理。
tcp:对文件系统的挂载使用TCP,而不是默认的UDP。3

Q: soft和hard模式的作用以及异同?

描述: 其主要作用是当nfs的服务器端出现异常的时候,linux服务器的底层有重发机制,nfs客户端一直去向服务器端请求,判断服务器是否正常从而会一直阻塞。 (1) 当采用hard模式,服务器端出现异常,则客户端会一直发请求,直到服务器正常。 (2) 当用soft模式,服务器端出现异常,则客户端会按照timeo和retry参数进行超时和重试。例如mount -t nfs -o rw,soft,timeo=30,retry=3 192.168.1.2:/home/nfs /mnt/local_path即每隔3s向服务端发起请求,如果三次请求后还是返回错误则停止请求。

(4) Docker 安装

描述: 本文针对如下情况,描述尝试的方案:

  • 多个镜像均需挂载的目录,进行存储数据;
  • 想只申请一份挂载的存储空间,想建立其子目录以适应不同的镜像挂载;
  • 在k8s云平台中,又限制只能直接挂载PVC存储,不能对PVC下的子目录进行挂载
  • 当前无可用的公共NAS或NFS的挂载点

因此,需要启动一个docker容器,用来运行NFS服务器,将同一个PVC的存储分别映射出不同的子目录供不同镜像挂载,以实现:对于镜像来说,可直接挂载自己的目录,不会对其它目录造成影响,其容器内部目录结构也不需要做任何改变。

Tips : 本文使用的镜像为 itsthenetwork/nfs-server-alpine:latest,Steven Iveson的一个方便的NFS服务器映像,仅包含Alpine Linux和NFS v4,通过端口2049上的TCP。 参考地址: https://hub.docker.com/r/itsthenetwork/nfs-server-alpine

操作实践:

代码语言:javascript
复制
# 1.NFS服务器端单挂载点搭建
docker run -d --name nfs -h nfsserver --privileged -v /some/where/fileshare:/nfsshare \
-e SHARED_DIRECTORY=/nfsshare \
-p 2049:2049 \
-e PERMITTED="192.168.10.*" \
itsthenetwork/nfs-server-alpine:12
  # -p 为容器映射出来主机的端口2049;
  # -h 表示为本容器设定一个主机名,这样在其他容器中可使用主机名的方式访问(有可能容器在重启后其IP会变化);
  # -e 为设置本容器的环境变更,表示本容器对外提供的根为【/】的挂载点。
  -e READ_ONLY # will cause the exports file to contain ro instead of rw, allowing only read access by clients.
  -e SYNC=true # will cause the exports file to contain sync instead of async, enabling synchronous mode. Check the exports man page for more information.
  -e PERMITTED="10.11.99.*" # will permit only hosts with an IP address starting 10.11.99 to mount the file share.


# 2.NFS服务器端多挂载点搭建
docker run -d --name nfs-server --privileged -v /some/where/fileshare:/nfsshare -v /some/where/else:/nfsshare/another -e SHARED_DIRECTORY=/nfsshare -e SHARED_DIRECTORY_2=/nfsshare/another itsthenetwork/nfs-server-alpine:12
# 但您需要再 nfsd.sh 文件中加入额外的参数
if [ ! -z "${SHARED_DIRECTORY_2}" ]; then
  echo "Writing SHARED_DIRECTORY_2 to /etc/exports file"
  echo "{{SHARED_DIRECTORY_2}} {{PERMITTED}}({{READ_ONLY}},{{SYNC}},no_subtree_check,no_auth_nlm,insecure,no_root_squash)" >> /etc/exports
  /bin/sed -i "s@{{SHARED_DIRECTORY_2}}@${SHARED_DIRECTORY_2}@g" /etc/exports
fi

# 3.客户端容器连接
docker run -it --name nfs_client --privileged  \
--link nfs_server:nfs-server  \
alpine:latest /bin/sh

# 4.客户端连接
sudo mount -v 10.11.12.101:/ /app/weiyigeek
sudo mount -v 10.11.12.101:/another /mnt/weiyigeek

Tips : 镜像中的 /etc/exports 文件包含以下nfs共享目录配置*(rw,fsid=0,async,no_subtree_check,no_auth_nlm,insecure,no_root_squash)

补充 【2022年6月13日 22:13:50】

方式1.docker-compose.yml

代码语言:javascript
复制
tee docker-compose.yml <<'EOF'
version: "2.1"
services:
  # https://hub.docker.com/r/itsthenetwork/nfs-server-alpine
  nfs:
    image: itsthenetwork/nfs-server-alpine:12
    container_name: nfs
    restart: unless-stopped
    privileged: true
    environment:
      - SHARED_DIRECTORY=/data
    volumes:
      - /app/storage/nfs:/data
    ports:
      - 2049:2049
EOF
# 为了测试我们的 NFS 服务器,让我们将 NFS 客户端安装到主机上:
$ sudo apt install nfs-client

# 现在,让我们将 NFS 挂载挂载到本地路径 /mnt
$ sudo mount -v -o vers=4,loud 192.168.0.4:/ /mnt

方式2

代码语言:javascript
复制
# 载入模块 nfs 依赖模块
modprobe nfs
modprobe nfsd

$ docker run --privileged -d --name nfs \
-v /app/storage/nfs:/nfsshare \
-e NFS_EXPORT_0='/nfsshare  *(rw,sync,no_root_squash,no_all_squash,no_subtree_check,nohide,crossmnt)' \
-p 2049:2049   -p 2049:2049/udp   \
-p 111:111     -p 111:111/udp      \
-p 32765:32765 -p 32765:32765/udp  \
-p 32767:32767 -p 32767:32767/udp  \
erichough/nfs-server

$ showmount -e 10.20.176.101
Export list for 10.20.176.101:
/nfsshare *

0x02 NFS配置介绍

描述:在进行使用NFS我们需要对其进行配置,以下是是其主要的软件结构;

NFS主要软件结构

  • /etc/exports NFS的主要配置文件,在该文件中定义NFS输出的目录、权限等属性
  • /usr/sbin/exportfs 管理NFS共享资源的命令,在NFS的server端使用
  • /usr/sbin/showmount 查询NFS共享资源的命令,在client端使用
  • /var/lib/nfs/etab NFS的日志文件,记录了NFS共享出来的目录的完整权限设置值
  • /var/lib/nfs/xtab NFS连接信息的日志文件,记录了曾经链接到此NFS服务器的相关客户端的数据

exportfs 命令 - 维护导出的NFS文件系统的表 语法参数

代码语言:javascript
复制
# 语法
exportfs [-aruv]
/usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..]
/usr/sbin/exportfs -r [-v]
/usr/sbin/exportfs [-av] -u [client:/path ..]
/usr/sbin/exportfs [-v]
/usr/sbin/exportfs -f
/usr/sbin/exportfs -s

# 参数
-a:全部挂载或卸载
-r:重新挂载/etc/exports配置文件中的信息
-u:卸载某一目录
-v:将内容显示输出


# 常用实例
# 将添加/etc/exports中列出的所有目录和/etc/exports.下的/etc/exports.d 到/var/lib/nfs/etab
exportfs -av
# 修改配置文件后重新加载
exportfs -r

# 将/usr/tmp目录导出到django主机上,允许来自客户端的不安全的文件锁定请求:
exportfs -o insecure_locks django:/usr/tmp

# 取消导出/usr/tmp目录:
exportfs -u django:/usr/tmp

# 取消导出/etc/exports和/etc/exports.d下面文件中列出的所有导出 
exportfs -au

# 将/usr/tmp目录导出到IPv6链接-本地客户端:
exportfs [fe80::]/64:/usr/tmp

showmount 命令 - 显示NFS服务器的挂载信息 描述:showmount查询远程主机上的mount守护进程,以获取关于该机器上NFS服务器状态的信息。由于没有选项showmount列出了从该主机装载的nfs共享目录。showmount的输出被设计成好像是通过sort -u处理的。

基础语法:

代码语言:javascript
复制
# 语法
showmount [-ae] [hostname|IP]
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

# 参数
-a,--all         #以host:dir格式列出客户端主机名或IP地址和挂载的目录(一定可靠)
-d,--directories #仅列出某些客户端挂载的目录。
-e              #显示指定NFS服务器的共享资源情况
--no-headers    #输出不带标题栏 Suppress the descriptive headings from the output.

常用实例

代码语言:javascript
复制
# 1.查看NFS共享资源的情况
$showmount -e  # 默认本机
$showmount -e [127.0.0.1|192.168.1.12]
# Export list for WeiyiGeek:
# /mnt/nfs/k8slog 192.168.1.218,192.168.1.217,192.168.1.216
# /mnt/nfs/k8sapp 192.168.1.218,192.168.1.217,192.168.1.216

# 2.仅列出某些客户端挂载的目录。
$showmount -d
# Directories on WeiyiGeek:
# /mnt/nfs/k8sapp
# /mnt/nfs/k8slog


# 3.客户端挂载情况
All mount points on WeiyiGeek:
192.168.1.216:/mnt/nfs/k8sapp
192.168.1.216:/mnt/nfs/k8slog
192.168.1.218:/mnt/nfs/k8sapp
192.168.1.218:/mnt/nfs/k8slog

/etc/exports

该配置文件中的格式:<输出目录> [客户端1(权限)] [客户端2(权限)]

代码语言:javascript
复制
- 输出目录:指定共享的文件目录
- 客户端:指定可以访问共享资源的客户端
  * 指定IP的方式:192.168.1.1
  * 指定网段的方式:192.168.1.0/24或者192.168.1.0/255.255.255.0
  * 指定主机名的方式:node1,但是这个主机名必须在记录在/etc/hosts文件内,需要能解析到对应的ip
  * 通配符的方式:*表示所有的主机,*.bsmart.cn主机名通配
- 权限: 指该主机对nfs服务目录的相应权限(下面详解)

Q:如果我们在启动NFS服务之后又修改了 exports 文件的话怎么办,是不是需要重新启动NFS服务才能使的这些配置生效?

答案当然是否定的这样多麻烦我们有 exportfs 命令

权限说明:

代码语言:javascript
复制
# 帮助文档
man exportfs
# nosuid         # 选项是禁止 set-UID 程序
# noexec         # 选项是禁止直接执行其中的二进制文件

# 权限
rw             # 选项是指定权限读写
ro             # 选项是指定权限只读
sync           # 选项是指同步模式,内存中数据时时写入磁盘
async          # 选项是指不同步,把内存中数据定期写入磁盘中( 表示数据会先暂存于内存中,而非直接写入到硬盘中)
all_squash     # 选项是指定无论client用什么账户连接上来,都会被转换成匿名用户
no_all_squash  # 选项是指定无论client用什么账户连接上来,都不会被转换成匿名用户
root_squash    # 选项是指定如果client以root用户连接上来的话,server端会将该用户转换为匿名用户进行访问。
no_root_squash # 选项是指定客户端采用root连接将不转换成匿名用户进行访问
anonuid=<UID>  # 选项是指定匿名访问用户的本地用户UID,默认为nfsnobody(65534)
anongid=<GID>  # 选项是指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534)
secure(默认)  # 选项是指定限制客户端只能从小于1024的tcp/ip端口连接服务器
insecure       # 选项是指定允许客户端从大于1024的tcp/ip端口连接服务器
wdelay(默认)  # 选项是指定检查是否有相关的写操作,如果有则将这些写操作一起执行(提高效率)
no_wdelay       # 选项是指定若有写操作则立即执行,应与(sync)配合使用;
no_subtree_check      # 选项是指定即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,(提高效率);
subtree_check(默认)  # 选项是指定若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
hide                  # 在NFS共享目录中不共享其子目录 
no_hide               # 共享NFS目录的子目录,选项仅适用于NFSv2和NFSv3,当使用NFSv4时此选项不相关由于NFSv4从不隐藏下级文件系统。

crossmnt   # 该选项与nohide类似但它使客户机能够访问所有文件系统挂载在标记为crossmnt的文件系统上;因此当子文件系统“B”挂载在父文件系统“a”上时,在“a”上设置crossmnt与在B上设置“nohide”具有相似的效果。如果之前设置过,nocrossmnt选项可以明确地禁用crossmnt
nocrossmnt

fsid=num|root|uuid  #NFS需要能够标识它导出的每个文件系统,而通常它将为文件系统使用UUID(如果文件系统有这样的东西)或保存文件系统的设备的设备号(如果文件系统存储在设备上)。 由于不是所有文件系统都存储在设备上也不是所有文件系统都有uuid所以需要制定该选项显示的告诉; 对于NFSv4有一个特殊的文件系统,它是所有导出的文件系统的根,使用fsid=root或fsid=0指定的两者的意思完全相同。
# acl
# no_pnfs

# RPCSEC_GSS security 选项:您可以使用特殊的字符串“gss/krb5”,“gss/krb5i”,或“gss/krb5p”来限制访问客户端的rpcsec_gss安全,使用“sec=”导出选项:
sec=sys  #后面是一个以冒号分隔的安全样式列表,它限制了对使用这些样式的客户机的导出,可用的安全样式包含sys  (the  default--no  crypto‐ graphic  security),  krb5  (authentication only), krb5i (integrity protection), and krb5p (privacy protection)

示例说明:

代码语言:javascript
复制
# (1) 表示共享目录为/home/share 并 *.weiyigeek.top域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为weiyi、gid为app的用户 
/home/share/ .weiyigeek.top (ro,sync,all_squash,anonuid=weiyi,anongid=app)

# (2) 表示共享服务器 /root/share/ 目录只有192.168.1.2主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的nobody用户对该目录必须有写的权限) 
/root/share/ 192.168.1.2(rw,insecure,sync,all_squash)

/var/lib/nfs/etab

描述:exports配置文件中都有默认权限配置可通过etab文件查看,该文件中完整的记录了NFS共享资源的所有配置;

代码语言:javascript
复制
$cat /var/lib/nfs/etab
/nfs/share      *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

0x03 NFS安全配置

描述:在Linux系统中的文件都有访问权限,可以指定用户访问,那么我通过NFS访问文件权限是如何设定的呢?

比如我再NFS server上有一个文件的属主与属组都是weiyigeek,那我再client端普通用户weiyi访问这个文件,可以做修改吗?再比如如果是使用root用户访问这个文件,可以做修改吗?

NFS文件系统的权限访问的原则是:服务器端会以客户端的用户UID与GID等身份来尝试读取服务器端的文件系统

以下是NFS是如何判断是否一个文件可写的步骤:

  • 客户端以user1这个账户访问NFS目录,实际是以client端的user1的UID以及GID进行访问的
  • NFS server收到客户端访问请求中的UID、GID,并根据这个UID在server端所在的服务器找到相应的用户,以该用户的权限进行访问
  • 如果找不到对应UID的用户,则NFS server端会将连接的身份转换为匿名用户的连接
  • 根据/etc/exports配置文件判断该目录是否有写入权限只有在满足以下条件客户端才可以写入NFS是共享目录:
    • 1、用户有写入权限
    • 2、exports设置为有写入权限
    • 3、文件具有写入权限

根据上述步骤的话,可以想到一种情况,如果我client端是通过root账户连接的,那我是不是对所有的文件具有可读、可写权限;在exports文件中,设定权限的时候可以指定no_root_squash、root_squash、all_squash,这三个就是控制我client连接上来的用户,最终在server端会以哪个用户进行访问, 对应着共享目录的权限。

Tips: nfs匿名用户nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

NFS安全配置流程:

1.限制Client访问限制

代码语言:javascript
复制
## 1. 修改 /etc/hosts.allow 和 /etc /hosts.deny 来限制客户机数量。
$/etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0 : allow
portmap: 140.116.44.125 : allow

$/etc/hosts.deny
portmap: ALL : deny

## 2.设置哪些客户端可以访问共享目录(一定不能是 * 号 通配符)
$vi /etc/exports
/nfs/share 192.168.1.2(rw,no_root_squash) 192.168.1.3(rw,no_root_squash)

## 3.防火墙访问限制(RPC 111/NFS 2049)使其除了NFS Client端可以看到共享资源外其它都不行;
# 下面这种方式在正式环境是不行得(所有的IP都能够访问)
# firewall-cmd --permanent --zone=public --add-service=nfs
# firewall-cmd --permanent --zone=public --add-service=mountd
# firewall-cmd --permanent --zone=public --add-service=rpc-bind
# firewall-cmd --reload
# 正确的做法
firewall-cmd --add-rich-rule "rule family=ipv4 source address=192.168.1.2 service name='nfs' accept"
firewall-cmd --add-rich-rule "rule family=ipv4 source address=192.168.1.2 service name='mountd' accept"
firewall-cmd --add-rich-rule "rule family=ipv4 source address=192.168.1.2 service name='rpc-bind'accept"
# 或者由于rpc和nfs除了使用111和2049端口号外还会部分端口号是动态的下面可能行不通
# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.3  port port="111" protocol="tcp" accept'
# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.3  port port="26-1024" protocol="tcp" accept'
# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.3  port port="2049" protocol="tcp" accept'

# 对于iptables的社指定ip开放所有端口-iptables方式配置
iptables -A INPUT -s 192.168.1.2 -p all -j ACCEPT
service iptables save


## 4.防火墙不关闭,开放指定端口号
## 由于rpc和nfs除了使用111和2049端口号外,还会部分端口号是动态的,故需要先配置为静态端口
$vim /etc/sysconfig/nfs  #CentOS系统 末尾增加如下静态端口
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004


# firewall方式配置开放端口111,2049,30001,30002,30003,30004
firewall-cmd --zone=public --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp --add-port=30001/tcp --add-port=30001/udp --add-port=30002/tcp --add-port=30002/udp --add-port=30003/tcp --add-port=30003/udp --add-port=30004/tcp --add-port=30004/udp --permanent
firewall-cmd --reload

# iptables方式配置开放端口111,2049,30001,30002,30003,30004
iptables -I INPUT -s 192.168.1.101 -p tcp -m multiport --dports 111,2049,30001,30002,30003,30004 -m comment --comment "NFS服务" -j ACCEPT
service iptables save
systemctl restart iptables.service

2.共享的文件目录权限

代码语言:javascript
复制
## 1. 配置 nosuid 和 noexec
# SUID (Set User ID) 或 SGID (Set Group ID) 程序可以让普通用户以超过自己权限来执行。很多 SUID/SGID 可执行程序是必须的,但也可能被一些恶意的本地用户利用,获取本不应有的权限。
#尽量减少所有者是 root,或是在 root 组中却拥有 SUID/SGID 属性的文件。

#如禁止 set-UID 程序与直接执行其中的二进制文件在 NFS 服务器上运行,可以在 /etc/exports 加入一行
/www www.abc.com(rw, root_squash, nosuid, noexec)

3.密码认证

代码语言:javascript
复制
## NFS V2 / V3 版本
$useradd nfsuser -s /sbin/nologin  # 创建nfs认证用户
passwd nfsuser
$chown -R nfsuser:nfsuser /home/upload #建立的共享文件目录需要采用nfsuser共享用户权限
$cat /etc/passwd|grep nfs          # 查看用户的uid与guid
nfsuser:x:1001:1001::/home/nfsuser:/sbin/nologin
$vi /etc/exports
/home/upload  192.168.8.0/24(rw,all_squash,anonuid=1001,anongid=1001)  #设置NFS配置文件

## NFS V4 采用Gss/Kerberos进行认证(后续补充)
/srv/nfs4 gss/krb5(rw,sync,crossmnt,no_subtree_check)
mount.nfs4 192.168.1.2:/nfsdata /mnt/nfs #客户端

0x04 入坑出坑

问题1.当NFS服务器出现网络故障,造成NFS-Client使用df -h或其它命令一直卡着不动时,解决方法如下

代码语言:javascript
复制
$ umount -lf /data
$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   20G  1.2G   18G    6% /
devtmpfs                 907M     0  907M    0% /dev
tmpfs                    918M     0  918M    0% /dev/shm
tmpfs                    918M  9.0M  910M    1% /run
tmpfs                    918M     0  918M    0% /sys/fs/cgroup
/dev/sda1                497M  138M  359M   28% /boot
tmpfs                    184M     0  184M    0% /run/user/0

Tips:/data请手动打,不要使用Tab键自动补全,否则又会卡死

问题2.在mount.nfs挂载时显示 mount.nfs: requested NFS version or transport protocol is not supported 错误 错误信息:

代码语言:javascript
复制
[root@nfs-server ~]# mount -v 192.168.10.101:/ /disk101/
mount.nfs: timeout set for Wed May 26 19:16:27 2021
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: portmap query retrying: RPC: Program not registered
mount.nfs: prog 100003, trying vers=3, prot=17
mount.nfs: portmap query failed: RPC: Program not registered
mount.nfs: requested NFS version or transport protocol is not supported
mount.nfs: timeout set for Wed May 26 19:24:27 2021
mount.nfs: trying text-based options 'vers=4.1,addr=192.168.1.10,clientaddr=192.168.1.10'

错误原因:由于服务器端的nfs版本和客户端的nfs版本不同导致传输协议不被支持。

解决办法:

代码语言:javascript
复制
# - 1.查看版本信息看到NFS支持的版本信息。
$ nfsstat -s  # 服务端
$ nfsstat -c  # 客户端
  # Server rpc stats:
  # calls      badcalls   badclnt    badauth    xdrcall
  # 16         11449      0          11449      0

  # Server nfs v4:
  # null         compound
  # 16      100% 0         0%

  # Server nfs v4 operations:
  # op0-unused   op1-unused   op2-future   access       close        commit
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # create       delegpurge   delegreturn  getattr      getfh        link
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # lock         lockt        locku        lookup       lookup_root  nverify
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # open         openattr     open_conf    open_dgrd    putfh        putpubfh
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # putrootfh    read         readdir      readlink     remove       rename
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # renew        restorefh    savefh       secinfo      setattr      setcltid
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # setcltidconf verify       write        rellockowner bc_ctl       bind_conn
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence
  # 0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
  # set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp

$rpm -qa nfs-utils
nfs-utils-1.3.0-0.65.el7.x86_64

# - 2.在客户端挂载时指定nfs版本即可
mount -v -t nfs -o nfsvers=4.1 192.168.1.10:/ /weiyigeek
mount -v -t nfs -o nfsvers=3 
mount -v -t nfs -o nfsvers=2
mount -t nfs -o soft,intr,timeo=5 10.10.10.10:/share /home/share

# - 3.另外一种情况就是访问受限(检查防火墙或者exports文件允许的主机访问)
/etc/exports:
  # /rootfs *(rw,no_root_squash,sync,insecure)
/etc/hosts.allow:
  # portmap mountd nfsd statd lockd rquotad : 192.168.1.*, 192.168.2.*

问题3.部署OS过程中遇到共享服务器目录后,客户机无法写入共享目录的问题,最后定位出来是安全加固修改nfs的配置/etc/exports造成的 解决办法:

代码语言:javascript
复制
加固前:/share *(rw,async,no_root_squash,no_subtree_check)
加固后:/share *(ro,async,no_root_squash,no_subtree_check)

问题4.在mount.nfs挂载时显示 nfs环境搭建报错clnt_create: RPC: Program not registered 错误 问题描述: 在使用docker搭建nfs服务端后采用showmount -e ip 检测NFS服务端情况的时会出现clnt_create: RPC: Program not registered 问题原因: 此错误表示rpc程序为注册成功,但是nfs服务注册不存在。 解决办法:

代码语言:javascript
复制
# (1) 停止全部服务然后再依次启动服务
systemctl stop rpcbind nfs
# (2) 注意先启动RPC服务
/etc/init.d/rpcbind start
/etc/init.d/nfs start

问题5.NFS挂载时出现”access denied by server while mounting”

问题情况: 内部一个nfs服务端 2 个 nfs客户端 1个 挂载成功一个失败, 挂载时加了一个参数 -v 查看相关消息发现挂载成功的输出。

代码语言:javascript
复制
mount.nfs: timeout set for Tue Sep 24 18:19:05 2019
mount.nfs: trying text-based options 'vers=4.1,addr=10.116.52.23,clientaddr=10.116.52.21'
mount.nfs: mount(2): Permission denied
mount.nfs: trying text-based options 'vers=4.0,addr=10.116.52.23,clientaddr=10.116.52.21'
mount.nfs: mount(2): Permission denied

解决方式: 挂载时添加参数 -o vers=3.0

代码语言:javascript
复制
mount.nfs: timeout set for Tue Sep 24 18:19:05 2019
mount.nfs: trying text-based options 'addr=10.116.52.23'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 10.116.52.23 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 10.116.52.23 prog 100005 vers 3 prot UDP port 20048

问题6.使用Docker搭建镜像时报ERROR: nfs module is not loaded in the Docker host's kernel (try: modprobe nfs)错误解决方法

  • 错误问题:
代码语言:javascript
复制
----> kernel module nfs is missing
----> ERROR: nfs module is not loaded in the Docker host's kernel (try: modprobe nfs)
  • 解决方式: 加载 nfs 相关的内核模块。
代码语言:javascript
复制
# 临时生效
modprobe nfs
modprobe nfsd
# 永久生效
tee -a /etc/modules-load.d/modules.conf <<'EOF'
modprobe nfs
modprobe nfsd
EOF

0x05 参考连接

1.Kerberos+LDAP+NFSv4 实现单点登录(中): https://blog.51cto.com/13752418/2443823

2.挂载NFS文件系统

代码语言:javascript
复制
配置Linux ECS实例
1. 连接到ECS实例 (了解如何连接)
2. 在ECS实例上安装NFS客户端:
Ubuntu
sudo apt-get update && sudo apt-get install nfs-common
3.执行以下命令,提高同时发起的NFS请求数量:
sudo echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
sudo echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf

3.挂载NFS文件系统

代码语言:javascript
复制
1. 执行命令挂载NFS文件系统:
选择挂载点地址:
29ff549c8d-hjn7.cn-shenzhen.nas.aliyuncs.com
是否需要多台 ECS 同时编辑一个文件需要
sudo mount -t nfs -o vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 29ff549c8d-hjn7.cn-shenzhen.nas.aliyuncs.com:/ /mnt
2. 执行以下命令,如果结果中存在NFS文件系统的挂载地址,则说明挂载成功:
df -h | grep aliyun
3. 如果挂载失败,请参见挂载失败的排查与处理方法进行排查
4. 如果需要在ECS重启后自动挂载NFS文件系统,请参考自动挂载NFS文件系统进行配置
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言简述
  • 0x01 NFS安装配置
    • (1) CentOS 系统
      • (2) Ubuntu 系统
        • (3) Windows 安装
          • (4) Docker 安装
          • 0x02 NFS配置介绍
            • /etc/exports
              • /var/lib/nfs/etab
              • 0x03 NFS安全配置
              • 0x04 入坑出坑
              • 0x05 参考连接
              相关产品与服务
              云服务器
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档