本文汇总了文件存储NAS挂载访问的常见问题。

如何在Linux系统中创建NAS子目录并完成挂载?

请确保您已挂载文件系统,详情请参见Linux系统挂载NFS文件系统

假设挂载时,将NAS的根目录挂载到ECS Linux的/mnt目录上。挂载成功后,/mnt相当于NAS的根目录,您可以在/mnt目录下创建NAS子目录。

  1. 在ECS Linux上,创建NAS子目录。
    mkdir /mnt/subdir
  2. 创建用于挂载NAS的本地目录。
    mkdir /tmp/mnt
    说明 服务器中的一个本地目录只能挂载一个文件系统。您可以创建多个本地目录用于挂载文件系统。
  3. 重新挂载文件系统。
    sudo mount -t nfs -o vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-id.region.nas.aliyuncs.com:/subdir /tmp/mnt
    重要字段说明如下所示,请根据实际情况替换。
    • file-system-id.region.nas.aliyuncs.com:表示挂载点地址。您可以在NAS控制台上,找到目标文件系统,单击管理,进入详情页面获取挂载点。
    • /subdir:表示NAS子目录。
    • /tmp/mnt:表示服务器的本地目录。

如何解决误删挂载点导致的服务器(Linux)异常问题?

  • 现象描述

    在Linux系统中通过挂载点A挂载文件系统,在未卸载的情况下,在NAS控制台上删除了挂载点A,导致Linux系统出现异常问题(执行命令卡顿无响应)。

  • 解决方案
    1. 在服务器(如ECS Linux)中,按Ctrl+C,中断命令的执行。
    2. 执行mount命令,查看挂载信息。
      通过挂载信息,获取挂载地址,如/mnt/data查看挂载信息
    3. 执行umount -f /mnt/data强制卸载文件系统。
      命令格式:umount -f <挂载地址>
      说明 如果执行umount -f <挂载地址>命令未解决问题,您也可以执行umount -l <挂载地址>命令。
      卸载完成后,您可以重新创建挂载点,挂载文件系统。

如何避免NFS 4.0监听端口被误认为木马?

  • 问题现象

    使用NFS 4.0挂载NAS文件系统后,有一个0.0.0.0的随机端口被监听,并且无法通过netstat定位该监听端口的进程。

    由于端口不固定,并且无法确定监听的程序,很容易被误判为受到木马攻击。

  • 问题原因

    此随机端口是NFS 4.0为了支持Callback而监听的。因为内核参数fs.nfs.nfs_callback_tcpport默认是0,所以NFS 4.0客户端会随机挑选一个端口进行监听,而随机端口本身并不会带来安全风险。

    不过为了更方便地管理端口,您可以选择使用以下方法固定该Callback端口。

  • 解决方案
    在挂载文件系统之前,您可以通过配置参数fs.nfs.nfs_callback_tcpport到一个非零的确定值,以固定该端口。
    sudo sysctl fs.nfs.nfs_callback_tcpport=<port>          

    在以下示例中,将fs.nfs.nfs_callback_tcpport手动配置到端口45450,并使用NFS 4.0挂载文件系统之后,netstat显示被监听的端口就是手动配置的45450(请注意以下示例中使用的是root用户,所以不需要使用sudo执行sysctl命令)。

