Centos
在 RHEL/CentOS 7 中, mv 實際上是否在同一個文件系統上執行 cp 和 rm ?
根據前面兩個 問題的答案,似乎在 RHEL/CentOS 7 下,
mv
即使在同一個文件系統上實際上也是在做一個cp
thenrm
.在以前的 CentOS/RHEL 版本中,
mv
即使在大文件(例如安裝媒體或大型影片的集合)上,同一文件系統(甚至從深層目錄到新的深層目錄)的速度也非常快。但是,在我的個人 CentOS 伺服器上,當查看
mv
移動大文件時實際執行的操作時,它所花費的時間cp
與rm
.這讓我想知道為什麼行為顯然已經從包裝器變為
rename()
(根據POSIX標準)。它是否正確?而且,如果是這樣,為什麼該
mv
實用程序會改變 CentOS 7 中的行為?
CentOS 7.2
mv
命令將嘗試使用該rename(3)
呼叫。例如,如果我這樣做,
strace mv X Y
那麼我會在輸出中看到rename("X", "Y") = 0
所以我們可以看到
mv
成功呼叫了rename。相反,如果我嘗試將此目錄重命名為另一個磁碟:
rename("X", "/home/sweh/X") = -1 EXDEV (Invalid cross-device link)
我們可以看到
mv
嘗試使用該rename()
呼叫但失敗了。此時它開始做遞歸工作rmdir("/home/sweh/X") = -1 ENOENT (No such file or directory) mkdir("/home/sweh/X", 0700) = 0 lstat("/home/sweh/X", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0 openat(AT_FDCWD, "X", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 getdents(3, /* 2 entries */, 32768) = 48
在這裡我們可以看到它已經製作了目標目錄,然後開始讀取目前目錄進行慢複製/刪除。
因此我們可以得出結論,
mv
它將嘗試使用快速rename()
呼叫,並且只有在失敗時才回退到慢速版本。