CIFS 挂载中出现奇怪的文件截断问题

CIFS 挂载中出现奇怪的文件截断问题

参考:https://stackoverflow.com/questions/12211629/php-file-put-contents-not-truncating-file-in-cifs-mount

我们有一台 Seagate BlackArmor NAS 设备,它安装在我们的 Ubuntu 10.04 服务器上,如下所示:

mount -t cifs -o defaults,credentials=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir_mode=0770,file_mod=0660 //xxx.xxx.xxx.xxx/demo/files /var/www/mysite/src/files/

似乎任何旨在截断文件然后将内容插入 NAS 上的这些文件的操作最终都只会替换文件的前几个字节(直到新内容的长度),然后其余的先前“旧”内容仍然在文件中。

例如:

myfile.txt的内容:thisisabigfatpandaonwheelsgoingdownthestreet

使用代码运行PHP脚本:file_put_contents('myfile.txt', 'blah');

myfile.txt的内容:blahisabigfatpandaonwheelsgoingdownthestreet

文件的预期内容显然是blah,但事实并非如此。

fwrite()在创建文件句柄后使用 PHPfopen('filename', 'w');会产生同样的效果。ftruncate()也无法正常工作。 使用诸如的 shell 命令echo -n "blah" > myfile.txt会产生同样的效果(这就是我知道这不是 PHP 特有的问题的原因)。

我目前唯一的解决方法是删除文件,然后从头开始创建它们,但如果可能的话,我宁愿不更改应用程序中的任何代码(我们最近才开始使用 NAS 设备)。我宁愿对看似与操作系统相关/安装相关的问题应用解决方案。

有任何想法吗?

答案1

我在自己的 Samba 设置上遇到了完全相同的症状(Debian 6 x64 和 Samba 3.5.6)。我最终将问题缩小到以下导致完全相同行为的选项:

large readwrite = no

当设置为yes代替(或删除,因为“是”是默认设置)时,问题就消失了。

针对 Debain 和上游 Samba 提交的错误报告:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=699461
https://bugzilla.samba.org/show_bug.cgi?id=9622

相关内容