我的应用程序体系结构要求我在同一分区上挂载2个文件夹,并在它们之间移动2个文件。 我有以下坐骑:
/drive2/folder1 on /var/www/myapp/folder1 type none (rw,bind) /drive2/folder2 on /var/www/myapp/folder2 type none (rw,bind)
问题是在2个文件夹/var/www/myapp/folder1和/var/www/myapp/folder2之间移动文件。 1Gb文件大约需要10秒钟:
mv /var/www/myapp/folder1/test /var/www/myapp/folder2/
而且它也会产生很高的磁盘活动。 但是,当我在/drive2/folder1和/drive2/folder2之间移动同一个文件时,移动它不到/drive2/folder2 。
任何人都可以提出这个问题吗?
在文件系统之间移动时,文件被复制到目的地,然后在源上被删除。 在本地文件系统上移动时,只有文件系统表被更新,这需要更less的时间。 显然,使用绑定挂载,mv将这两点视为单独的文件系统。
我在本地系统上设置了一个类似的坐骑,然后运行文件strace mv folder1/1gb folder2/ 。
lstat("folder1/1gb", {st_mode=S_IFREG|0644, st_size=1000000000, ...}) = 0 lstat("folder2/1gb", 0x7fff30fd1e20) = -1 ENOENT (No such file or directory) rename("folder1/1gb", "folder2/1gb") = -1 EXDEV (Invalid cross-device link) unlink("folder2/1gb") = -1 ENOENT (No such file or directory) open("folder1/1gb", O_RDONLY|O_NOFOLLOW) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=1000000000, ...}) = 0 open("folder2/1gb", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4 fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768 write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32768) = 32768 ......
其他文件夹1和文件夹2实际上位于同一文件系统中,重命名系统调用失败,并报告目标位于单独的设备上。 在修改内核和/或核心库之后,我怀疑你可以做些改变。
我假设你需要单独绑定安装这些文件夹,因为/ drive2上有其他文件夹,并且由于使用了类似chroot的东西,你的应用程序不能使用符号链接。
如果您可以在/ drive2和folder1和folder2之间添加其他目录,则可以在不降低性能的情况下实现同样的目的。 那么你只需要绑定挂载一个文件夹。
$ ls /drive2/myapp folder1 folder2
然后你的绑定挂载将是
/drive2/myapp on /var/www/myapp/myapp type none (rw,bind)
现在你的动作会再次瞬间完成
mv /var/www/myapp/myapp/folder1/test /var/www/myapp/myapp/folder2/