[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服务时它会将其对应的端口号发送给客户端
,客户端根据获得的端口号进行连接。1 2 3 4 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 NFSv31 2 3 4 5 6 Example for NFSv2 and NFSv3: mount -t nfs 11.11.165.115:/data /tmp/data -o proto=tcp -o nolock
(2) NFSv4:1 2 3 4 5 Example for NFSv4: mount -t nfs4 192.168.78.1:/data /tmp/data
NFSv4和NFSv3的差别如下:
NFS 服务协议 描述:#对于不同的网络情况,有针对地选择 UDP 或 TCP 传输协议。传输协议可以自动选择,也可以手动设置。1 2 3 4 5 # 一般情况下,使用 TCP 的 NFS 比较稳定,使用 UDP 的 NFS 速度较快。 # 在机器较少,网络状况较好的情况下,使用 UDP 协议能带来较好的性能。 # 当机器较多,网络情况复杂时,推荐使用 TCP 协议(V2 只支持 UDP 协议)。 # 在局域网中使用 UDP 协议较好,因为局域网有比较稳定的网络保证,使用 UDP 可以带来更好的性能。 # 在广域网中推荐使用 TCP 协议,TCP 协议能让 NFS 在复杂的网络环境中保持最好的传输稳定性。
客户端连接NFS服务的过程:
1.客户端首先向NFS服务所在的服务器的RPC服务发起请求RPC服务的端口固定为 1111 2 3 4 5 6 7 8 9 10 11 12 $rpcinfo -p 192.168.1.216``` * 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端配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 $rpm -qa | grep nfsnfs-utils-1.2.3-54.el6.x86_64 nfs-utils-lib-1.1.5-9.el6.x86_64 $rpm -qa | grep rpcbindrpcbind-0.2.0-11.el6.x86_64 $yum install –y rpcbind nfs-utilssystemctl enable rpcbind nfs mkdir -p /nfs/{data,share,backdata,upload,demo} chown -R nfsnobody.nfsnobody /nfs/share $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) $rpcinfo -p$systemctl start rpcbind$systemctl start nfs$rpcinfo -pexportfs -av 测试设置如下 $showmount -eExport list for k8s-yum-server: /nfs/share *
Client 端配置 描述:客户端主要针对Linux与Windows等环境下进行相应的配置;
Linux :使用linux连接到nfs服务器的共享目录1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 yum install nfs-utils -y 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 10.10.107.201:/nfs/share /mnt/nfs/share nfs defaults 0 0 mount -a df -h | grep "nfs" 10.10.107.201:/nfs/share 46G 6.8G 39G 16% /mnt/nfs/share umount /mnt
扩展补充:
mkdir /nasdisk 命令行挂载:mount.nfs4 192.168.6.252:/nasdisk /nasdisk/
在 /etc/fstab 文件中挂载: 192.168.6.252:/nasdisk /nasdisk nfs4 rw,relatime,soft,vers=4.1,rsize=131072,wsize=131072,namlen=255,proto=tcp,timeo=60,retrans=2,sec=sys 0 0
Windows: 可以直接添加Window功能:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ chmod 777 /data/ $ chmod o+w /data/ telnet 192.168.1.169 111 telnet 192.168.1.169 2049 mount mount -h showmount -e 10.10.107.21 [root@Security-221 data] All mount points on Security-221: 10.10.107.112:/data mount \\10.10.107.221\data x: x: 现已成功连接到 \\10.10.107.221\data 命令已成功完成。 umount x: 正在断开 x: \\10.10.107.221\data 命令已成功完成。
weiyigeek.top-windows安装NFS客户端
从Windows中实现文件上传的NFS中(重点:注意事项
):
方式1:就是将共享文件的权限设置为777,但是这样是极不安全的
weiyigeek.top-Windwos连接NFS客户端
方式2:修改win7对nfs分区只读属性 Win7 NFS客户端使用mount命令挂载NFS服务之后,文件系统对Win7只读,无法写入文件,无法新建文件夹,此时使用mount命令可以查看到如下状态:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 本地 远程 属性 ------------------------------------------------------------------------------- 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 解决办法: 让Win7在挂载NFS的时候将UID和GID改成0即可 打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 增加两项:AnonymousUid,AnonymousGid 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.top-register
(2) Ubuntu 系统 测试环境:1 2 3 4 5 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/Ubuntu1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 $apt -get update$apt -get install nfs-kernel-server rpcbind$apt -get install nfs-common rpcbind $nano /etc/default/rpcbindOPTIONS="" nano /etc/hosts.allow portmap: 192.168.1.0/24 $nano /etc/default/nfs-commonNEED_IDMAPD=YES STATDOPTS="--port 30004" $nano /etc/default/nfs-kernel-serverRPCMOUNTDOPTS="--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) mkdir -p /nfs/share 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 exportfs -a mount -t nfs 11.11.165.115:/tmp/test0920 /data -o proto=tcp -o nolock $mount -l10.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) umount /nfs/share fuser -km /nfs/share 先使用这条命令 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相关的参数:1 2 3 4 5 6 7 8 9 10 11 12 13 14 -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
操作实践: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 -e READ_ONLY -e SYNC=true -e PERMITTED="10.11.99.*" 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 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 docker run -it --name nfs_client --privileged \ --link nfs_server:nfs-server \ alpine:latest /bin/sh 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 tee docker-compose.yml <<'EOF' version: "2.1" services: 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 $ sudo apt install nfs-client $ sudo mount -v -o vers=4,loud 192.168.0.4:/ /mnt
方式2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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文件系统的表 语法参数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 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:将内容显示输出 exportfs -av exportfs -r exportfs -o insecure_locks django:/usr/tmp exportfs -u django:/usr/tmp exportfs -au exportfs [fe80::]/64:/usr/tmp
showmount 命令 - 显示NFS服务器的挂载信息 描述:showmount查询远程主机上的mount守护进程,以获取关于该机器上NFS服务器状态的信息。由于没有选项showmount列出了从该主机装载的nfs共享目录。showmount的输出被设计成好像是通过sort -u处理的。
基础语法:1 2 3 4 5 6 7 8 9 showmount [-ae] [hostname|IP] showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ] -a,--all -d,--directories -e --no-headers
常用实例1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $showmount -e $showmount -e [127.0.0.1|192.168.1.12]$showmount -dAll 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(权限)]
1 2 3 4 5 6 7 - 输出目录:指定共享的文件目录 - 客户端:指定可以访问共享资源的客户端 * 指定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 命令
权限说明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 man exportfs rw ro sync async all_squash no_all_squash root_squash no_root_squash anonuid=<UID> anongid=<GID> secure(默认) insecure wdelay(默认) no_wdelay no_subtree_check subtree_check(默认) hide no_hide crossmnt nocrossmnt fsid=num|root|uuid sec=sys
示例说明: 1 2 3 4 5 /home/share/ .weiyigeek.top (ro,sync,all_squash,anonuid=weiyi,anongid=app) /root/share/ 192.168.1.2(rw,insecure,sync,all_squash)
/var/lib/nfs/etab 描述:exports配置文件中都有默认权限配置可通过etab文件查看,该文件中完整的记录了NFS共享资源的所有配置;1 2 $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访问限制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 $/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 $vi /etc/exports/nfs/share 192.168.1.2(rw,no_root_squash) 192.168.1.3(rw,no_root_squash) 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" iptables -A INPUT -s 192.168.1.2 -p all -j ACCEPT service iptables save $vim /etc/sysconfig/nfs RQUOTAD_PORT=30001 LOCKD_TCPPORT=30002 LOCKD_UDPPORT=30002 MOUNTD_PORT=30003 STATD_PORT=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 -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.共享的文件目录权限
1 2 3 4 5 6 /www www.abc.com(rw, root_squash, nosuid, noexec)
3.密码认证1 2 3 4 5 6 7 8 9 10 11 12 $useradd nfsuser -s /sbin/nologin passwd nfsuser $chown -R nfsuser:nfsuser /home/upload $cat /etc/passwd|grep nfs 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) /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或其它命令一直卡着不动时,解决方法如下 1 2 3 4 5 6 7 8 9 10 $ 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 错误 错误信息:1 2 3 4 5 6 7 8 9 [root@nfs-server ~] 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版本不同导致传输协议不被支持。 解决办法:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 $ nfsstat -s $ nfsstat -c $rpm -qa nfs-utilsnfs-utils-1.3.0-0.65.el7.x86_64 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 /etc/exports: /etc/hosts.allow:
问题3.部署OS过程中遇到共享服务器目录后,客户机无法写入共享目录的问题,最后定位出来是安全加固修改nfs的配置/etc/exports造成的 解决办法:1 2 加固前:/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服务注册不存在。 解决办法:1 2 3 4 5 systemctl stop rpcbind nfs /etc/init.d/rpcbind start /etc/init.d/nfs start
问题5.NFS挂载时出现”access denied by server while mounting”
问题情况: 内部一个nfs服务端 2 个 nfs客户端 1个 挂载成功一个失败, 挂载时加了一个参数 -v 查看相关消息发现挂载成功的输出。1 2 3 4 5 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
1 2 3 4 5 6 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)
错误解决方法
1 2 ----> kernel module nfs is missing ----> ERROR: nfs module is not loaded in the Docker host's kernel (try: modprobe nfs)
1 2 3 4 5 6 7 8 modprobe nfs modprobe nfsd tee -a /etc/modules-load.d/modules.conf <<'EOF' modprobe nfs modprobe nfsd EOF
问题7.挂载 nfs 服务器到主机时报 mount.nfs: Protocol not supported
错误解决
错误信息:mount.nfs: Protocol not supported
问题原因: 由于 Ubuntu 22.04 默认挂载nfs的版本为4,即默认参数 vers=4,而我们的nfs存储不支持 vers = 4,所以我们直接手动指定要挂载的版本即可。
解决办法:1 2 3 4 5 6 7 8 9 mount -t nfs -o nolock,nfsvers=3 nfs.weiyigeek.top:/storage/ /app/storage $ vim /etc/fstab nfs.weiyigeek.top:/vol/ /app/vol nfs vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 0 0 nfs.weiyigeek.top:/storage/ /app/storage nfs rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.4.94,mountvers=3,mountport=892,mountproto=udp,local_lock=all 0 0 $ mount -a
0x05 参考连接
1.Kerberos+LDAP+NFSv4 实现单点登录(中): https://blog.51cto.com/13752418/2443823
2.挂载NFS文件系统
1 2 3 4 5 6 7 8 配置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文件系统
1 2 3 4 5 6 7 8 9 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文件系统进行配置