如何检查并解决Windows挂载SMB文件系统的报错?

  1. 系统错误53
    • 错误描述

      找不到网络路径。

    • 主要原因
      • 网络未连通。
      • TCP/IP NetBIOS Helper服务未启动。
      • 注册表未正确配置LanmanWorkstation。
    • 解决方法

      请根据如下步骤进行排查。

      1. 使用ping命令检查挂载点地址是否可连通,延时是否正常。

        ping <挂载点地址>

        • 若网络ping通,则执行步骤b。
        • 若网络ping不通,请从以下方面排查。
          • 确认挂载命令正确,无多余或缺少/\、空格及myshare等内容。
            正确挂载SMB文件系统的命令格式:
            net use <挂载目标盘符> \\<挂载点地址>\myshare
            示例:
            net use z: \\xxxx.cn-hangzhou.nas.aliyuncs.com\myshare 
          • 确认文件系统类型为SMB。
          • 确认挂载点地址填写正确。
          • 确认客户端所在的ECS与挂载点在同一个VPC中。
          • 确认跨VPC或通过VPN连入的客户端,网络配置正确。
      2. 使用telnet命令检查SMB服务是否可用。

        telnet <挂载点地址> 445

      3. 确认是否已启动TCP/IP NetBIOS Helper服务,具体操作请参见Windows系统挂载SMB文件系统
      4. 检查注册表。
        打开注册表,确认HKEY_LOCAL_MACHINE > System > CurrentControlSet > Control > NetworkProvider > OrderProviderOrder的值已包括LanmanWorkstation。如果没有,请添加。检查注册表
  2. 系统错误58
    • 错误描述

      指定的服务器无法运行请求的操作。

    • 主要原因

      客户端SMB协议版本支持不兼容。

    • 解决方法

      请确认Windows系统版本为Windows 2008 R2及以上版本(不包括Windows 2008)。

  3. 系统错误64
    • 错误描述

      指定的网络名不可用。

    • 主要原因
      • NAS权限组未允许目标ECS访问。
      • NAS权限组未正确配置目标ECS的内网IP地址或VPC IP地址。
      • 服务欠费。
      • 选择经典网络进行挂载时,ECS和NAS不属于同一阿里云UID。
      • 文件系统类型不是SMB。
    • 解决方法
      无权访问NAS文件系统资源,请从以下方面进行排查。
      1. 确认文件系统挂载点权限组已包含该机器的内网IP/VPC IP。
      2. 确认阿里云UID未欠费。
      3. 确认经典网络挂载时,ECS和NAS属于同一个阿里云UID。
      4. 确认文件系统类型为SMB。系统错误 64
  4. 系统错误67
    • 错误描述

      找不到网络名。

    • 主要原因

      关键的网络服务未启动。

    • 解决方法
      启动如下服务,具体操作可参见Windows系统挂载SMB文件系统
      1. 启用Workstation服务。
      2. 启用TCP/IP NetBIOS Helper服务。
  5. 系统错误85
    • 错误描述

      本地设备名已在使用中。

    • 主要原因

      目标盘符已被占用。

    • 解决方法

      请更换目标盘符重新挂载文件系统。

  6. 系统错误1231
    • 错误描述

      无法连接网络位置。

    • 主要原因
      • 系统未安装或未启用Microsoft网络客户端。
      • 系统未安装或未启用Microsoft网络的文件和打印机共享。
    • 解决方法

      安装并启用Microsoft网络客户端或Microsoft网络的文件和打印机共享。

      如果已安装但未启用Microsoft网络客户端或Microsoft网络的文件和打印机共享,请选中对应的选项。

      系统错误1231

      可以通过以下方式安装并开启对应的选项。

      1. 打开网络与共享中心,单击主机所连网络。
      2. 单击属性
      3. 无线网络连接属性对话框中,单击安装
        • 安装Microsoft网络客户端。
          1. 选择网络功能类型对话框中,选择客户端,单击添加
          2. 选择Client for Microsoft Networks,单击确定
        • 安装Microsoft网络的文件和打印机共享。
          1. 选择网络功能类型对话框中,选择服务,单击添加
          2. 选择Microsoft > File and Printer Sharing for Microsoft,单击确定
  7. 系统错误1272
    • 错误描述

      系统提示:不能访问此共享文件夹,因为您组织的安全策略阻止未经身份验证的来宾访问。这些策略可帮助保护您的电脑免受网络上不安全设备或恶意设备的威胁。

    • 主要原因

      Windows系统因安全策略阻挡了以来宾访问权限(Guest Auth)访问SMB文件系统的用户。

    • 解决方法
      若您的系统为Windows Server 2016之后版本(不包括WindowsServer 2016),请修改以下注册表项允许来宾访问权限(Guest Auth)。
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
      "AllowInsecureGuestAuth"=dword:1
      具体解决方案请参见Guest access in SMB2 disabled by default in Windows

