mount --bind 并在挂载之间移动 2 个文件

And*_*nih 1 linux filesystems mount

我的应用程序架构要求我在同一分区挂载 2 个文件夹并在它们之间移动 2 个文件。我有以下坐骑:

/drive2/folder1 on /var/www/myapp/folder1 type none (rw,bind)
/drive2/folder2 on /var/www/myapp/folder2 type none (rw,bind)
Run Code Online (Sandbox Code Playgroud)

问题在于在 2 个文件夹/var/www/myapp/folder1/var/www/myapp/folder2. 1Gb 文件大约需要 10 秒:

mv /var/www/myapp/folder1/test /var/www/myapp/folder2/
Run Code Online (Sandbox Code Playgroud)

而且它还会产生高磁盘活动。但是,当我在/drive2/folder1和之间移动同一个文件时,移动/drive2/folder2它需要不到一秒钟的时间。

任何人都可以告诉我这个问题吗?

Zor*_*che 5

在文件系统之间移动时,文件被复制到目标,然后在源上删除。在本地文件系统上移动时,只更新文件系统表,这花费的时间要少得多。显然,对于绑定安装, 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
......
Run Code Online (Sandbox Code Playgroud)

其他文件夹 1 和文件夹 2 实际上在同一个文件系统上,重命名系统调用失败,错误报告目的地在不同的设备上。除了修改内核和/或核心库之外,我怀疑您可以做很多事情来改变这一点。