将文件从本地磁盘移动到NFS挂载磁盘时,我收到Invalid argument
警告。尽管出现错误消息,已成功移动文件:
Warning: rename(/tmp/image.jpg,/mnt/remote.server-disk1/image.jpg): Invalid argument
已安装的磁盘:
$ df
remote.server:/disk1 917G 269M 871G 1% /mnt/remote.server-disk1
远程服务器上导出的磁盘:
$ cat /etc/exports
/disk1 remote.server(rw,sync,root_squash,secure,crossmnt,anonuid=504,anongid=504)
重命名()之前本地磁盘上的文件:
$ stat /tmp/image.jpg
File: `image.jpg'
Size: 2105 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 33556339 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 501/ apache) Gid: ( 501/ apache)
...
重命名()后远程磁盘上的文件:
$ stat /disk1/image.jpg
File: `image.jpg'
Size: 2105 Blocks: 8 IO Block: 4096 regular file
Device: 821h/2081d Inode: 34603214 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 501/ apache) Gid: ( 501/ apache)
...
有什么想法吗? 感谢
答案 0 :(得分:7)
在Unix
中,您无法在 文件系统 之间重命名或移动,相反,您必须将文件从 源位置 复制到目标位置,然后删除资源。这将解释您收到的错误消息。然而,似乎还不清楚为什么它仍然采取行动。这可能与权限有关,或者NFS挂载磁盘是本地缓存的。
答案 1 :(得分:2)
可能有点晚了,但我认为答案可能是因为链接到目标文件系统的权限。
我们遇到了同样的问题,strace 为我们提供了正确的诊断:
strace php -r "rename('SOURCE_FILE', 'DST_FILE');";
...
chown("SOURCE_FILE", 0, 0) = -1 EINVAL (Invalid argument)
write(2, "PHP Warning: rename(SOURCE_FILE"..., 192PHP Warning: rename(SOURCE_FILE): Invalid argument in Command line code on line 1
) = 192
write(1, "bool(false)\n", 12bool(false)
在我们的例子中,目标文件系统是版本 4 的 NFS,并且启用了 idmap。
即使是简单的
chown $(whoami) $DST_FILE
无法正常工作。
使用 nfs-common utils 启用 idmap 是默认行为(至少在 debian 下)。 因此,即使您使用复制 + 取消链接来修复它(顺便说一下,这是最好的方法),它仍然可能隐藏底层文件系统中的问题。
(禁用 idmap :https://forums.aws.amazon.com/thread.jspa?threadID=235501)
答案 2 :(得分:0)
也许是因为你这样做没有引号
rename(/tmp/image.jpg,/mnt/remote.server-disk1/image.jpg);
尝试添加引号
rename('/tmp/image.jpg', '/mnt/remote.server-disk1/image.jpg');
答案 3 :(得分:0)
我无法解决这个问题,但复制()然后取消链接()工作没有错误。