为什么Windows 2016以后的版本不支持挂载SMB文件系统?

  • 问题现象

    命令及错误提示:

    C:\Users\Administrator>net use z: \\xxxxx-xxxx.xxxxx.nas.aliyuncs.com\myshare
    System error 1272 has occurred.
    You can't access this shared folder because your organization's security policies block unauthenticated guest access. These policies help protect your PC from unsafe or malicious devices on the network.
  • 解决方案:

    造成以上问题的原因是Windows Server的这个版本的安全特性默认不支持Guest用户访问远程共享目录。

    解决方法如下:

    • 修改注册表:
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
      "AllowInsecureGuestAuth"=dword:0

      修改为:

      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]
      "AllowInsecureGuestAuth"=dword:1
    • 切换到Powershell,执行以下命令:
      New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force

    具体解决方案请参见Guest access in SMB2 disabled by default in Windows 10, Windows Server 2016 version 1709, and Windows Server 2019

为什么SMB文件系统挂载有时候连接不上?

  • 问题现象:

    当您混用NFS和SMB文件系统,导致第一次通过net use挂载NFS文件系统连接失败后,挂载正确的SMB文件系统也会出现问题。

  • 解决方案:

    检查确保挂载正确的文件系统后,暂时停止挂载,5分钟后再次挂载。如果还失败,请您提交工单

为什么Administrator能看见挂载的SMB目录,其他用户看不到?

造成以上原因是由于Windows下的用户账户隔离机制引起的。

要实现多用户的共享,需要创建一个目录链接。比如C盘下创建一个myshare,命令如下:
mklink /D C:\myshare \\xxxxxxx-xxxx.cn-beijing.nas.aliyuncs.com\myshare\

为什么Windows Server 2016 IIS无法加载SMB volume文件?

如果遇到Windows Server 2016的IIS无法加载SMB文件系统的问题,详情请参见:安装和配置AD域

如何检查并解决IIS服务在阿里云NAS上的使用问题?

如果遇到Windows 2016 挂载SMB失败,HTTP错误500.19,错误码0x8007003a等类似报错。解决办法请参见:IIS服务在阿里云NAS上的最佳实践

阿里云NAS是否支持NFS和SMB同时挂载一个文件系统?

不支持,不能以NFS和SMB同时挂载同一个文件系统。

我们建议不要使用Linux作为客户端访问SMB,因为存在一些操作上的问题。比如支持的字符集、文件名的长度(Windows支持255宽字符,Linux支持255 UTF8字节)等等。

但用户如果确实需要的话,可以在支持SMB2及以上的kernel上挂载。

挂载命令: mount -t cifs -o vers=2.0 \\挂载点\myshare /mnt 或者 mount -t cifs -o vers=2.0 //挂载点/myshare /mnt 。如果弹出需要密码,直接回车就可以。

确认Kernel是否支持CIFS挂载:在/boot下,检查CONFIG_CIFS的配置,y或m表示支持。

说明
  • 执行以上命令前需要安装cifs-utils。以CentOS操作系统为例,执行如下安装命令:
    yum install samba-client samba-common cifs-utils
  • 如果遇到一些Linux系统对CIFS支持方面的问题,建议升级kernel到3.10.0-514及以上版本。

为什么Linux无法挂载SMB文件系统?

