当您访问文件系统中的文件时,文件系统中的文件会受到某些限制影响,导致文件操作错误、挂载点无响应或访问无响应等。您可以在本文中查找一些常见文件操作错误、文件属主、数据不同步或访问无响应的解决方案。
交叉挂载兼容性问题
Linux挂载SMB协议文件系统常见兼容性问题
并发访问同一文件时,服务器端出现无响应35s现象,该如何处理?
为什么无法创建符号链接文件?
为什么SMB协议文件系统挂载点无响应?
拷贝大文件时报"cp: error writing 'o/file>': Bad file descriptor",该如何处理?
Windows挂载NFS协议的通用型NAS文件系统兼容性问题
为什么写入文件系统的中文字符在客户端显示为乱码?
为什么Windows挂载NFS协议文件系统创建和打开文件时速度缓慢?
如何解决Windows客户端对NFS协议文件系统中的文件重命名时返回的invalid device错误?
其他读写文件问题
如何解决在NFS协议文件系统中创建文件延迟问题?
如何解决向NFS协议文件系统中写入数据延迟问题?
为什么两台ECS实例在查询NAS文件系统中同一文件时,文件的属主不同?
如何避免多进程或多客户端并发写同一日志文件可能出现的异常?
使用Linux操作系统在NFS协议文件系统中执行ls命令时,为什么会返回523错误?
为什么SMB协议文件系统挂载有时候连接不上?
为什么Administrator能看见挂载的SMB目录,其他用户看不到?
如何解决Linux挂载SMB协议文件系统性能不佳?
Linux访问SMB协议文件系统时,报Permission denied错误,该怎么解决?
如何变更SMB协议文件系统中文件名大小写?
为什么不能改变文件owner,文件和目录mode?
后缀为.nfs的文件是怎么产生的?如何删除?
访问NAS文件系统目录下的文件时,返回bind conn to session failed on NFSv4 server该如何解决?
如何处理多个ECS实例挂载同一NFS协议文件系统出现数据不同步的情况?
为什么卸载旧NAS并重新挂载新NAS后,容器Pod仍将数据写入旧NAS?
服务器重启或停机后,为什么NAS里的文件看不到了?
为什么Linux挂载SMB协议文件系统迁移和复制文件时速度缓慢?
为什么向文件系统写入数据时,返回Disk quota exceeded错误信息?
如何解决访问NFS协议文件系统时,返回无访问权限问题?
能否通过执行chown修改NAS根目录权限?
并发访问同一文件时,服务器端出现无响应35s现象,该如何处理?
原因:当前Linux SMB内核驱动有缺陷,会造成在使用vers=2.1或者3.0挂载时,在某些并发场景不能发出服务器端期待的SMB BreakAck协议包,导致服务器端无响应35s。
解决方案一:挂载文件系统时,使用vers=2.0协议。
解决方案二:执行以下操作。
在加载CIFS模块时,禁用oplocks,执行以下命令。
# modprobe cifs enable_oplocks=0
当CIFS模块加载完成时,禁用oplocks,执行以下命令。
# echo 0 > /sys/module/cifs/parameters/enable_oplocks
检查oplocks的状态,执行以下命令。
# cat /sys/module/cifs/parameters/enable_oplocks
输出结果中,Y代表启用(enabled)。N代表禁用(disabled)。
说明为了使以上的修改生效,请卸载并重新挂载SMB协议文件系统。
如果您想使以上的修改永久生效,请创建文件
/etc/modprobe.d/cifs.conf
并添加命令行options cifs enable_oplocks=0
。
为什么无法创建符号链接文件?
问题原因
Linux挂载SMB协议文件系统时没有选择mfsymlinks选项,或者使用了2.0协议版本挂载。
解决方案
Linux挂载SMB协议文件系统时,使用2.1或3.0协议版本并添加mfsymlinks选项。挂载命令示例如下,示例中的参数说明,请参见SMB(Linux)挂载命令参数说明。
sudo mount -t cifs //file-system-id.region.nas.aliyuncs.com/myshare /mnt -o vers=2.1,guest,uid=0,gid=0,dir_mode=0755,file_mode=0755,mfsymlinks,cache=strict,rsize=1048576,wsize=1048576
为什么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)的操作系统。
拷贝大文件时报"cp: error writing '</path/to/file>': Bad file descriptor",该如何处理?
问题原因
网络或者后端有临时小故障发生,某些Linux分发版(如Suse)的SMB客户端功能较弱,不能很好的支持这种故障切换。
解决方案
建议选用NAS SMB推荐的Linux版本,NAS SMB支持的Linux操作系统版本如下表所示:
操作系统类型 | 操作系统版本 |
CentOS | CentOS 7.6 64位:3.10.0-957.21.3.el7.x86_64及以上 |
Alibaba Cloud Linux | Alibaba Cloud Linux 2.1903 64位:4.19.43-13.2.al7.x86_64及以上 |
Debian | Debian 9.10 64位:4.9.0-9-amd64及以上 |
Ubuntu | Ubuntu 18.04 64位:4.15.0-52-generic及以上 |
OpenSUSE | OpenSUSE 42.3 64位:4.4.90-28-default及以上 |
SUSE Linux | Enterprise Server 12 SP2 64位:4.4.74-92.35-default及以上 |
CoreOS | CoreOS 2079.4.0 64位:4.19.43-coreos及以上 |
为什么写入文件系统的中文字符在客户端显示为乱码?
问题现象
在Linux或Windows客户端向NAS文件系统写入的中文字符(文件名、内容等)在另一个平台客户端显示为乱码。
问题原因
Windows客户端中文编解码默认使用GBK字符集,Linux客户端中文编解码默认使用UTF-8字符集,写入NAS文件系统的数据为平台对应字符集编码后的内容。在另一平台读取时需要进行解码,因为两个平台字符集并不兼容,故无法正常解码,导致显示内容为不可识别的乱码。
解决方案
建议您使用Windows客户端挂载SMB协议NAS文件系统,Linux客户端挂载NFS协议文件系统,从而规避平台不兼容问题。
为什么Windows挂载NFS协议文件系统创建和打开文件时速度缓慢?
问题原因
Windows上使用NFS协议实例,会存在大小写敏感和大小写不敏感的兼容性问题,在目录里创建文件的性能随着目录规模增大而明显下降,原因是每次创建一个文件都需要对目录进行遍历,当目录规模达到10万级别时,目录遍历一次需要10秒钟以上。
解决方案
修改挂载参数,增加-o casesensitive=yes
字段,避免目录遍历。挂载命令如下所示:
mount -o nolock -o mtype=hard -o timeout=60 -o casesensitive=yes \\file-system-id.region.nas.aliyuncs.com\! Z:
请根据实际情况替换盘符Z
和挂载点地址file-system-id.region.nas.aliyuncs.com
。
启用大小写敏感选项和windows的原生语义是冲突的,使用上需要保证NFS目录中不出现因为大小写出现名字冲突(例如,同时出现a.txt和A.TXT),修改挂载参数可能会有不确定的影响,建议使用SMB NAS。
如何解决Windows客户端对NFS协议文件系统中的文件重命名时返回的invalid device
错误?
如果NFS协议文件系统是挂载在文件系统的子目录上,当执行文件重命名操作时,会返回的invalid device
错误,请您将文件系统挂载在文件系统的根目录上。具体操作,请参见步骤二:挂载NFS协议的通用型NAS文件系统。
如何解决在NFS协议文件系统中创建文件延迟问题?
问题现象:
ECS-1创建了文件abc,但是ECS-2需要过一段时间才能看到ECS-1创建的文件abc,有时会延迟1s,有时甚至会到1分钟,这是为什么?
问题原因:
这是Lookup Cache导致的,符合预期T时间。例如,ECS-2在ECS-1创建文件abc前进行了访问,导致ECS-2发生文件不存在,于是缓存了一条文件abc不存在的记录。在T时间内,由于FileAttr还没有过期,ECS-2再次访问时,仍会访问第一次缓存到文件abc不存在的记录。
解决方案:
如果要保证ECS-1创建文件后,ECS-2立即就能看到它,可以使用如下方案:
方案一:关闭ECS-2的Negative Lookup Cache,不缓存不存在的文件。该方案开销最小。
挂载时,添加lookupcache=positive(默认值lookupcache=all)字段,挂载命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,lookupcache=positive file-system-id.region.nas.aliyuncs.com:/ /mnt
方案二:关闭ECS-2的所有缓存。该方案会导致性能非常差,请根据业务实际情况选择合适的方案。
挂载时,添加actimeo=0字段,挂载命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,actimeo=0 file-system-id.region.nas.aliyuncs.com:/ /mnt
如何解决向NFS协议文件系统中写入数据延迟问题?
问题现象:
ECS-1更新了文件abc,但是ECS-2立即去读它,仍然是旧的内容,这是为什么?
问题原因:
涉及如下两个原因。
第一个原因:ECS-1写了abc后,不会立即flush,会先进行PageCache,依赖应用层调用fsync或者close。
第二个原因:ECS-2存在文件Cache,可能不会立即去服务端取最新的内容。例如,ECS-2在ECS-1更新文件abc之时,就已经缓存了数据,当ECS-2再次去读时,仍然使用了缓存中的内容。
解决方案:
如果要保证ECS-1创建文件后,ECS-2立即就能看到它,可以使用如下方案:
方案一:CTO一致性,让ECS-1或ECS-2的读写符合CTO模式,则ECS-2一定能读到最新数据。具体来说,ECS-1更新文件后,一定要执行close或者执行fsync。ECS-2读之前,重新open,然后再去读。
方案二:关闭ECS-1和ECS-2的所有缓存。该方案会导致性能非常差,请根据业务实际情况选择合适的方案。
关闭ECS-1的缓存。挂载时,添加noac字段,保证所有写入立即落盘。挂载命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,noac file-system-id.region.nas.aliyuncs.com:/ /mnt
说明如果ECS-1的写操作完成后会调用fsync,或者使用sync写,可以将上面的noac替换为actimeo=0,性能会稍好一点。
noac等价于
actimeo=0
加sync(即,强制所有写入都为sync写)。
关闭ECS-2的缓存。挂载时,添加actimeo=0字段,忽略所有缓存。挂载命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,actimeo=0 file-system-id.region.nas.aliyuncs.com:/ /mnt
为什么两台ECS实例在查询NAS文件系统中同一文件时,文件的属主不同?
在文件系统中,标识用户身份的不是用户名,而是UID或GID,您在ECS实例查询的属主用户名是由UID信息转换得到的,当同一UID在不同ECS实例中信息转换为不同的用户名,则会被认为是不同的属主。
例如,在ECS实例1中使用admin用户创建文件admin_on_machine1,在ECS实例2中使用admin用户创建文件admin_on_machine2。在ECS实例1中执行ll命令,查看已创建的文件,如下图所示:在ECS实例2中执行ll命令,查看已创建的文件,如下图所示:
通过两台ECS实例查询可以看到,同一文件的属主用户名不一致。
然后,分别执行id命令,查询admin用户信息。如下图所示ECS实例1中admin用户的UID为505:如下图所示ECS实例2中admin用户的UID为2915:
如下图所示执行
stat admin_on_machine1 admin_on_machine2
命令,查询到两个文件属于不同的UID:
如何避免多进程或多客户端并发写同一日志文件可能出现的异常?
问题现象
文件存储NAS为多客户端提供了统一命名空间的文件共享读写能力,但在多进程或多客户端并发写同一个文件的场景中(典型的例如并发写同一个日志文件),各进程分别维护了独立的文件描述符及写入位置等上下文信息,而NFS协议本身并没有提供Atomic Append语义的支持,因此可能会出现写覆盖、交叉、串行等异常现象。
解决方案
(推荐)不同进程或不同客户端写入同一文件系统的不同文件中,后续分析处理时再进行归并,这个方案能够很好地解决并发写入导致的问题,同时无需使用文件锁,不会对性能造成影响。
对于并发追加写同一个文件(如日志)的场景,可以使用文件锁+seek机制来保证写入的原子性和一致性。但是文件锁+seek是一个比较耗时的操作,可能会对性能产生显著的影响。下面将对这种方式进行一个简单的介绍,以供参考。
flock+seek使用方法
由于NFS协议本身没有提供对Atomic Append语义的支持,因此当并发写入同一文件末尾(如日志)时,很可能会出现相互覆盖的情况。在Linux中,通过使用flock+seek的方式,可以在NFS协议文件系统上做到模拟Atomic Append,对并发追加写入同一文件提供保护和支持。
使用方式如下:
调用fd=open(filename, O_WRONLY | O_APPEND | O_DIRECT) 以追加写的方式打开文件,并且指定 O_DIRECT(直写,不通过 Page Cache),获得文件描述符fd。
调用flock(fd, LOCK_EX|LOCK_NB)尝试获取文件锁,如果获取失败(如锁已被占用)则会返回错误,此时可以继续重试或进行错误处理。
文件锁获取成功后,调用lseek(fd, 0, SEEK_END)将fd当前的写入偏移定位到文件末尾。
执行正常的write操作,此时写入位置应该是文件的末尾,并且由于有文件锁的保护,不会出现并发写入相互覆盖的问题。
写操作执行完成后,调用flock(fd, LOCK_UN)释放文件锁。
使用Linux操作系统在NFS协议文件系统中执行ls
命令时,为什么会返回523
错误?
问题现象
Linux客户端在NFS协议文件系统中执行ls
命令时,返回如下报错信息。
原因分析
对文件系统目录下执行ls
时,该目录有并发的rename
操作,则会返回523
错误。
解决方案
稍等重试即可。如果还出现类似报错,请联系NAS技术支持进行咨询。
为什么SMB协议文件系统挂载有时候连接不上?
问题现象
当您混用NFS和SMB协议文件系统,导致第一次通过net use命令挂载NFS协议文件系统连接失败后,挂载正确的SMB协议文件系统也会出现问题。
解决方案
检查确保挂载正确的文件系统后,暂时停止挂载,5分钟后再次挂载。如果还失败,请联系NAS技术支持进行咨询。
为什么Administrator能看见挂载的SMB目录,其他用户看不到?
该现象是由于Windows的用户隔离机制造成的。即一个登录用户的已挂载目录在另一个用户的登录界面中不会显示。
要实现多用户的共享,需要创建一个目录链接。比如C盘下创建一个myshare,命令如下:
mklink /D C:\myshare \\xxxxxxx-xxxx.cn-beijing.nas.aliyuncs.com\myshare\
如何解决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协议文件系统时,报Permission denied错误,该怎么解决?
原因:Linux管理员在挂载时使用了不正确的UID、GID、file_mode、dir_mode。
解决方案:检查是否正确设置了UID、GID、file_mode、dir_mode等挂载选项。更多信息,请参见挂载SMB协议文件系统。
如何变更SMB协议文件系统中文件名大小写?
SMB协议文件系统对文件名大小写不敏感,和Windows系统保持一致。但在文件名大小写改名这个场景暂时没有支持。
您可以先从大写文件名改成一个其它名字的文件,再改成小写文件名,反之亦然。
为什么不能改变文件owner,文件和目录mode?
现在暂时不支持动态改变,只能在挂载时指定。更多信息,请参见挂载SMB协议文件系统。
后缀为.nfs的文件是怎么产生的?如何删除?
在应用程序已经打开某文件时,如果删除该文件,则会产生后缀为.nfs
的临时文件。当访问进程关闭后,该临时文件将自动被删除。
访问NAS文件系统目录下的文件时,返回bind conn to session failed on NFSv4 server该如何解决?
问题原因
由于文件存储NAS不支持NFSv4.1协议,当您使用NFSv4.1协议挂载文件系统时产生该报错。
解决方案
请您根据业务场景选择使用NFSv3或NFSv4.0协议重新挂载文件系统。更多信息,请参见挂载文件系统场景说明。
如何处理多个ECS实例挂载同一NFS协议文件系统出现数据不同步的情况?
问题现象
NAS在多挂载点的情况下,不同客户端进行实时同步时存在较长时间延迟的问题。
问题原因
操作系统kernel默认对文件和目录的属性进行维护,将其生成一份metadata缓存,以减少NFSPROC_GETATTR远程过程调用的需求。
解决方案
执行以下挂载命令,禁用文件和目录属性的缓存。
mount -t nfs4 -o noac file-system-id.region.nas.aliyuncs.com:/ /mnt
其中,file-system-id.region.nas.aliyuncs.com
为文件系统挂载点地址,请根据实际值替换;/mnt
:当前服务器上待挂载的本地路径,请根据实际情况替换路径。
为什么卸载旧NAS并重新挂载新NAS后,容器Pod仍将数据写入旧NAS?
问题原因
将NAS挂载到ECS并通过本地存储卷(HostPath)映射的方式将NAS的挂载目录映射到容器时,容器中的挂载信息独立于ECS,ECS后续对NAS挂载目录进行卸载或者挂载新NAS时,已经启动的容器仍然会使用其启动时挂载的旧NAS。
解决方案
在ECS上重新挂载新NAS后,重启容器Pod。
服务器重启或停机后,为什么NAS里的文件看不到了?
如果文件系统仍存在,此原因一般是服务器未配置自动挂载NAS。
如何手动再次挂载NAS请参考挂载文件系统场景说明。
如需实现重启后NAS自动挂载功能,请参考以下文档:
Linux系统自动挂载NFS协议文件系统
Windows系统自动挂载SMB协议文件系统
为什么Linux挂载SMB协议文件系统迁移和复制文件时速度缓慢?
如果已经排除了文件系统本身的性能问题,则可能原因是您没有使用并发式迁移或复制文件。您可以通过以下开源工具进行迁移或复制。
GNU Parallel
根据系统资源,选择合适的线程数。示例:
find * -type f | parallel --will-cite -j 10 cp {} /mnt/smb/ &
Fpart
Fpsync
multi
为什么向文件系统写入数据时,返回Disk quota exceeded错误信息?
问题原因
目标目录的使用量或文件数超过了设定的用户配额限制,因此导致写入操作(包括增加文件长度、创建文件、目录、移动文件到目录等操作)失败,返回类似
Disk quota exceeded
的错误信息。解决方案
建议您尽快清理数据释放空间,或者提升该目录的容量限制。具体操作,请参见编辑单条用户配额。
清理完成后,建议先对配额的目录执行测试性的写操作(例如,创建并写数据到测试文件)来触发配额缓存的异步刷新,判断这些测试性写操作能够成功,然后再重新启动业务。
如何解决访问NFS协议文件系统时,返回无访问权限问题?
您可参照以下操作步骤为系统配置AnonymousGID和AnonymousUID。
登录挂载文件系统的ECS服务器。
打开命令提示符,执行
regedit
命令,进入注册表编辑器页面。选择 。
右击空白处,选择 ,并创建以下两个注册表项。
AnonymousGID,值为0。
AnonymousUID,值为0。
重启ECS实例。
重新挂载NFS协议的通用型NAS文件系统。
mount -o nolock -o mtype=hard -o timeout=60 \\file-system-id.region.nas.aliyuncs.com\! Z:
请根据实际情况替换盘符
Z:
和挂载点域名file-system-id.region.nas.aliyuncs.com
。执行
mount
检查是否挂载成功。挂载完成后,回显信息必须包括mount=hard、locking=no以及timeout参数>=10,否则说明挂载有问题。
能否通过执行chown修改NAS根目录权限?
当前不允许用户修改NAS根目录权限。
如果您希望控制本地挂载的NAS目录的权限,可以考虑使用子目录挂载的方式。例如,如果将NAS根目录挂载到本地的/data
目录,将无法通过chown
修改/data
目录的属主和属组。如果将NAS子目录(需提前创建)挂载到本地的/data
目录,即可以通过chown
修改/data
目录的属主和属组。需要注意的是,在NAS中创建子目录时,仍需要先挂载NAS根目录后创建。关于如何创建子目录并完成挂载,请参见如何在Linux系统中创建NAS子目录并完成挂载?。