Centos

在 RHEL/CentOS 7 中, mv 實際上是否在同一個文件系統上執行 cp 和 rm ?

  • March 4, 2017

根據前面兩個 問題的答案,似乎在 RHEL/CentOS 7 下,mv即使在同一個文件系統上實際上也是在做一個cpthen rm.

在以前的 CentOS/RHEL 版本中,mv即使在大文件(例如安裝媒體或大型影片的集合)上,同一文件系統(甚至從深層目錄到新的深層目錄)的速度也非常快。

但是,在我的個人 CentOS 伺服器上,當查看mv移動大文件時實際執行的操作時,它所花費的時間cprm.

這讓我想知道為什麼行為顯然已經從包裝器變為rename()(根據POSIX標準)。

它是否正確?而且,如果是這樣,為什麼該mv實用程序會改變 CentOS 7 中的行為?

CentOS 7.2mv命令將嘗試使用該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()呼叫,並且只有在失敗時才回退到慢速版本。

引用自:https://unix.stackexchange.com/questions/305270