通常有以下原因:
  • 使用了低版本或者不兼容的Linux操作系统版本,SMB文件系统支持如下的Linux分发版本。
    • CentOS 7.6 64bit(3.10.0-957.5.1.el7.x86_64)
    • Ubuntu 18.04 64bit(4.15.0-48-generic)
    • Debian 9.9 64bit(4.9.0-9-amd64)
    • Suse Enterprise Server 12 SP2 64bit(4.4.74-92.35-default)
    • OpenSUSE 42.3 64bit(4.4.90-28-default)
    • Aliyun Linux(4.19.34-11.al7.x86_64)
    • CoreOS(4.19.43-coreos VersionID=2079.4.0)
  • 客户端上未安装CIFS挂载工具(cifs-utils)或者mount.cifs不在PATH指定的命令搜寻目录中。
  • 云服务器ECS(Linux)和SMB文件系统的网络不通。
    • 云服务器ECS(Linux)和SMB文件系统不属于同一个阿里云用户。
    • 云服务器ECS(Linux)和SMB文件系统不在同一个阿里云地域(Region)。
    • 云服务器ECS(Linux)和SMB文件系统不处于可连通的网络(VPC或经典网络)中。
      说明 NAS支持本地挂载,如果Linux客户端在用户IDC中,可能是该IDC和SMB文件系统所处的网络(VPC或经典网络)没有通过阿里云高速通道连接成功。
    • SMB文件系统的白名单设置不允许云服务器ECS(Linux)连接。
    • 云服务器ECS(Linux)防火墙设置为不允许访问SMB文件系统的IP地址或445端口。
    • 云服务器ECS(Linux)试图通过不受支持的TCP端口连接,现在SMB只支持445端口。
    说明

    您可以通过ping <VolumeDomainName>telnet <VolumeDomainName> 445检查连通性。

    如果端口445未打开,请在目标ECS实例的安全组中添加关于端口445的安全组规则,详情请参见添加安全组规则

  • 云服务器ECS(Linux)管理员没有root权限或者没有被设置为有mount命令的sudo权限。
  • 挂载时使用的文件系统类型不是CIFS。
  • 挂载时使用的vers选项不是2.0。
  • 挂载时没有指定Guest方式挂载。
  • 挂载时指定的UID、GID、dir_mode或者file_mode不正确。
  • 挂载的目标目录的SELINUX设置不正确。
  • 云服务器ECS(Linux)挂载连接数太多,超过了单文件系统挂载上限(1000个),在容器场景较容易出现。
解决方案:
  1. 自行排查上述可能原因,详情请参见Linux系统挂载SMB文件系统
  2. 检查/var/log/messages和dmesg输出,进行排查。
  3. 提交工单,联系阿里云NAS团队协助排查。

    同时请提供Linux版本信息、具体挂载命令、/var/log/messages和dmesg输出。

如何解决Linux挂载SMB文件系统性能不佳?

如果SMB文件系统性能不佳,您可以从以下方面进行排查。

  • 原因1:SMB单个文件系统的吞吐能力与存储量是相联系的。单文件系统的吞吐(读+写)上限与当前存储量呈线性关系。

    解决方案:使用fio工具来测试SMB文件系统性能,详情请参见NAS性能测试

  • 原因2:云服务器ECS(Linux)的单机网络带宽较小。

    解决方案:使用多个云服务器ECS(Linux)达到文件系统的总体预期性能。

  • 原因3:禁用了SMB文件系统的客户端缓存。

    解决方案:在挂载SMB文件系统时,cache=none表示禁用缓存,默认或者cache=strict表示使用缓存;您可以通过sudo mount | grep cifs命令检查所用的选项是否正确。

  • 原因4:没有设置合适的SMB客户端的I/O大小。

    解决方案:根据业务需求调整rsize/wsize,默认值:1048576。

  • 原因5:云服务器ECS(Linux)的CPU或内存的规格过低,或被其它业务占用过多。

    解决方案:选择合适的云服务器ECS(Linux)规格、检查系统其它应用资源,确保系统满足CPU和内存要求。您可以通过top命令检查系统CPU、MEM使用情况。

  • 原因6:挂载时使用了atime选项。

    解决方案:如果您的业务不是对文件的访问时间(atime)极为敏感请不要在挂载时使用atime选项。

  • 原因7:遇到大量小文件频繁读、少量写但需要写时通知的WebServer场景。

    解决方案:您可以在客户端配置该WebServer(如Apache)产品特定的缓存机制或者联系阿里云NAS团队开通WebServer场景加速功能。

为什么Linux挂载SMB文件系统迁移和复制文件时速度缓慢?

如果已经排除了文件系统本身的性能问题,则可能原因是您没有使用并发式迁移或复制文件。您可以通过以下开源工具进行迁移或复制。

  • GNU Parallel

    根据系统资源,选择合适的线程数。示例:find * -type | parallel --will-cite -j 10 cp {} /mnt/smb/ &

  • Fpart
  • Fpsync
  • multi

Linux访问SMB文件系统时,报Permission denied,该怎么解决?

原因:Linux管理员在挂载时使用了不正确的UID、GID、file_mode、dir_mode。

解决方案:检查是否正确设置了UID、GID、file_mode、dir_mode等挂载选项。详情请参见Linux系统挂载SMB文件系统

如何变更SMB文件系统中文件名大小写?

SMB文件系统对文件名大小写不敏感,和Windows系统保持一致。但在文件名大小写改名这个场景暂时没有支持。

您可以先从大写文件名改成一个其它名字的文件,再改成小写文件名,反之亦然。

为什么不能改变文件owner,文件和目录mode?

现在暂时不支持动态改变,只能在挂载时指定。详情请参见Linux系统挂载SMB文件系统

并发访问同一文件时,服务器端出现无响应35s现象,该如何处理?

原因:当前Linux SMB内核驱动有缺陷,会造成在使用vers=2.1或者3.0挂载时,在某些并发场景不能发出服务器端期待的SMB BreakAck协议包,导致服务器端无响应35s。

解决方案一:挂载文件系统时,使用vers=2.0协议。

解决方案二:执行以下操作。
  1. 在加载CIFS模块时,禁用oplock,执行以下命令。

    # modprobe cifs enable_oplocks=0

  2. 当CIFS模块加载完成时,禁用oplocks,执行以下命令。

    # echo 0 > /sys/module/cifs/parameters/enable_oplocks

  3. 检查oplock的状态,执行以下命令。

    # cat /sys/module/cifs/parameters/enable_oplocks

    输出结果中,Y代表启用(enabled)。N代表禁用(disabled)。

    说明
    • 为了使以上的修改生效,请卸载并重新挂载SMB文件系统。
    • 如果您想使以上的修改永久生效,请创建文件/etc/modprobe.d/cifs.conf并添加命令行options cifs enable_oplocks=0

为什么SMB文件系统挂载点无响应?

原因:在Linux内核为3.10.0-514之前的Linux分发版中,SMB内核驱动在并发场景有时会crash(内核stack如下所示),导致挂载点无法被访问。内核日志中有如下类似信息:
...
[<ffffffffc03c9bc1>] cifs_oplock_break+0x1f1/0x270 [cifs]
[<ffffffff810a881a>] process_one_work+0x17a/0x440
[<ffffffff810a8d74>] rescuer_thread+0x294/0x3c0
...
解决方案:
  • 使用cache=none重新挂载(性能会受影响)。
  • 升级云服务器ECS(Linux)的操作系统。

如何解决Windows挂载NFS文件系统的报错?

  • 问题描述:无效文件句柄

    解决方法:请您按照正确步骤及参数配置重新挂载,详情请参见Windows系统挂载NFS文件系统

  • 问题描述:网络错误-53

    解决方法:请您按照正确步骤及参数配置重新挂载,详情请参见Mounting NFS on a Windows Client

  • 问题描述:网络错误-1222MISTAKE

    解决方法:请您安装NFS客户端之后,重新执行挂载操作。详情请参见安装NFS客户端

如何检查并解决Windows NFS soft挂载问题?

  • 问题描述
    在Windows系统上使用NFS文件系统时,默认使用soft模式进行挂载,而在某些场景下soft模式会对数据一致性造成影响,并且会造成应用异常退出。具体情况如下所示:
    • 数据一致性:使用soft模式挂载时,如果请求超时,则返回错误。对于应用,这个操作是未完成的;对于服务端,这个请求可能已经执行,所以会造成数据不一致。
    • 应用异常退出:使用soft模式挂载时,如果请求超时,则返回超时错误。在某些语言中,会抛出异常,如果应用未处理,则会异常退出。
  • 解决方法2
    在Windows系统中,使用hard模式挂载NFS文件系统,可以避免以上问题。
    1. 执行mount命令检查当前的挂载模式。
      • 如果显示mount=soft,则按照以下步骤进行整改。
      • 如果显示mount=hard,则无需整改。
    2. 停止当前正在使用此NFS文件系统的应用。
    3. 卸载NFS文件系统。
      umount H:
      请根据实际挂载盘符进行替换挂载命令中的盘符H:
    4. 重新挂载NFS文件系统。
      mount -o nolock -o mtype=hard -o timeout=60 \\xxxxxx.cn-hangzhou.nas.aliyuncs.com\! h:
      请根据实际情况替换挂载点地址xxxxxx.cn-hangzhou.nas.aliyuncs.com和挂载盘符h:
    5. 执行mount命令验证挂载结果。
      如果回显信息包括mount=hard、locking=no以及timeout的参数值>=10,则表示挂载成功。

如何避免多进程或多客户端并发写同一日志文件可能出现的异常?

  • 问题现象

    文件存储NAS为多客户端提供了统一名字空间的文件共享读写能力,但在多进程或多客户端并发写同一个文件的场景中(典型的例如并发写同一个日志文件),各进程分别维护了独立的文件描述符及写入位置等上下文信息,而NFS协议本身并没有提供Atomic Append语义的支持,因此可能会出现写覆盖、交叉、串行等异常现象。

  • 解决方案
    • (推荐)不同进程或不同客户端客户端写入同一文件系统的不同文件中,后续分析处理时再进行归并,这个方案能够很好地解决并发写入导致的问题,同时无需使用文件锁,不会对性能造成影响。
    • 对于并发追加写同一个文件(如日志)的场景,可以使用文件锁+seek机制来保证写入的原子性和一致性。但是文件锁+seek是一个比较耗时的操作,可能会对性能产生显著的影响。下面将对这种方式进行一个简单的介绍,以供参考。
  • flock+seek使用方法

    由于NFS协议本身没有提供对Atomic Append语义的支持,因此当并发写入同一文件末尾(如日志)时,很可能会出现相互覆盖的情况。在Linux中,通过使用flock+seek的方式,可以在NFS文件系统上做到模拟Atomic Append,对并发追加写入同一文件提供保护和支持。

    使用方式如下:
    1. 调用fd=open(filename, O_WRONLY | O_APPEND | O_DIRECT) 以追加写的方式打开文件,并且指定 O_DIRECT(直写,不通过 Page Cache),获得文件描述符fd。
    2. 调用flock(fd, LOCK_EX|LOCK_NB)尝试获取文件锁,如果获取失败(如锁已被占用)则会返回错误,此时可以继续重试或进行错误处理。
    3. 文件锁获取成功后,调用lseek(fd, 0, SEEK_END)将fd当前的写入偏移定位到文件末尾。
    4. 执行正常的write操作,此时写入位置应该是文件的末尾,并且由于有文件锁的保护,不会出现并发写入相互覆盖的问题。
    5. 写操作执行完成后,调用flock(fd, LOCK_UN) 释放文件锁。
    下面是一个简单的C语言示例程序:
    #define _GNU_SOURCE
    #include<stdlib.h>
    #include<stdio.h>
    #include<fcntl.h>
    #include<string.h>
    #include<unistd.h>
    #include<sys/file.h>
    #include<time.h>
    
    const char *OUTPUT_FILE = "/mnt/blog";
    int WRITE_COUNT = 50000;
    
    int do_lock(int fd)
    {
        int ret = -1;
        while (1)
        {
            ret = flock(fd, LOCK_EX | LOCK_NB);
            if (ret == 0)
            {
                break;
            }
            usleep((rand() % 10) * 1000);
        }
        return ret;
    }
    
    int do_unlock(int fd)
    {
        return flock(fd, LOCK_UN);
    }
    
    int main()
    {
            int fd = open(OUTPUT_FILE, O_WRONLY | O_APPEND | O_DIRECT);
            if (fd < 0)
            {
                    printf("Error Open\n");
                    exit(-1);
            }
            for (int i = 0; i < WRITE_COUNT; ++i)
            {
                    char *buf = "one line\n";
    
                    /* Lock file */
                    int ret = do_lock(fd);
                    if (ret != 0)
                    {
                            printf("Lock Error\n");
                            exit(-1);
                    }
    
                    /* Seek to the end */
                    ret = lseek(fd, 0, SEEK_END);
                    if (ret < 0)
                    {
                            printf("Seek Error\n");
                            exit(-1);
                    }
    
                    /* Write to file */
                    int n = write(fd, buf, strlen(buf));
                    if (n <= 0)
                    {
                            printf("Write Error\n");
                            exit(-1);
                    }
    
                    /* Unlock file */
                    ret = do_unlock(fd);
                    if (ret != 0)
                    {
                            printf("UnLock Error\n");
                            exit(-1);
                    }
            }
            return 0;
    }
                
    更详细的flock()使用方式请参见:http://www.hackinglinuxexposed.com/articles/20030616.html
    说明 在NAS文件系统上使用flock()需要您的Linux内核版本在2.6.12及以上,如果您的内核版本较低,请使用fcntl()调用。

为什么要使用noresvport参数挂载NAS?

如果发生网络切换或者后端服务的HA倒换,小概率会造成NFS文件系统阻塞,若发生则可能需要几分钟时间连接才会自动恢复,极端情况下甚至需要重启ECS才能恢复。使用noresvport参数后,仅需要几秒即可自动完成恢复。

如何检查并修改noresvport挂载参数问题?

说明 只适用于Linux系统的用户,Windows用户请忽略。
  1. 检查文件系统挂载是否使用noresvport挂载参数。
    1. 执行以下命令,在ECS(Linux)下载check_noresvport.py检查脚本。
      wget -N https://code.aliyun.com/nas_team/nas-client-tools/raw/master/linux_client/check_noresvport.py -P /tmp/
    2. 执行检查脚本,以下命令是以python为示例。
      python2.7 /tmp/check_noresvport.py
      如果检查脚本输出:本台ECS无须处理noresvport问题,则无须处理,其他情况请执行以下步骤进行修复。
  2. 修复noresvport参数。
    说明 建议在业务低峰进行修复。
    请根据实际挂载场景选择以下修复方法:
    • 如果使用ECS直接挂载NAS,请使用参数-r再次执行检查脚本。
      python2.7 /tmp/check_noresvport.py -r
    • 如果使用容器挂载NAS,请使用参数-c再次执行检查脚本。
      python2.7 /tmp/check_noresvport.py -c
  3. 更新自动挂载配置。
    • 如果配置过自动挂载,请更新自动挂载参数,加入noresvport挂载参数。详情请参见自动挂载NFS文件系统
    • 如果没有配置过自动挂载,跳过此步骤。
    修复完成后,请再次执行步骤1,确认修复生效。如果仍有问题请及时联系阿里云NAS团队(钉钉群号:23110762)。

什么情况会引发网络切换或者后端服务的HA倒换?

NAS服务是稳定的,网络切换或者后端服务的HA倒换都是罕见情况。后端服务升级会触发上述切换,但导致客户端阻塞的概率很低,并且在升级之前阿里云NAS团队会提前通知相关集群的用户,留出充足时间使用noresvport参数。其他可能引发切换的场景,还有负载均衡调整、服务端硬件故障等情况,有一定的不可预测性,所以即使服务端没有升级安排,也请尽快使用noresvport参数避免这样的风险。

为什么需要重新挂载?还有没有其他的方案?

需要重新挂载的原因是要把之前没有使用noresvport参数的TCP连接断开,然后使用noresvport参数挂载时,会建立新的TCP连接。为了把旧的TCP连接断开,就必须把NAS相关的业务都终止,然后执行umount卸载。

如果不希望重新挂载,可以考虑新建NAS挂载点,使用noresvport参数挂载到新的本地路径,然后把业务进程逐步迁移过去,最后废弃旧的挂载路径和挂载点。